diff --git a/website/static/security/advisories/FreeBSD-EN-24:01.tzdata.asc b/website/static/security/advisories/FreeBSD-EN-24:01.tzdata.asc
new file mode 100644
index 0000000000..91d9cb0447
--- /dev/null
+++ b/website/static/security/advisories/FreeBSD-EN-24:01.tzdata.asc
@@ -0,0 +1,191 @@
+-----BEGIN PGP SIGNED MESSAGE-----
+Hash: SHA512
+
+=============================================================================
+FreeBSD-EN-24:01.tzdata Errata Notice
+ The FreeBSD Project
+
+Topic: Timezone database information update
+
+Category: contrib
+Module: zoneinfo
+Announced: 2024-02-14
+Affects: All supported versions of FreeBSD
+Corrected: 2024-02-05 00:30:01 UTC (stable/14, 14.0-STABLE)
+ 2024-02-14 06:21:06 UTC (releng/14.0, 14.0-RELEASE-p5)
+ 2024-02-05 00:30:42 UTC (stable/13, 13.2-STABLE)
+ 2024-02-14 06:27:47 UTC (releng/13.2, 13.2-RELEASE-p10)
+
+For general information regarding FreeBSD Errata Notices and Security
+Advisories, including descriptions of the fields above, security
+branches, and the following sections, please visit
+.
+
+I. Background
+
+The IANA Time Zone Database (often called tz or zoneinfo) contains code and
+data that represent the history of local time for many representative
+locations around the globe. It is updated periodically to reflect changes
+made by political bodies to time zone boundaries, UTC offsets, and
+daylight-saving rules.
+
+Leap seconds are occasional adjustments added to -- or potentially subtracted
+from -- Coordinated Universal Time (UTC). An authoritative list of leap
+second adjustments is maintained by the International Earth Rotation and
+Reference Systems Service (IERS).
+
+FreeBSD releases install the IANA Time Zone Database in /usr/share/zoneinfo.
+The tzsetup(8) utility allows the user to specify the default local time
+zone. Based on the selected time zone, tzsetup(8) copies one of the files
+from /usr/share/zoneinfo to /etc/localtime. A time zone may also be selected
+for an individual process by setting its TZ environment variable to a desired
+time zone name.
+
+The latest list of leap seconds at the time of release is installed on FreeBSD
+in /var/db/ntpd.leap-seconds.list. The startup rc(8) scripts of the ntpd(8)
+Network Time Protocol implementation included in the FreeBSD base system can
+periodically download an updated leap-seconds.list file from configurable
+internet sites.
+
+II. Problem Description
+
+Several changes to future and past timestamps have been recorded in the IANA
+Time Zone Database after previous FreeBSD releases were released. This
+affects many users in different parts of the world. Because of these
+changes, the data in the zoneinfo files need to be updated. If the local
+timezone on the running system is affected, tzsetup(8) needs to be run to
+update /etc/localtime.
+
+In the default configuration, the ntpd(8) startup script included with FreeBSD
+checks for an updated leap-seconds.list on the IETF's web server. As of 2023,
+the IETF no longer distributes a copy of this file.
+
+III. Impact
+
+An incorrect time will be displayed on a system configured to use one of the
+affected time zones if the /usr/share/zoneinfo and /etc/localtime files are
+not updated, and all applications on the system that rely on the system time,
+such as cron(8) and syslog(8), will be affected.
+
+With the default configuration, FreeBSD systems cannot file updates to the
+installed leap-seconds.list file. Since no leap second was introduced at the
+end of 2023, the leap-seconds.list file included with all supported FreeBSD
+releases is still accurate. Moreover, ntpd(8) is able to receive updated leap
+second information from its peers. However, a diagnostic warning about an
+expired leap-seconds.list is printed at startup.
+
+IV. Workaround
+
+The system administrator can install an updated version of the IANA Time Zone
+Database from the misc/zoneinfo port and run tzsetup(8).
+
+Applications that store and display times in Coordinated Universal Time (UTC)
+are not affected.
+
+The ntpd(8) startup script can be configured to download an updated
+leap-seconds.list file from IERS with the following rc.conf(5) setting:
+
+ntp_leapfile_sources="https://hpiers.obspm.fr/iers/bul/bulc/ntp/leap-seconds.list"
+
+Larger sites, or sites without reliable connectivity to the internet, may wish
+to point to their locally maintained copy of this file.
+
+V. Solution
+
+Upgrade your system to a supported FreeBSD stable or release / security
+branch (releng) dated after the correction date.
+
+Please note that some third party software, for instance PHP, Ruby, Java,
+Perl and Python, may be using different zoneinfo data sources, in such cases
+this software must be updated separately. Software packages that are
+installed via binary packages can be upgraded by executing 'pkg upgrade'.
+
+Following the instructions in this Errata Notice will only update the IANA
+Time Zone Database installed in /usr/share/zoneinfo.
+
+Perform one of the following:
+
+1) To update your system via a binary patch:
+
+Systems running a RELEASE version of FreeBSD on the amd64 or arm64 platforms,
+or the i386 platform on FreeBSD 13, can be updated via the freebsd-update(8)
+utility:
+
+# freebsd-update fetch
+# freebsd-update install
+
+Restart all the affected applications and daemons, or reboot the system.
+
+2) To update your system via a source code patch:
+
+The following patches have been verified to apply to the applicable
+FreeBSD release branches.
+
+a) Download the relevant patch from the location below, and verify the
+detached PGP signature using your PGP utility.
+
+# fetch https://security.FreeBSD.org/patches/EN-24:01/tzdata-2024a.patch
+# fetch https://security.FreeBSD.org/patches/EN-24:01/tzdata-2024a.patch.asc
+# gpg --verify tzdata-2024a.patch.asc
+
+b) Apply the patch. Execute the following commands as root:
+
+# cd /usr/src
+# patch < /path/to/patch
+
+c) Recompile the operating system using buildworld and installworld as
+described in .
+
+Restart all the affected applications and daemons, or reboot the system.
+
+VI. Correction details
+
+This issue is corrected as of the corresponding Git commit hash in the
+following stable and release branches:
+
+Branch/path Hash Revision
+- -------------------------------------------------------------------------
+stable/14/ 26fe22019cb2 stable/14-n266642
+releng/14.0/ a3b7bafd2acc releng/14.0-n265409
+stable/13/ f4256acec1c9 stable/13-n257384
+releng/13.2/ 66bb668fe5f2 releng/13.2-n254660
+- -------------------------------------------------------------------------
+
+Run the following command to see which files were modified by a
+particular commit:
+
+# git show --stat
+
+Or visit the following URL, replacing NNNNNN with the hash:
+
+
+
+To determine the commit count in a working tree (for comparison against
+nNNNNNN in the table above), run:
+
+# git rev-list --count --first-parent HEAD
+
+VII. References
+
+
+
+
+
+The latest revision of this advisory is available at
+
+-----BEGIN PGP SIGNATURE-----
+
+iQIzBAEBCgAdFiEEthUnfoEIffdcgYM7bljekB8AGu8FAmXMYP4ACgkQbljekB8A
+Gu8lBxAA6XgVr3mwvCPgeu8UFa8OeIJzIBgCDv5QFD9BL5NjK5TQuUtc/EqFeuIp
+wSR+KC5Lc/NCsi3fX85M4ZI6HnsTBwOVQ5t7xhYxmQvBmzeZWz02UfGIVLuU6/JG
+mYjpRRCx1yEyUntzfuXEYNsCLkGWYLuydBfFsL+6tN587dk7A/rRMyzdEDsKApGE
+GcP5N7/cKaxNCoDSJonLpX0AbsoQRQJeyhVFgtKWnbPKW9yTeEAZEIG2jqlqOX5O
+JQ4Ih3nj4Y4IVVSwPyO5eZYtTc1N1MMixJct63yM4C8IHjCFnxfPASz6+9s8DcAx
+BwezcAogXJ0ERuohJe2SXPayEUPqrcPAUXQfwO8kPvAX7VrF97cwfyPY6sf9j7gw
+qtHX2e9OPt+oMbXOzgvnIt/p6OZ4SHpfDpiSIIJqk0f+w+qVPeRDKa2SUjWEGphc
+GS1wQc+lXqwvlm2DknpESRDOF6nLQfgSm1IFOWin/10kf6mFQR4RnK0lxP2rwZgQ
+s1VKhA8zPLrXhB4z/OJod7F2R5nXXfqQwlCmWC8RQjL7T7Bz7NEAIU9zwqIPAQb5
+DTtCBe4dYBt6eeYPFQ8EjD3BfYzqJyT2rXQtnwl9Je/foHqZ6pJrFbQool81aRkq
+aCo/OKuzUKNnOLsLwyTTsO/kTqL1ryW/CiFHz7XhD2Y8+YqwOHE=
+=7Xjc
+-----END PGP SIGNATURE-----
diff --git a/website/static/security/advisories/FreeBSD-EN-24:02.libutil.asc b/website/static/security/advisories/FreeBSD-EN-24:02.libutil.asc
new file mode 100644
index 0000000000..c5c33a7863
--- /dev/null
+++ b/website/static/security/advisories/FreeBSD-EN-24:02.libutil.asc
@@ -0,0 +1,169 @@
+-----BEGIN PGP SIGNED MESSAGE-----
+Hash: SHA512
+
+=============================================================================
+FreeBSD-EN-24:02.libutil Errata Notice
+ The FreeBSD Project
+
+Topic: Login class resource limits and CPU mask bypass
+
+Category: core
+Module: libutil
+Announced: 2024-02-14
+Credits: Olivier Certner
+Affects: All supported versions of FreeBSD.
+Corrected: 2023-10-24 00:57:11 UTC (stable/14, 14.0-STABLE)
+ 2023-02-14 06:05:41 UTC (releng/14.0, 14.0-RELEASE-p5)
+ 2023-12-21 13:39:03 UTC (stable/13, 13.2-STABLE)
+ 2023-02-14 06:05:57 UTC (releng/13.2, 13.2-RELEASE-p10)
+
+For general information regarding FreeBSD Errata Notices and Security
+Advisories, including descriptions of the fields above, security
+branches, and the following sections, please visit
+.
+
+I. Background
+
+setusercontext() is a high-level API generally used by login-like programs to
+set the general environment of new processes launched on behalf of other
+users, including the credentials (users, groups, MAC security label), resource
+limits, CPU mask and process priority.
+
+This function only applies the settings of the types requested by the caller
+via flags (e.g., LOGIN_SETALL for all types, LOGIN_SETUSER to set the real,
+effective and saved user IDs, etc.), and for some of them requires privileges
+to do so. Among these, the resource limits (flag LOGIN_SETRESOURCES) and CPU
+mask (flag LOGIN_SETCPUMASK) types are set not only based on the target user's
+login class, which is controlled by the system administrator, but also on his
+personal configuration file '~/.login_conf' (see login.conf(5)).
+
+In order to prevent unprivileged users from overriding the administrator
+settings, setusercontext() applies a personal configuration file only if the
+real user ID of the process that runs it matches that of the target user, with
+the goal to avoid applying the user-controlled settings with privileges.
+
+II. Problem Description
+
+When deciding to apply a target user's personal configuration file,
+setusetcontext() checks the real user ID of the process whereas it should
+instead check the effective user ID, which is the one affecting the process'
+privileges and consequently which settings it can change and to which values.
+
+III. Impact
+
+An unprivileged user may bypass the administrator's resource limits and/or CPU
+mask settings stemming from his login class provided he can run a (setuid)
+login-like program that:
+- - Calls setusercontext() with the LOGIN_SETRESOURCES and/or LOGIN_SETCPUMASK
+ flags but without LOGIN_SETUSER (which excludes the use of LOGIN_SETALL),
+ and with a non-NULL 'pwd' argument.
+- - Does so before changing the effective user ID to the target user.
+
+No programs in FreeBSD's base system, including login(1) and su(1), meet these
+requirements, but third-party programs may. In particular, sudo(8) does when
+using the default sudoers(5) plugin configured with the 'use_loginclass' flag
+enabled. doas(8) does not.
+
+IV. Workaround
+
+There are at least two possible workarounds.
+
+The first one is for an administrator is to prepare for all users a
+'~/.login_conf' they can't write or replace, e.g., using filesystem flags
+'schg' or 'sunlnk' (see chflags(1)), defeating user's own customizations.
+
+The second one is to review setuid login programs accessible to users,
+determine if they meet the requirements above, and deactivate those that do or
+reconfigure them when possible, as mentioned above for sudo(8).
+
+V. Solution
+
+Upgrade your system to a supported FreeBSD stable or release / security
+branch (releng) dated after the correction date.
+
+Perform one of the following:
+
+1) To update your system via a binary patch:
+
+Systems running a RELEASE version of FreeBSD on the amd64 or arm64 platforms,
+or the i386 platform on FreeBSD 13, can be updated via the freebsd-update(8)
+utility:
+
+# freebsd-update fetch
+# freebsd-update install
+
+It should be followed by a restart of all third-party daemons that use the
+'libutil' library, or a reboot of the system.
+
+2) To update your system via a source code patch:
+
+The following patches have been verified to apply to the applicable
+FreeBSD release branches.
+
+a) Download the relevant patch from the location below, and verify the
+detached PGP signature using your PGP utility.
+
+# fetch https://security.FreeBSD.org/patches/EN-24:02/libutil.patch
+# fetch https://security.FreeBSD.org/patches/EN-24:02/libutil.patch.asc
+# gpg --verify libutil.patch.asc
+
+b) Apply the patch. Execute the following commands as root:
+
+# cd /usr/src
+# patch < /path/to/patch
+
+c) Recompile the operating system using buildworld and installworld as
+described in .
+
+Restart of all third-party daemons that use the 'libutil' library, or reboot the
+system.
+
+VI. Correction details
+
+This issue is corrected as of the corresponding Git commit hash in the
+following stable and release branches:
+
+Branch/path Hash Revision
+- -------------------------------------------------------------------------
+stable/14/ ede6fd06726c stable/14-n265587
+releng/14.0/ c2a9cfc55046 releng/14.0-n265403
+stable/13/ 9fcf54d3750e stable/13-n256941
+releng/13.2/ 9deb5ca77beb releng/13.2-n254655
+- -------------------------------------------------------------------------
+
+Run the following command to see which files were modified by a
+particular commit:
+
+# git show --stat
+
+Or visit the following URL, replacing NNNNNN with the hash:
+
+
+
+To determine the commit count in a working tree (for comparison against
+nNNNNNN in the table above), run:
+
+# git rev-list --count --first-parent HEAD
+
+VII. References
+
+
+
+The latest revision of this advisory is available at
+
+-----BEGIN PGP SIGNATURE-----
+
+iQIzBAEBCgAdFiEEthUnfoEIffdcgYM7bljekB8AGu8FAmXMYQoACgkQbljekB8A
+Gu8m9Q//cmgbS/PZPMBjARTQa2kkEpIy7zYgDq9/oriREfUBgbN+hFdxlwN5q59r
+t+lJGJYSynMQDFglQcsD61nECP6fnjco1RxLPpzf+aBmP/VebOh7irsI7QElisY+
+SoiCHhZrpXcZGU5OBTA0Nd7NbKVmCflF6aJN0bOCZHvONSUH+ijsXPd98Pjx6TgF
+0yQV3ryMYtEBbIaXdR751HLe011hcQYBnlU+/0B9bzL5JCr67NaYM3MDkMkwvXSs
+zJaefj9xxMlJdB4EvkJGtcau4Kw/qdM0iFllUMmOPl3QK+s4LKguaVtuWWI0bSvL
+VlFbGVCoRmaVzV+ZaCrDZrsl3NOC92Trhg5QdLV5HJUP3sSRAo5PGNostdWB6VsT
+mfgJp0owv7LSSt/irDgtY2OGFb3Y/RZmqTBXR7ScFAguuA5dJva44eDkUX8YXBU/
+7ZlXMuF94dmaTmcDqOqWBmfeIWlIKdVsol6fzoKQhLjtZuUg5vdl2rUlj6GSNSL9
+6GLU2/LiobuBhfc0qL/mmtyovqHO2HDLsNX54zusBEzy7lI2URvTcCjcHX0Tbwwi
+cuj6b/XzvAnQ2qFyA4l8bhCSpECkGybLgar+ig199K077HrwRUjLt666JQtMBkKQ
+LZafucjfGCSpDJFcVjfGfliYnYQFyAd4NAfDsnR15xz9Pxw7MOg=
+=mDl9
+-----END PGP SIGNATURE-----
diff --git a/website/static/security/advisories/FreeBSD-EN-24:03.kqueue.asc b/website/static/security/advisories/FreeBSD-EN-24:03.kqueue.asc
new file mode 100644
index 0000000000..6ddfa84ef7
--- /dev/null
+++ b/website/static/security/advisories/FreeBSD-EN-24:03.kqueue.asc
@@ -0,0 +1,131 @@
+-----BEGIN PGP SIGNED MESSAGE-----
+Hash: SHA512
+
+=============================================================================
+FreeBSD-EN-24:03.kqueue Errata Notice
+ The FreeBSD Project
+
+Topic: kqueue_close(2) page fault on exit using rfork(2)
+
+Category: core
+Module: kqueue
+Announced: 2024-02-14
+Affects: All supported versions of FreeBSD.
+Corrected: 2023-12-05 00:43:27 UTC (stable/14, 14.0-STABLE)
+ 2024-02-14 06:05:42 UTC (releng/14.0, 14.0-RELEASE-p5)
+ 2023-12-05 00:44:13 UTC (stable/13, 13.2-STABLE)
+ 2024-02-14 06:05:58 UTC (releng/13.2, 13.2-RELEASE-p10)
+
+For general information regarding FreeBSD Errata Notices and Security
+Advisories, including descriptions of the fields above, security
+branches, and the following sections, please visit
+.
+
+I. Background
+
+The kqueue(2) system call provides a generic method of notifying the user
+when an event happens or a condition holds.
+
+II. Problem Description
+
+Normally, when a process exits, all its kqueue fds will be destroyed at the
+moment p_klist is detached. However, if the process was created with rfork(2)
+with shared file descriptors, its signal knotes can survive. This can
+eventually result in a page fault when the process exits.
+
+III. Impact
+
+Using kqueue(2) with a process using rfork(2) can panic the system.
+
+IV. Workaround
+
+No workaround is available.
+
+V. Solution
+
+Upgrade your system to a supported FreeBSD stable or release / security
+branch (releng) dated after the correction date, and reboot the system.
+
+Perform one of the following:
+
+1) To update your system via a binary patch:
+
+Systems running a RELEASE version of FreeBSD on the amd64 or arm64 platforms,
+or the i386 platform on FreeBSD 13, can be updated via the freebsd-update(8)
+utility:
+
+# freebsd-update fetch
+# freebsd-update install
+
+Reboot the system.
+
+2) To update your system via a source code patch:
+
+The following patches have been verified to apply to the applicable
+FreeBSD release branches.
+
+a) Download the relevant patch from the location below, and verify the
+detached PGP signature using your PGP utility.
+
+# fetch https://security.FreeBSD.org/patches/EN-24:03/kqueue.patch
+# fetch https://security.FreeBSD.org/patches/EN-24:03/kqueue.patch.asc
+# gpg --verify kqueue.patch.asc
+
+b) Apply the patch. Execute the following commands as root:
+
+# cd /usr/src
+# patch < /path/to/patch
+
+c) Recompile your kernel as described in
+ and reboot the
+system.
+
+VI. Correction details
+
+This issue is corrected as of the corresponding Git commit hash in the
+following stable and release branches:
+
+Branch/path Hash Revision
+- -------------------------------------------------------------------------
+stable/14/ 24346a2f7775 stable/14-n265907
+releng/14.0/ bb06104dce0b releng/14.0-n265404
+stable/13/ 55e91944998c stable/13-n256837
+releng/13.2/ 154dedade465 releng/13.2-n254656
+- -------------------------------------------------------------------------
+
+Run the following command to see which files were modified by a
+particular commit:
+
+# git show --stat
+
+Or visit the following URL, replacing NNNNNN with the hash:
+
+
+
+To determine the commit count in a working tree (for comparison against
+nNNNNNN in the table above), run:
+
+# git rev-list --count --first-parent HEAD
+
+VII. References
+
+
+
+The latest revision of this advisory is available at
+
+-----BEGIN PGP SIGNATURE-----
+
+iQIzBAEBCgAdFiEEthUnfoEIffdcgYM7bljekB8AGu8FAmXMYQwACgkQbljekB8A
+Gu+GSxAA5voCfr4a2LrMmBjQvgD7XwpCNH9yvYN3chKG07TTqNWkHbCxNvc4Brzm
+IXKGxvolrY3PZhXgN2KZhe/wAOf0I1ZazeW9wdk13O9G2SF5aaUYBkCvoMmPME42
+f7lVXnkxhTQAovVFQRZAK6sYCVspIPQEpavoa7rq5dDDtO9g2AqB53aAbgdBpQ0j
+ClIcMzM2HdiYQBi4WuL36XVbeX6N++N5ouE8Hdz+pDcQSHuOm3VHUKlpRsEXLmYI
+3uDJ8py+PGbtcLnSVALEcnreirJcCJ5em7Gaec2KXHDRis/dLW+DPlPyZp1mpIBZ
+l073AME8hEOxnJOUALvxTVHQS3L35JjFmxnSGwnLzXH16v/fGUKlnAZkOftNcRan
+JW1fLXB2EH+H+hdnOWiQeTCk8duIIvXuWEYf8dfP6SBMm9FfzBAoTv/K1mHxGFKZ
+s3iR4WyC7Y6r56meVdNfs/F4XtVh3edhVfOdjf/5I8+Ut9HGRNuHOCepLG9DASOd
+eQbhHAnHnUB21qq4Tme0eKoA130gVcBMr2NsE0lifNArLzEvvGB0Bw+9ZP9IfFeS
+/fPs4Yq1XIjpgk+TDdOPGexLWCIBl0ursjZMSuGyhXkDaD1oYzF3SKWrJRkahpUq
++tN6jVPkG7Iy36myKSHofuPh641hSmk88IJPJHVrdNjo88hUti0=
+=xsIs
+-----END PGP SIGNATURE-----
diff --git a/website/static/security/advisories/FreeBSD-EN-24:04.ip.asc b/website/static/security/advisories/FreeBSD-EN-24:04.ip.asc
new file mode 100644
index 0000000000..a5fbf4e1a1
--- /dev/null
+++ b/website/static/security/advisories/FreeBSD-EN-24:04.ip.asc
@@ -0,0 +1,130 @@
+-----BEGIN PGP SIGNED MESSAGE-----
+Hash: SHA512
+
+=============================================================================
+FreeBSD-EN-24:04.ip Errata Notice
+ The FreeBSD Project
+
+Topic: Kernel panic triggered by bind(2)
+
+Category: core
+Module: ip
+Announced: 2024-02-14
+Affects: FreeBSD 14.0
+Corrected: 2024-01-09 00:30:05 UTC (stable/14, 14.0-STABLE)
+ 2024-02-14 06:05:43 UTC (releng/14.0, 14.0-RELEASE-p5)
+
+For general information regarding FreeBSD Errata Notices and Security
+Advisories, including descriptions of the fields above, security
+branches, and the following sections, please visit
+.
+
+I. Background
+
+The inpcb subsystem of the kernel is responsible for implementing
+portions of socket-related system calls (e.g., bind(2)) on behalf of
+IP-based network protocol implementations. This layer provides lookup
+tables which can be used within the kernel to translate between sockets
+and the internet addresses to which they are bound or connected.
+
+II. Problem Description
+
+The inpcb layer maintains several hash tables which are synchronized by
+a combination of mutexes and the use of lock-free data structures. The
+implementation of the latter was flawed such that a locked lookup could
+return a socket that was in the process of being removed from the table.
+
+III. Impact
+
+The race condition can trigger a NULL pointer dereference in the kernel,
+resulting in a kernel panic.
+
+IV. Workaround
+
+No workaround is available.
+
+V. Solution
+
+Upgrade your system to a supported FreeBSD stable or release / security
+branch (releng) dated after the correction date.
+
+Perform one of the following:
+
+1) To update your system via a binary patch:
+
+Systems running a RELEASE version of FreeBSD on the amd64 or arm64 platforms,
+or the i386 platform on FreeBSD 13, can be updated via the freebsd-update(8)
+utility:
+
+# freebsd-update fetch
+# freebsd-update install
+# shutdown -r now
+
+2) To update your system via a source code patch:
+
+The following patches have been verified to apply to the applicable
+FreeBSD release branches.
+
+a) Download the relevant patch from the location below, and verify the
+detached PGP signature using your PGP utility.
+
+# fetch https://security.FreeBSD.org/patches/EN-24:04/ip.patch
+# fetch https://security.FreeBSD.org/patches/EN-24:04/ip.patch.asc
+# gpg --verify ip.patch.asc
+
+b) Apply the patch. Execute the following commands as root:
+
+# cd /usr/src
+# patch < /path/to/patch
+
+c) Recompile your kernel as described in
+ and reboot the
+system.
+
+VI. Correction details
+
+This issue is corrected as of the corresponding Git commit hash in the
+following stable and release branches:
+
+Branch/path Hash Revision
+- -------------------------------------------------------------------------
+stable/14/ 2bfe735277b8 stable/14-n266255
+releng/14.0/ 9db5ae3ec45f releng/14.0-n265405
+- -------------------------------------------------------------------------
+
+Run the following command to see which files were modified by a
+particular commit:
+
+# git show --stat
+
+Or visit the following URL, replacing NNNNNN with the hash:
+
+
+
+To determine the commit count in a working tree (for comparison against
+nNNNNNN in the table above), run:
+
+# git rev-list --count --first-parent HEAD
+
+VII. References
+
+
+
+The latest revision of this advisory is available at
+
+-----BEGIN PGP SIGNATURE-----
+
+iQIzBAEBCgAdFiEEthUnfoEIffdcgYM7bljekB8AGu8FAmXMYQ4ACgkQbljekB8A
+Gu8ffg/7BY7BfPU1emJ7YfFNKszPKJooefFS8dejskN6ic55hCt8fh0RuV9g/Lwg
+25QehLwGl821HaoTBijM9EBt4RTT9qdzU0m+9MKKATxy5wfnfANtU3fa+nwvuWhB
+fM6kLJcnViobhGHDoFN29Nz2BjfGodh4XXf1uE4zOLytw9WrM69H/UbHPMn7xSzM
+mPqGppk/TdxEdWXywaHLhSKf8Y21jtcidQBQ3aILnLbNObt2uii+hqVQw5+CDRYw
+NnHi1QBWMTP3blwmwGV3rtpytDMhhXUptA0ILpzVm6YAtGTsTLL4VrssGtcuW+Sh
+o7wkwmNzQLayoKNwdUkx8S/X+ilCBeHVXBH3A2GHjisMstP8cU3fRAuPVI5QvIyh
+rWsCLyoL+QwtZ58KJLpe6WQtLfG/xpq20+7lUJtyLaInZ7YStkNLXMZHJUbjx7yO
+xZsraeCI3Y6qtdHYxk4wH3HBqR2w6WmU30iXMA5UWXjL9LaB0Az/8cHlXoTA6apB
+XoHCzfC/LbV972c28P7Nky97oFkYTPvB0+iHPqMB77pciMO6gKWitf4FFA9fsp7H
+QfWjUHMJSIbtzCgskKurO93UmlogQbfbgahmzSA7SDTryObbXdre2SuSrfDwbW/O
+scgug9GgFuTjAp9GB7SYFA+eYUQsakyVHK1gnxt3Su7lcw/GMG0=
+=2K5v
+-----END PGP SIGNATURE-----
diff --git a/website/static/security/advisories/FreeBSD-SA-24:01.bhyveload.asc b/website/static/security/advisories/FreeBSD-SA-24:01.bhyveload.asc
new file mode 100644
index 0000000000..c61b036f16
--- /dev/null
+++ b/website/static/security/advisories/FreeBSD-SA-24:01.bhyveload.asc
@@ -0,0 +1,140 @@
+-----BEGIN PGP SIGNED MESSAGE-----
+Hash: SHA512
+
+=============================================================================
+FreeBSD-SA-24:01.bhyveload Security Advisory
+ The FreeBSD Project
+
+Topic: bhyveload(8) host file access
+
+Category: core
+Module: bhyeload
+Announced: 2024-02-14
+Credits: The water cooler. (Note, this is the requested credit)
+Affects: All supported versions of FreeBSD.
+Corrected: 2024-01-15 22:27:59 UTC (stable/14, 14.0-STABLE)
+ 2024-02-14 06:05:44 UTC (releng/14.0, 14.0-RELEASE-p5)
+ 2024-01-15 23:11:38 UTC (stable/13, 13.2-STABLE)
+ 2024-02-14 06:06:00 UTC (releng/13.2, 13.2-RELEASE-p10)
+CVE Name: CVE-2024-25940
+
+For general information regarding FreeBSD Security Advisories,
+including descriptions of the fields above, security branches, and the
+following sections, please visit .
+
+I. Background
+
+bhyveload(8) is used to load a FreeBSD guest into a bhyve virtual machine.
+
+II. Problem Description
+
+`bhyveload -h ` may be used to grant loader access to the
+directory tree on the host. Affected versions of bhyveload(8) do not make any
+attempt to restrict loader's access to , allowing the loader to read
+any file the host user has access to.
+
+III. Impact
+
+In the bhyveload(8) model, the host supplies a userboot.so to boot with, but the
+loader scripts generally come from the guest image. A maliciously crafted
+script could be used to exfiltrate sensitive data from the host accessible to
+the user running bhyhveload(8), which is often the system root.
+
+IV. Workaround
+
+No workaround is available, but guests that do not use `bhyveload -h` are not
+impacted. Common VM solutions that use bhyveload(8) do not usually use the
+- -h option.
+
+V. Solution
+
+Upgrade your system to a supported FreeBSD stable or release / security
+branch (releng) dated after the correction date.
+
+Perform one of the following:
+
+1) To update your vulnerable system via a binary patch:
+
+Systems running a RELEASE version of FreeBSD on the amd64 or arm64 platforms,
+or the i386 platform on FreeBSD 13, can be updated via the freebsd-update(8)
+utility:
+
+# freebsd-update fetch
+# freebsd-update install
+
+2) To update your vulnerable system via a source code patch:
+
+The following patches have been verified to apply to the applicable
+FreeBSD release branches.
+
+a) Download the relevant patch from the location below, and verify the
+detached PGP signature using your PGP utility.
+
+[FreeBSD 14.0]
+# fetch https://security.FreeBSD.org/patches/SA-24:01/bhyveload-14.0.patch
+# fetch https://security.FreeBSD.org/patches/SA-24:01/bhyveload-14.0.patch.asc
+# gpg --verify bhyveload-14.0.patch.asc
+
+[FreeBSD 13.2]
+# fetch https://security.FreeBSD.org/patches/SA-24:01/bhyveload-13.2.patch
+# fetch https://security.FreeBSD.org/patches/SA-24:01/bhyveload-13.2.patch.asc
+# gpg --verify bhyveload-13.2.patch.asc
+
+b) Apply the patch. Execute the following commands as root:
+
+# cd /usr/src
+# patch < /path/to/patch
+
+c) Recompile the operating system using buildworld and installworld as
+described in . Virtual
+machines that have been booted with bhyveload(8) do not need to be rebooted.
+
+VI. Correction details
+
+This issue is corrected as of the corresponding Git commit hash in the
+following stable and release branches:
+
+Branch/path Hash Revision
+- -------------------------------------------------------------------------
+stable/14/ 426b28fdf700 stable/14-n266333
+releng/14.0/ f5bb597829e1 releng/14.0-n265406
+stable/13/ 78345dbd7a00 stable/13-n257186
+releng/13.2/ 48598b1670ce releng/13.2-n254657
+- -------------------------------------------------------------------------
+
+Run the following command to see which files were modified by a
+particular commit:
+
+# git show --stat
+
+Or visit the following URL, replacing NNNNNN with the hash:
+
+
+
+To determine the commit count in a working tree (for comparison against
+nNNNNNN in the table above), run:
+
+# git rev-list --count --first-parent HEAD
+
+VII. References
+
+
+
+The latest revision of this advisory is available at
+
+-----BEGIN PGP SIGNATURE-----
+
+iQIzBAEBCgAdFiEEthUnfoEIffdcgYM7bljekB8AGu8FAmXMYRAACgkQbljekB8A
+Gu8KwRAAxCnMsCQbp/CZ1O2GYxDTCOt1M5CZaFBD8r3b4xSN1gFB79z3aHAmSX0a
+kTGpp5QSbxx1UtA9eZoZTa/wpmMAo1AZ7ry0OK1VuRFtF2D+IM64l07m91HW5ncU
+YCsbeQ6wuXHeVlZ/t7eu/X03YltYIuMu/wIzpsPYtMvTB+ZI50nm0pUGaQnH9ZA2
+jMGhLcWQSaHi46pMJ1o2iXWbaFZh4S6fHhNXSEFxaWuQf/o//whSgeqtFnhozfZ4
+vbx0pyF3HrkjPRLwc9QDRNcFnG0F9DCOmiGlAAZD4/XRNOd5PgSvmHxDPrc1UkJO
+K8CcU7vIgloKdETS43HhlDhT34/adV1dMpwCLpr9JZ3FmfTtIor1q8w9l0nLohln
+VeLUbhaMZAXYqQp5wcDso26n9moD8l/izJZZ0gWu8xsooKmE2DY0t7ASXdcvnSq8
+VKlpZP0DHcdZdeePiCF6XovAvv3fAq5hvIdCccBIJHbFIWEL2Psq9hYqFISb+mFb
+gAoX5gyo4S+lWgn33aUCzjYuR0MhelJPRFIndjr5+Dn0AgQniNre7uRt4k97jvT1
+Q9h+f4uyNFafuD5YMqfRhsk8EN93bEc3Bkq47KCYDSTJujd99pYFPE1SzvNAPmNY
+CYxqYjkfjklarfellifxvqdKrOWoeOkK4a3Ckd5+4Y8BaaTzWCY=
+=LOMD
+-----END PGP SIGNATURE-----
diff --git a/website/static/security/advisories/FreeBSD-SA-24:02.tty.asc b/website/static/security/advisories/FreeBSD-SA-24:02.tty.asc
new file mode 100644
index 0000000000..6b40af77f9
--- /dev/null
+++ b/website/static/security/advisories/FreeBSD-SA-24:02.tty.asc
@@ -0,0 +1,137 @@
+-----BEGIN PGP SIGNED MESSAGE-----
+Hash: SHA512
+
+=============================================================================
+FreeBSD-SA-24:02.tty Security Advisory
+ The FreeBSD Project
+
+Topic: jail(2) information leak
+
+Category: core
+Module: jail
+Announced: 2024-02-14
+Credits: Pawel Jakub Dawidek
+Affects: All supported versions of FreeBSD.
+Corrected: 2024-02-12 16:25:54 UTC (stable/14, 14.0-STABLE)
+ 2024-02-14 06:05:46 UTC (releng/14.0, 14.0-RELEASE-p5)
+ 2024-02-12 16:27:37 UTC (stable/13, 13.2-STABLE)
+ 2024-02-14 06:06:01 UTC (releng/13.2, 13.2-RELEASE-p10)
+CVE Name: CVE-2024-25941
+
+For general information regarding FreeBSD Security Advisories,
+including descriptions of the fields above, security branches, and the
+following sections, please visit .
+
+I. Background
+
+The jail(2) system call allows a system administrator to lock a process
+and all of its descendants inside an environment with a very limited
+ability to affect the system outside that environment, even for
+processes with superuser privileges. It is an extension of, but
+far more powerful than, the traditional UNIX chroot(2) system call.
+
+tty(4) is a general terminal device.
+
+II. Problem Description
+
+The jail(2) system call has not limited a visiblity of allocated TTYs
+(the kern.ttys sysctl). This gives rise to an information leak about
+processes outside the current jail.
+
+III. Impact
+
+Attacker can get information about TTYs allocated on the host or in other
+jails. Effectively, the information printed by "pstat -t" may be leaked.
+
+IV. Workaround
+
+No workaround is available.
+
+V. Solution
+
+Upgrade your vulnerable system to a supported FreeBSD stable or
+release / security branch (releng) dated after the correction date
+and reboot.
+
+Perform one of the following:
+
+1) To update your vulnerable system via a binary patch:
+
+Systems running a RELEASE version of FreeBSD on the amd64 or arm64 platforms,
+or the i386 platform on FreeBSD 13, can be updated via the freebsd-update(8)
+utility:
+
+# freebsd-update fetch
+# freebsd-update install
+# shutdown -r +10min "Rebooting for a security update"
+
+2) To update your vulnerable system via a source code patch:
+
+The following patches have been verified to apply to the applicable
+FreeBSD release branches.
+
+a) Download the relevant patch from the location below, and verify the
+detached PGP signature using your PGP utility.
+
+# fetch https://security.FreeBSD.org/patches/SA-24:02/tty.patch
+# fetch https://security.FreeBSD.org/patches/SA-24:02/tty.patch.asc
+# gpg --verify tty.patch.asc
+
+b) Apply the patch. Execute the following commands as root:
+
+# cd /usr/src
+# patch < /path/to/patch
+
+c) Recompile your kernel as described in
+ and reboot the
+system.
+
+VI. Correction details
+
+This issue is corrected as of the corresponding Git commit hash in the
+following stable and release branches:
+
+Branch/path Hash Revision
+- -------------------------------------------------------------------------
+stable/14/ 215bb03edc54 stable/14-n266676
+releng/14.0/ 4d354159d150 releng/14.0-n265407
+stable/13/ 9bff7ec98354 stable/13-n257418
+releng/13.2/ 17257e6e9a23 releng/13.2-n254658
+- -------------------------------------------------------------------------
+
+Run the following command to see which files were modified by a
+particular commit:
+
+# git show --stat
+
+Or visit the following URL, replacing NNNNNN with the hash:
+
+
+
+To determine the commit count in a working tree (for comparison against
+nNNNNNN in the table above), run:
+
+# git rev-list --count --first-parent HEAD
+
+VII. References
+
+
+
+The latest revision of this advisory is available at
+
+-----BEGIN PGP SIGNATURE-----
+
+iQIzBAEBCgAdFiEEthUnfoEIffdcgYM7bljekB8AGu8FAmXMYRMACgkQbljekB8A
+Gu8C7hAAxXasfu+Xn3+voOk5pJvFJd6jWA1ZCvR83YnIqAGibiWvNaMdsdfe4k6x
+eEoaQ6maYYu/wjXMZ0HbapTuJPRxwrcG7i2mZ52vSm9glSZO87Lw3oWVIV7eRPpN
+pFJtR5bUXns1/dWQgcgFMc/4nNk7NO6gamuK/uwfrDF0aQsYif5pX5DmhkOD/CnQ
+CjPWhv6FT94qzUiQrZLSWjCIe/rhNbmbLkhyck4MZP+1aILxsb+BHSaEeBzej2+S
+8WisLPKlTwNgpA+DN+sLn28gR1+0Vd5rAv7gvcbWHE3VNvq0ABTwRoZFA4SzHEhL
+BNkwMJnMJyR7qj1jWCmfrHptIPpSXtNIvh70yts5/+9nPBDkAYV9U+nJYQTZ40+U
+Mn1OfN4ioRfB7bOjVA4J6Ncws4M2ttcOEyk+d8Egd5/7njOGC1sqX0F4FXAtioZF
+JATTBd09J9TTZvX5xz6JdK8ZHKc+xtxYiBYg4WQTyVcPg38ONpYarSIQ6XYnNSyP
+0Cv1ih5DpxzdEBA+Pu4+dJmZSlyNOJXpmlPKgyiUX0Z085ZqHTMvAXQQS/M7MXai
+06d2YnZx4XfGoAhCXZKyvE6J6btiy+t8QNx14tEdtD/ktzAmB3EYHOuuPEFoS44Y
+8tafKE9ps5AgWtqXvK7H5NKMwtb9Ry60WSAFfgn0LoFmw8UyBjg=
+=HQVb
+-----END PGP SIGNATURE-----
diff --git a/website/static/security/patches/EN-24:01/tzdata-2024a.patch b/website/static/security/patches/EN-24:01/tzdata-2024a.patch
new file mode 100644
index 0000000000..a6ce7c687d
--- /dev/null
+++ b/website/static/security/patches/EN-24:01/tzdata-2024a.patch
@@ -0,0 +1,2927 @@
+--- contrib/tzdata/Makefile.orig
++++ contrib/tzdata/Makefile
+@@ -1,7 +1,25 @@
+ # Make and install tzdb code and data.
+-
+ # This file is in the public domain, so clarified as of
+ # 2009-05-17 by Arthur David Olson.
++# Request POSIX conformance; this must be the first non-comment line.
++.POSIX:
++# On older platforms you may need to scrounge for a POSIX-conforming 'make'.
++# For example, on Solaris 10 (2005), use /usr/sfw/bin/gmake or
++# /usr/xpg4/bin/make, not /usr/ccs/bin/make.
++
++# To affect how this Makefile works, you can run a shell script like this:
++#
++# #!/bin/sh
++# make CC='gcc -std=gnu11' "$@"
++#
++# This example script is appropriate for a pre-2017 GNU/Linux system
++# where a non-default setting is needed to support this package's use of C99.
++#
++# Alternatively, you can simply edit this Makefile to tailor the following
++# macro definitions.
++
++###############################################################################
++# Start of macros that one plausibly might want to tailor.
+
+ # Package name for the code distribution.
+ PACKAGE= tzcode
+@@ -35,7 +53,7 @@
+
+ LOCALTIME= Factory
+
+-# The POSIXRULES macro controls interpretation of POSIX-like TZ
++# The POSIXRULES macro controls interpretation of POSIX-2017.1-like TZ
+ # settings like TZ='EET-2EEST' that lack DST transition rules.
+ # If POSIXRULES is '-', no template is installed; this is the default.
+ # Any other value for POSIXRULES is obsolete and should not be relied on, as:
+@@ -191,8 +209,9 @@
+ # On some hosts, this should have -lintl unless CFLAGS has -DHAVE_GETTEXT=0.
+ LDLIBS=
+
+-# Add the following to the end of the "CFLAGS=" line as needed to override
+-# defaults specified in the source code. "-DFOO" is equivalent to "-DFOO=1".
++# Add the following to an uncommented "CFLAGS=" line as needed
++# to override defaults specified in the source code or by the system.
++# "-DFOO" is equivalent to "-DFOO=1".
+ # -DDEPRECATE_TWO_DIGIT_YEARS for optional runtime warnings about strftime
+ # formats that generate only the last two digits of year numbers
+ # -DEPOCH_LOCAL if the 'time' function returns local time not UT
+@@ -234,11 +253,16 @@
+ # -DHAVE_UNISTD_H=0 if does not work*
+ # -DHAVE_UTMPX_H=0 if does not work*
+ # -Dlocale_t=XXX if your system uses XXX instead of locale_t
+-# -DPORT_TO_C89 if tzcode should also run on C89 platforms+
++# -DPORT_TO_C89 if tzcode should also run on mostly-C89 platforms+
++# Typically it is better to use a later standard. For example,
++# with GCC 4.9.4 (2016), prefer '-std=gnu11' to '-DPORT_TO_C89'.
++# Even with -DPORT_TO_C89, the code needs at least one C99
++# feature (integers at least 64 bits wide) and maybe more.
+ # -DRESERVE_STD_EXT_IDS if your platform reserves standard identifiers
+ # with external linkage, e.g., applications cannot define 'localtime'.
+ # -Dssize_t=long on hosts like MS-Windows that lack ssize_t
+ # -DSUPPORT_C89 if the tzcode library should support C89 callers+
++# However, this might trigger latent bugs in C99-or-later callers.
+ # -DSUPPRESS_TZDIR to not prepend TZDIR to file names; this has
+ # security implications and is not recommended for general use
+ # -DTHREAD_SAFE to make localtime.c thread-safe, as POSIX requires;
+@@ -250,7 +274,7 @@
+ # -DTZ_DOMAINDIR=\"/path\" to use "/path" for gettext directory;
+ # the default is system-supplied, typically "/usr/lib/locale"
+ # -DTZDEFRULESTRING=\",date/time,date/time\" to default to the specified
+-# DST transitions for POSIX-style TZ strings lacking them,
++# DST transitions for POSIX.1-2017-style TZ strings lacking them,
+ # in the usual case where POSIXRULES is '-'. If not specified,
+ # TZDEFRULESTRING defaults to US rules for future DST transitions.
+ # This mishandles some past timestamps, as US DST rules have changed.
+@@ -270,11 +294,15 @@
+ # -DZIC_MAX_ABBR_LEN_WO_WARN=3
+ # (or some other number) to set the maximum time zone abbreviation length
+ # that zic will accept without a warning (the default is 6)
++# -g to generate symbolic debugging info
++# -Idir to include from directory 'dir'
++# -O0 to disable optimization; other -O options to enable more optimization
++# -Uname to remove any definition of the macro 'name'
+ # $(GCC_DEBUG_FLAGS) if you are using recent GCC and want lots of checking
+ #
+ # * Options marked "*" can be omitted if your compiler is C23 compatible.
+ # * Options marked "+" are obsolescent and are planned to be removed
+-# once the code assumes C99 or later.
++# once the code assumes C99 or later, say in the year 2029.
+ #
+ # Select instrumentation via "make GCC_INSTRUMENT='whatever'".
+ GCC_INSTRUMENT = \
+@@ -312,9 +340,10 @@
+ # guess TM_GMTOFF from other macros; define NO_TM_GMTOFF to suppress this.
+ # Similarly, if your system has a "zone abbreviation" field, define
+ # -DTM_ZONE=tm_zone
+-# and define NO_TM_ZONE to suppress any guessing. Although these two fields
+-# not required by POSIX, a future version of POSIX is planned to require them
+-# and they are widely available on GNU/Linux and BSD systems.
++# and define NO_TM_ZONE to suppress any guessing.
++# Although these two fields are not required by POSIX.1-2017,
++# POSIX 202x/D4 requires them and they are widely available
++# on GNU/Linux and BSD systems.
+ #
+ # The next batch of options control support for external variables
+ # exported by tzcode. In practice these variables are less useful
+@@ -324,7 +353,7 @@
+ # # -DHAVE_TZNAME=0 # do not support "tzname"
+ # # -DHAVE_TZNAME=1 # support "tzname", which is defined by system library
+ # # -DHAVE_TZNAME=2 # support and define "tzname"
+-# # to the "CFLAGS=" line. "tzname" is required by POSIX 1988 and later.
++# # to the "CFLAGS=" line. "tzname" is required by POSIX.1-1988 and later.
+ # # If not defined, the code attempts to guess HAVE_TZNAME from other macros.
+ # # Warning: unless time_tz is also defined, HAVE_TZNAME=1 can cause
+ # # crashes when combined with some platforms' standard libraries,
+@@ -334,8 +363,8 @@
+ # # -DUSG_COMPAT=0 # do not support
+ # # -DUSG_COMPAT=1 # support, and variables are defined by system library
+ # # -DUSG_COMPAT=2 # support and define variables
+-# # to the "CFLAGS=" line; "timezone" and "daylight" are inspired by
+-# # Unix Systems Group code and are required by POSIX 2008 (with XSI) and later.
++# # to the "CFLAGS=" line; "timezone" and "daylight" are inspired by Unix
++# # Systems Group code and are required by POSIX.1-2008 and later (with XSI).
+ # # If not defined, the code attempts to guess USG_COMPAT from other macros.
+ # #
+ # # To support the external variable "altzone", add
+@@ -353,9 +382,11 @@
+ # functions to be added to the time conversion library.
+ # "offtime" is like "gmtime" except that it accepts a second (long) argument
+ # that gives an offset to add to the time_t when converting it.
+-# "timelocal" is equivalent to "mktime".
++# I.e., "offtime" is like calling "localtime_rz" with a fixed-offset zone.
++# "timelocal" is nearly equivalent to "mktime".
+ # "timeoff" is like "timegm" except that it accepts a second (long) argument
+ # that gives an offset to use when converting to a time_t.
++# I.e., "timeoff" is like calling "mktime_z" with a fixed-offset zone.
+ # "posix2time" and "time2posix" are described in an included manual page.
+ # X3J11's work does not describe any of these functions.
+ # These functions may well disappear in future releases of the time
+@@ -378,7 +409,7 @@
+ #
+ # NIST-PCTS:151-2, Version 1.4, (1993-12-03) is a test suite put
+ # out by the National Institute of Standards and Technology
+-# which claims to test C and Posix conformance. If you want to pass PCTS, add
++# which claims to test C and POSIX conformance. If you want to pass PCTS, add
+ # -DPCTS
+ # to the end of the "CFLAGS=" line.
+ #
+@@ -388,19 +419,33 @@
+ # 53 as a week number (rather than 52 or 53) for January days before
+ # January's first Monday when a "%V" format is used and January 1
+ # falls on a Friday, Saturday, or Sunday.
++#
++# POSIX says CFLAGS defaults to "-O 1".
++# Uncomment the following line and edit its contents as needed.
+
+-CFLAGS=
++#CFLAGS= -O 1
+
+-# Linker flags. Default to $(LFLAGS) for backwards compatibility
+-# to release 2012h and earlier.
+
+-LDFLAGS= $(LFLAGS)
++# The name of a POSIX-like library archiver, its flags, C compiler,
++# linker flags, and 'make' utility. Ordinarily the defaults suffice.
++# The commented-out values are the defaults specified by POSIX.1-202x/D4.
++#AR = ar
++#ARFLAGS = -rv
++#CC = c17
++#LDFLAGS =
++#MAKE = make
+
+ # For leap seconds, this Makefile uses LEAPSECONDS='-L leapseconds' in
+ # submake command lines. The default is no leap seconds.
+
+ LEAPSECONDS=
+
++# Where to fetch leap-seconds.list from.
++leaplist_URI = \
++ https://hpiers.obspm.fr/iers/bul/bulc/ntp/leap-seconds.list
++# The file is generated by the IERS Earth Orientation Centre, in Paris.
++leaplist_TZ = Europe/Paris
++
+ # The zic command and its arguments.
+
+ zic= ./zic
+@@ -418,22 +463,23 @@
+
+ ZIC_INSTALL= $(ZIC) -d '$(DESTDIR)$(TZDIR)' $(LEAPSECONDS)
+
+-# The name of a Posix-compliant 'awk' on your system.
++# The name of a POSIX-compliant 'awk' on your system.
+ # mawk 1.3.3 and Solaris 10 /usr/bin/awk do not work.
+ # Also, it is better (though not essential) if 'awk' supports UTF-8,
+ # and unfortunately mawk and busybox awk do not support UTF-8.
+ # Try AWK=gawk or AWK=nawk if your awk has the abovementioned problems.
+ AWK= awk
+
+-# The full path name of a Posix-compliant shell, preferably one that supports
++# The full path name of a POSIX-compliant shell, preferably one that supports
+ # the Korn shell's 'select' statement as an extension.
+ # These days, Bash is the most popular.
+ # It should be OK to set this to /bin/sh, on platforms where /bin/sh
+-# lacks 'select' or doesn't completely conform to Posix, but /bin/bash
++# lacks 'select' or doesn't completely conform to POSIX, but /bin/bash
+ # is typically nicer if it works.
+ KSHELL= /bin/bash
+
+-# Name of curl , used for HTML validation.
++# Name of curl , used for HTML validation
++# and to fetch leap-seconds.list from upstream.
+ CURL= curl
+
+ # Name of GNU Privacy Guard , used to sign distributions.
+@@ -503,17 +549,16 @@
+ DIFF_TZS= diff -u$$(! diff -u -F'^TZ=' - - <>/dev/null >&0 2>&1 \
+ || echo ' -F^TZ=')
+
+-###############################################################################
+-
+-#MAKE= make
++# ':' on typical hosts; 'ranlib' on the ancient hosts that still need ranlib.
++RANLIB= :
+
+-cc= cc
+-CC= $(cc) -DTZDIR='"$(TZDIR)"'
++# POSIX prohibits defining or using SHELL. However, csh users on systems
++# that use the user shell for Makefile commands may need to define SHELL.
++#SHELL= /bin/sh
+
+-AR= ar
++# End of macros that one plausibly might want to tailor.
++###############################################################################
+
+-# ':' on typical hosts; 'ranlib' on the ancient hosts that still need ranlib.
+-RANLIB= :
+
+ TZCOBJS= zic.o
+ TZDOBJS= zdump.o localtime.o asctime.o strftime.o
+@@ -543,7 +588,7 @@
+ NDATA= factory
+ TDATA_TO_CHECK= $(YDATA) $(NDATA) backward
+ TDATA= $(YDATA) $(NDATA) $(BACKWARD)
+-ZONETABLES= zone1970.tab zone.tab
++ZONETABLES= zone.tab zone1970.tab zonenow.tab
+ TABDATA= iso3166.tab $(TZDATA_TEXT) $(ZONETABLES)
+ LEAP_DEPS= leapseconds.awk leap-seconds.list
+ TZDATA_ZI_DEPS= ziguard.awk zishrink.awk version $(TDATA) \
+@@ -551,7 +596,7 @@
+ DSTDATA_ZI_DEPS= ziguard.awk $(TDATA) $(PACKRATDATA) $(PACKRATLIST)
+ DATA= $(TDATA_TO_CHECK) backzone iso3166.tab leap-seconds.list \
+ leapseconds $(ZONETABLES)
+-AWK_SCRIPTS= checklinks.awk checktab.awk leapseconds.awk \
++AWK_SCRIPTS= checklinks.awk checknow.awk checktab.awk leapseconds.awk \
+ ziguard.awk zishrink.awk
+ MISC= $(AWK_SCRIPTS)
+ TZS_YEAR= 2050
+@@ -572,7 +617,7 @@
+ calendars CONTRIBUTING LICENSE Makefile NEWS README SECURITY \
+ africa antarctica asctime.c asia australasia \
+ backward backzone \
+- checklinks.awk checktab.awk \
++ checklinks.awk checknow.awk checktab.awk \
+ date.1 date.c difftime.c \
+ etcetera europe factory iso3166.tab \
+ leap-seconds.list leapseconds.awk localtime.c \
+@@ -582,12 +627,7 @@
+ tzfile.5 tzfile.h tzselect.8 tzselect.ksh \
+ workman.sh zdump.8 zdump.c zic.8 zic.c \
+ ziguard.awk zishrink.awk \
+- zone.tab zone1970.tab
+-
+-# And for the benefit of csh users on systems that assume the user
+-# shell should be used to handle commands in Makefiles. . .
+-
+-SHELL= /bin/sh
++ zone.tab zone1970.tab zonenow.tab
+
+ all: tzselect zic zdump libtz.a $(TABDATA) \
+ vanguard.zi main.zi rearguard.zi
+@@ -657,6 +697,16 @@
+ $(DATAFORM).zi >$@.out
+ mv $@.out $@
+
++tzdir.h:
++ printf '%s\n' >$@.out \
++ '#ifndef TZDEFAULT' \
++ '# define TZDEFAULT "$(TZDEFAULT)" /* default zone */' \
++ '#endif' \
++ '#ifndef TZDIR' \
++ '# define TZDIR "$(TZDIR)" /* TZif directory */' \
++ '#endif'
++ mv $@.out $@
++
+ version.h: version
+ VERSION=`cat version` && printf '%s\n' \
+ 'static char const PKGVERSION[]="($(PACKAGE)) ";' \
+@@ -676,6 +726,28 @@
+ -f leapseconds.awk leap-seconds.list >$@.out
+ mv $@.out $@
+
++# Awk script to extract a Git-style author from leap-seconds.list comments.
++EXTRACT_AUTHOR = \
++ author_line { sub(/^.[[:space:]]*/, ""); \
++ sub(/:[[:space:]]*/, " <"); \
++ printf "%s>\n", $$0; \
++ success = 1; \
++ exit \
++ } \
++ /Questions or comments to:/ { author_line = 1 } \
++ END { exit !success }
++
++# Fetch leap-seconds.list from upstream.
++fetch-leap-seconds.list:
++ $(CURL) -OR $(leaplist_URI)
++
++# Fetch leap-seconds.list from upstream and commit it to the local repository.
++commit-leap-seconds.list: fetch-leap-seconds.list
++ author=$$($(AWK) '$(EXTRACT_AUTHOR)' leap-seconds.list) && \
++ date=$$(TZ=$(leaplist_TZ) stat -c%y leap-seconds.list) && \
++ git commit --author="$$author" --date="$$date" -m'make $@' \
++ leap-seconds.list
++
+ # Arguments to pass to submakes of install_data.
+ # They can be overridden by later submake arguments.
+ INSTALLARGS = \
+@@ -763,7 +835,7 @@
+
+ libtz.a: $(LIBOBJS)
+ rm -f $@
+- $(AR) -rc $@ $(LIBOBJS)
++ $(AR) $(ARFLAGS) $@ $(LIBOBJS)
+ $(RANLIB) $@
+
+ date: $(DATEOBJS)
+@@ -771,26 +843,32 @@
+
+ tzselect: tzselect.ksh version
+ VERSION=`cat version` && sed \
+- -e 's|#!/bin/bash|#!$(KSHELL)|g' \
+- -e 's|AWK=[^}]*|AWK='\''$(AWK)'\''|g' \
+- -e 's|\(PKGVERSION\)=.*|\1='\''($(PACKAGE)) '\''|' \
+- -e 's|\(REPORT_BUGS_TO\)=.*|\1=$(BUGEMAIL)|' \
+- -e 's|TZDIR=[^}]*|TZDIR=$(TZDIR)|' \
+- -e 's|\(TZVERSION\)=.*|\1='"$$VERSION"'|' \
+- <$@.ksh >$@.out
++ -e "s'#!/bin/bash'#!"'$(KSHELL)'\' \
++ -e s\''\(AWK\)=[^}]*'\''\1=\'\''$(AWK)\'\'\' \
++ -e s\''\(PKGVERSION\)=.*'\''\1=\'\''($(PACKAGE)) \'\'\' \
++ -e s\''\(REPORT_BUGS_TO\)=.*'\''\1=\'\''$(BUGEMAIL)\'\'\' \
++ -e s\''\(TZDIR\)=[^}]*'\''\1=\'\''$(TZDIR)\'\'\' \
++ -e s\''\(TZVERSION\)=.*'\''\1=\'"'$$VERSION\\''" \
++ <$@.ksh >$@.out
+ chmod +x $@.out
+ mv $@.out $@
+
+ check: check_back check_mild
+ check_mild: check_character_set check_white_space check_links \
+- check_name_lengths check_slashed_abbrs check_sorted \
++ check_name_lengths check_now \
++ check_slashed_abbrs check_sorted \
+ check_tables check_web check_ziguard check_zishrink check_tzs
+
++# True if UTF8_LOCALE does not work;
++# otherwise, false but with LC_ALL set to $(UTF8_LOCALE).
++UTF8_LOCALE_MISSING = \
++ { test ! '$(UTF8_LOCALE)' \
++ || ! printf 'A\304\200B\n' \
++ | LC_ALL='$(UTF8_LOCALE)' grep -q '^A.B$$' >/dev/null 2>&1 \
++ || { LC_ALL='$(UTF8_LOCALE)'; export LC_ALL; false; }; }
++
+ check_character_set: $(ENCHILADA)
+- test ! '$(UTF8_LOCALE)' || \
+- ! printf 'A\304\200B\n' | \
+- LC_ALL='$(UTF8_LOCALE)' grep -q '^A.B$$' >/dev/null 2>&1 || { \
+- LC_ALL='$(UTF8_LOCALE)' && export LC_ALL && \
++ $(UTF8_LOCALE_MISSING) || { \
+ sharp='#' && \
+ ! grep -Env $(SAFE_LINE) $(MANS) date.1 $(MANTXTS) \
+ $(MISC) $(SOURCES) $(WEB_PAGES) \
+@@ -805,12 +883,12 @@
+ touch $@
+
+ check_white_space: $(ENCHILADA)
++ $(UTF8_LOCALE_MISSING) || { \
+ patfmt=' \t|[\f\r\v]' && pat=`printf "$$patfmt\\n"` && \
+- ! grep -En "$$pat" \
+- $$(ls $(ENCHILADA) | grep -Fvx leap-seconds.list)
+- ! grep -n '[$s]$$' \
+- $$(ls $(ENCHILADA) | grep -Fvx leap-seconds.list)
+- touch $@
++ ! grep -En "$$pat|[$s]\$$" \
++ $$(ls $(ENCHILADA) | grep -Fvx leap-seconds.list); \
++ }
++ touch $@
+
+ PRECEDES_FILE_NAME = ^(Zone|Link[$s]+[^$s]+)[$s]+
+ FILE_NAME_COMPONENT_TOO_LONG = $(PRECEDES_FILE_NAME)[^$s]*[^/$s]{15}
+@@ -851,7 +929,29 @@
+ -f checklinks.awk tzdata.zi
+ touch $@
+
+-check_tables: checktab.awk $(YDATA) backward $(ZONETABLES)
++# Check timestamps from now through 28 years from now, to make sure
++# that zonenow.tab contains all sequences of planned timestamps,
++# without any duplicate sequences. In theory this might require
++# 2800 years but that would take a long time to check.
++CHECK_NOW_TIMESTAMP = `./date +%s`
++CHECK_NOW_FUTURE_YEARS = 28
++CHECK_NOW_FUTURE_SECS = $(CHECK_NOW_FUTURE_YEARS) '*' 366 '*' 24 '*' 60 '*' 60
++check_now: checknow.awk date tzdata.zi zdump zic zone1970.tab zonenow.tab
++ rm -fr $@.dir
++ mkdir $@.dir
++ ./zic -d $@.dir tzdata.zi
++ now=$(CHECK_NOW_TIMESTAMP) && \
++ future=`expr $(CHECK_NOW_FUTURE_SECS) + $$now` && \
++ ./zdump -i -t $$now,$$future \
++ $$(find $$PWD/$@.dir/????*/ -type f) \
++ >$@.dir/zdump.tab
++ $(AWK) \
++ -v zdump_table=$@.dir/zdump.tab \
++ -f checknow.awk zonenow.tab
++ rm -fr $@.dir
++ touch $@
++
++check_tables: checktab.awk $(YDATA) backward zone.tab zone1970.tab
+ for tab in $(ZONETABLES); do \
+ test "$$tab" = zone.tab && links='$(BACKWARD)' || links=''; \
+ $(AWK) -f checktab.awk -v zone_table=$$tab $(YDATA) $$links \
+@@ -911,10 +1011,10 @@
+ touch $@
+
+ clean_misc:
+- rm -fr check_*.dir
++ rm -fr check_*.dir typecheck_*.dir
+ rm -f *.o *.out $(TIME_T_ALTERNATIVES) \
+ check_* core typecheck_* \
+- date tzselect version.h zdump zic libtz.a
++ date tzdir.h tzselect version.h zdump zic libtz.a
+ clean: clean_misc
+ rm -fr *.dir tzdb-*/
+ rm -f *.zi $(TZS_NEW)
+@@ -952,12 +1052,18 @@
+ # plus N if GNU ls and touch are available.
+ SET_TIMESTAMP_N = sh -c '\
+ n=$$0 dest=$$1; shift; \
+- touch -cmr `ls -t "$$@" | sed 1q` "$$dest" && \
++ <"$$dest" && \
+ if test $$n != 0 && \
+- lsout=`ls -n --time-style="+%s" "$$dest" 2>/dev/null`; then \
++ lsout=`ls -nt --time-style="+%s" "$$@" 2>/dev/null`; then \
+ set x $$lsout && \
+- touch -cmd @`expr $$7 + $$n` "$$dest"; \
+- else :; fi'
++ timestamp=`expr $$7 + $$n` && \
++ echo "+ touch -md @$$timestamp $$dest" && \
++ touch -md @$$timestamp "$$dest"; \
++ else \
++ newest=`ls -t "$$@" | sed 1q` && \
++ echo "+ touch -mr $$newest $$dest" && \
++ touch -mr "$$newest" "$$dest"; \
++ fi'
+ # If DEST depends on A B C ... in this Makefile, callers should use
+ # $(SET_TIMESTAMP_DEP) DEST A B C ..., for the benefit of any
+ # downstream 'make' that considers equal timestamps to be out of date.
+@@ -982,8 +1088,12 @@
+ rm -f test.out && \
+ for file in $$files; do \
+ if git diff --quiet $$file; then \
+- time=`git log -1 --format='tformat:%ct' $$file` && \
+- touch -cmd @$$time $$file; \
++ time=`TZ=UTC0 git log -1 \
++ --format='tformat:%cd' \
++ --date='format:%Y-%m-%dT%H:%M:%SZ' \
++ $$file` && \
++ echo "+ touch -md $$time $$file" && \
++ touch -md $$time $$file; \
+ else \
+ echo >&2 "$$file: warning: does not match repository"; \
+ fi || exit; \
+@@ -1008,7 +1118,8 @@
+ rm -fr public.dir
+ mkdir public.dir
+ ln $(VERSION_DEPS) public.dir
+- cd public.dir && $(MAKE) CFLAGS='$(GCC_DEBUG_FLAGS)' ALL
++ cd public.dir \
++ && $(MAKE) CFLAGS='$(GCC_DEBUG_FLAGS)' TZDIR='$(TZDIR)' ALL
+ for i in $(TDATA_TO_CHECK) public.dir/tzdata.zi \
+ public.dir/vanguard.zi public.dir/main.zi \
+ public.dir/rearguard.zi; \
+@@ -1139,7 +1250,7 @@
+ sed '1s/$$/-rearguard/' $@.dir/version
+ : The dummy pacificnew pacifies TZUpdater 2.3.1 and earlier.
+ $(CREATE_EMPTY) $@.dir/pacificnew
+- touch -cmr version $@.dir/version
++ touch -mr version $@.dir/version
+ LC_ALL=C && export LC_ALL && \
+ (cd $@.dir && \
+ tar $(TARFLAGS) -cf - \
+@@ -1163,7 +1274,7 @@
+ `test $(DATAFORM) = vanguard || echo pacificnew`
+ (grep '^#' tzdata.zi && echo && cat $(DATAFORM).zi) \
+ >$@.dir/etcetera
+- touch -cmr tzdata.zi $@.dir/etcetera
++ touch -mr tzdata.zi $@.dir/etcetera
+ sed -n \
+ -e '/^# *version *\(.*\)/h' \
+ -e '/^# *ddeps */H' \
+@@ -1174,7 +1285,7 @@
+ -e 's/ /-/g' \
+ -e 'p' \
+ $@.dir/version
+- touch -cmr version $@.dir/version
++ touch -mr version $@.dir/version
+ links= && \
+ for file in $(TZDATA_DIST); do \
+ test -f $@.dir/$$file || links="$$links $$file"; \
+@@ -1226,15 +1337,16 @@
+ asctime.o: private.h tzfile.h
+ date.o: private.h
+ difftime.o: private.h
+-localtime.o: private.h tzfile.h
++localtime.o: private.h tzfile.h tzdir.h
+ strftime.o: private.h tzfile.h
+ zdump.o: version.h
+-zic.o: private.h tzfile.h version.h
++zic.o: private.h tzfile.h tzdir.h version.h
+
+ .PHONY: ALL INSTALL all
+ .PHONY: check check_mild check_time_t_alternatives
+ .PHONY: check_web check_zishrink
+-.PHONY: clean clean_misc dummy.zd force_tzs
++.PHONY: clean clean_misc commit-leap-seconds.list dummy.zd
++.PHONY: fetch-leap-seconds.list force_tzs
+ .PHONY: install install_data maintainer-clean names
+ .PHONY: posix_only posix_right public
+ .PHONY: rearguard_signatures rearguard_signatures_version
+--- contrib/tzdata/NEWS.orig
++++ contrib/tzdata/NEWS
+@@ -1,5 +1,177 @@
+ News for the tz database
+
++Release 2024a - 2024-02-01 09:28:56 -0800
++
++ Briefly:
++ Kazakhstan unifies on UTC+5 beginning 2024-03-01.
++ Palestine springs forward a week later after Ramadan.
++ zic no longer pretends to support indefinite-past DST.
++ localtime no longer mishandles Ciudad Juárez in 2422.
++
++ Changes to future timestamps
++
++ Kazakhstan unifies on UTC+5. This affects Asia/Almaty and
++ Asia/Qostanay which together represent the eastern portion of the
++ country that will transition from UTC+6 on 2024-03-01 at 00:00 to
++ join the western portion. (Thanks to Zhanbolat Raimbekov.)
++
++ Palestine springs forward a week later than previously predicted
++ in 2024 and 2025. (Thanks to Heba Hamad.) Change spring-forward
++ predictions to the second Saturday after Ramadan, not the first;
++ this also affects other predictions starting in 2039.
++
++ Changes to past timestamps
++
++ Asia/Ho_Chi_Minh's 1955-07-01 transition occurred at 01:00
++ not 00:00. (Thanks to Đoàn Trần Công Danh.)
++
++ From 1947 through 1949, Toronto's transitions occurred at 02:00
++ not 00:00. (Thanks to Chris Walton.)
++
++ In 1911 Miquelon adopted standard time on June 15, not May 15.
++
++ Changes to code
++
++ The FROM and TO columns of Rule lines can no longer be "minimum"
++ or an abbreviation of "minimum", because TZif files do not support
++ DST rules that extend into the indefinite past - although these
++ rules were supported when TZif files had only 32-bit data, this
++ stopped working when 64-bit TZif files were introduced in 1995.
++ This should not be a problem for realistic data, since DST was
++ first used in the 20th century. As a transition aid, FROM columns
++ like "minimum" are now diagnosed and then treated as if they were
++ the year 1900; this should suffice for TZif files on old systems
++ with only 32-bit time_t, and it is more compatible with bugs in
++ 2023c-and-earlier localtime.c. (Problem reported by Yoshito
++ Umaoka.)
++
++ localtime and related functions no longer mishandle some
++ timestamps that occur about 400 years after a switch to a time
++ zone with a DST schedule. In 2023d data this problem was visible
++ for some timestamps in November 2422, November 2822, etc. in
++ America/Ciudad_Juarez. (Problem reported by Gilmore Davidson.)
++
++ strftime %s now uses tm_gmtoff if available. (Problem and draft
++ patch reported by Dag-Erling Smørgrav.)
++
++ Changes to build procedure
++
++ The leap-seconds.list file is now copied from the IERS instead of
++ from its downstream counterpart at NIST, as the IERS version is
++ now in the public domain too and tends to be more up-to-date.
++ (Thanks to Martin Burnicki for liaisoning with the IERS.)
++
++ Changes to documentation
++
++ The strftime man page documents which struct tm members affect
++ which conversion specs, and that tzset is called. (Problems
++ reported by Robert Elz and Steve Summit.)
++
++
++Release 2023d - 2023-12-21 20:02:24 -0800
++
++ Briefly:
++ Ittoqqortoormiit, Greenland changes time zones on 2024-03-31.
++ Vostok, Antarctica changed time zones on 2023-12-18.
++ Casey, Antarctica changed time zones five times since 2020.
++ Code and data fixes for Palestine timestamps starting in 2072.
++ A new data file zonenow.tab for timestamps starting now.
++
++ Changes to future timestamps
++
++ Ittoqqortoormiit, Greenland (America/Scoresbysund) joins most of
++ the rest of Greenland's timekeeping practice on 2024-03-31, by
++ changing its time zone from -01/+00 to -02/-01 at the same moment
++ as the spring-forward transition. Its clocks will therefore not
++ spring forward as previously scheduled. The time zone change
++ reverts to its common practice before 1981.
++
++ Fix predictions for DST transitions in Palestine in 2072-2075,
++ correcting a typo introduced in 2023a.
++
++ Changes to past and future timestamps
++
++ Vostok, Antarctica changed to +05 on 2023-12-18. It had been at
++ +07 (not +06) for years. (Thanks to Zakhary V. Akulov.)
++
++ Change data for Casey, Antarctica to agree with timeanddate.com,
++ by adding five time zone changes since 2020. Casey is now at +08
++ instead of +11.
++
++ Changes to past tm_isdst flags
++
++ Much of Greenland, represented by America/Nuuk, changed its
++ standard time from -03 to -02 on 2023-03-25, not on 2023-10-28.
++ This does not affect UTC offsets, only the tm_isdst flag.
++ (Thanks to Thomas M. Steenholdt.)
++
++ New data file
++
++ A new data file zonenow.tab helps configure applications that use
++ timestamps dated from now on. This simplifies configuration,
++ since users choose from a smaller Zone set. The file's format is
++ experimental and subject to change.
++
++ Changes to code
++
++ localtime.c no longer mishandles TZif files that contain a single
++ transition into a DST regime. Previously, it incorrectly assumed
++ DST was in effect before the transition too. (Thanks to Alois
++ Treindl for debugging help.)
++
++ localtime.c's timeoff no longer collides with OpenBSD 7.4.
++
++ The C code now uses _Generic only if __STDC_VERSION__ says the
++ compiler is C11 or later.
++
++ tzselect now optionally reads zonenow.tab, to simplify when
++ configuring only for timestamps dated from now on.
++
++ tzselect no longer creates temporary files.
++
++ tzselect no longer mishandles the following:
++
++ Spaces and most other special characters in BUGEMAIL, PACKAGE,
++ TZDIR, and VERSION.
++
++ TZ strings when using mawk 1.4.3, which mishandles regular
++ expressions of the form /X{2,}/.
++
++ ISO 6709 coordinates when using an awk that lacks the GNU
++ extension of newlines in -v option-arguments.
++
++ Non UTF-8 locales when using an iconv command that lacks the GNU
++ //TRANSLIT extension.
++
++ zic no longer mishandles data for Palestine after the year 2075.
++ Previously, it incorrectly omitted post-2075 transitions that are
++ predicted for just before and just after Ramadan. (Thanks to Ken
++ Murchison for debugging help.)
++
++ zic now works again on Linux 2.6.16 and 2.6.17 (2006).
++ (Problem reported by Rune Torgersen.)
++
++ Changes to build procedure
++
++ The Makefile is now more compatible with POSIX:
++ * It no longer defines AR, CC, CFLAGS, LDFLAGS, and SHELL.
++ * It no longer uses its own 'cc' in place of CC.
++ * It now uses ARFLAGS, with default specified by POSIX.
++ * It does not use LFLAGS incompatibly with POSIX.
++ * It uses the special .POSIX target.
++ * It quotes special characters more carefully.
++ * It no longer mishandles builds in an ISO 8859 locale.
++ Due to the CC changes, TZDIR is now #defined in a file tzfile.h
++ built by 'make', not in a $(CC) -D option. Also, TZDEFAULT is
++ now treated like TZDIR as they have similar roles.
++
++ Changes to commentary
++
++ Limitations and hazards of the optional support for obsolescent
++ C89 platforms are documented better, along with a tentative
++ schedule for removing this support.
++
++
+ Release 2023c - 2023-03-28 12:42:14 -0700
+
+ Changes to past and future timestamps
+@@ -76,11 +248,14 @@
+ platform dependent and abbreviations were silently truncated to
+ 16 bytes even when the limit was greater than 16.
+
+- The code by default is now designed for C99 or later. To build in
+- a C89 environment, compile with -DPORT_TO_C89. To support C89
+- callers of the tzcode library, compile with -DSUPPORT_C89. The
+- two new macros are transitional aids planned to be removed in a
+- future version, when C99 or later will be required.
++ The code by default is now designed for C99 or later. To build on
++ a mostly-C89 platform, compile with -DPORT_TO_C89; this should
++ work on C89 platforms that also support C99 'long long' and
++ perhaps a few other extensions to C89. To support C89 callers of
++ tzcode's library, compile with -DSUPPORT_C89; however, this could
++ trigger latent bugs in C99-or-later callers. The two new macros
++ are transitional aids planned to be removed in a future version
++ (say, in 2029), when C99 or later will be required.
+
+ The code now builds again on pre-C99 platforms, if you compile
+ with -DPORT_TO_C89. This fixes a bug introduced in 2022f.
+@@ -723,6 +898,8 @@
+ them, set the EXPIRES_LINE Makefile variable. If a TZif file uses
+ this new feature it is marked with a new TZif version number 4,
+ a format intended to be documented in a successor to RFC 8536.
++ The old-format "#expires" comments are now treated solely as
++ comments and have no effect on the TZif files.
+
+ zic -L LEAPFILE -r @LO no longer generates an invalid TZif file
+ that omits leap second information for the range LO..B when LO
+@@ -4302,7 +4479,7 @@
+ now uses tz@iana.org rather than the old elsie address.
+
+ zic -v now complains about abbreviations that are less than 3
+- or more than 6 characters, as per Posix. Formerly, it checked
++ or more than 6 characters, as per POSIX. Formerly, it checked
+ for abbreviations that were more than 3.
+
+ 'make public' no longer puts its temporary directory under /tmp,
+@@ -4467,8 +4644,8 @@
+ In particular, the typos in comments in the data (2011-11-17 should have
+ been 2011-10-17 as Alan Barrett noted, and spelling of Tiraspol that
+ Tim Parenti noted) have been fixed, and the change for Ukraine has been
+- made in all 4 Ukrainian zones, rather than just Kiev (again, thanks to
+- Tim Parenti, and also Denys Gavrysh)
++ made in all 4 Ukrainian zones, rather than just Europe/Kiev
++ (again, thanks to Tim Parenti, and also Denys Gavrysh).
+
+ In addition, I added Europe/Tiraspol to zone.tab.
+
+--- contrib/tzdata/README.orig
++++ contrib/tzdata/README
+@@ -11,14 +11,17 @@
+ and daylight-saving rules.
+
+ See or the
+-file tz-link.html for how to acquire the code and data. Once acquired,
+-read the comments in the file 'Makefile' and make any changes needed
+-to make things right for your system, especially if you are using some
+-platform other than GNU/Linux. Then run the following commands,
+-substituting your desired installation directory for "$HOME/tzdir":
+-
+- make TOPDIR=$HOME/tzdir install
+- $HOME/tzdir/usr/bin/zdump -v America/Los_Angeles
++file tz-link.html for how to acquire the code and data.
++
++Once acquired, read the leading comments in the file "Makefile"
++and make any changes needed to make things right for your system,
++especially when using a platform other than current GNU/Linux.
++
++Then run the following commands, substituting your desired
++installation directory for "$HOME/tzdir":
++
++ make TOPDIR="$HOME/tzdir" install
++ "$HOME/tzdir/usr/bin/zdump" -v America/Los_Angeles
+
+ See the file tz-how-to.html for examples of how to read the data files.
+
+--- contrib/tzdata/africa.orig
++++ contrib/tzdata/africa
+@@ -30,6 +30,10 @@
+ # Milne J. Civil time. Geogr J. 1899 Feb;13(2):173-94.
+ # https://www.jstor.org/stable/1774359
+ #
++# For the 1911/1912 establishment of standard time in French possessions, see:
++# Société Française de Physique, Recueil de constantes physiques (1913),
++# page 752, 18b.
++#
+ # European-style abbreviations are commonly used along the Mediterranean.
+ # For sub-Saharan Africa abbreviations were less standardized.
+ # Previous editions of this database used WAT, CAT, SAT, and EAT
+@@ -113,7 +117,7 @@
+
+ # Chad
+ # Zone NAME STDOFF RULES FORMAT [UNTIL]
+-Zone Africa/Ndjamena 1:00:12 - LMT 1912 # N'Djamena
++Zone Africa/Ndjamena 1:00:12 - LMT 1912 Jan 1 # N'Djamena
+ 1:00 - WAT 1979 Oct 14
+ 1:00 1:00 WAST 1980 Mar 8
+ 1:00 - WAT
+@@ -139,7 +143,7 @@
+ # Inaccessible, Nightingale: uninhabited
+
+ # Zone NAME STDOFF RULES FORMAT [UNTIL]
+-Zone Africa/Abidjan -0:16:08 - LMT 1912
++Zone Africa/Abidjan -0:16:08 - LMT 1912 Jan 1
+ 0:00 - GMT
+
+ ###############################################################################
+@@ -285,13 +289,6 @@
+ # reproduced by other (more accessible) sites[, e.g.,]...
+ # http://elgornal.net/news/news.aspx?id=4699258
+
+-# From Paul Eggert (2014-06-04):
+-# Sarah El Deeb and Lee Keath of AP report that the Egyptian government says
+-# the change is because of blackouts in Cairo, even though Ahram Online (cited
+-# above) says DST had no affect on electricity consumption. There is
+-# no information about when DST will end this fall. See:
+-# http://abcnews.go.com/International/wireStory/el-sissi-pushes-egyptians-line-23614833
+-
+ # From Steffen Thorsen (2015-04-08):
+ # Egypt will start DST on midnight after Thursday, April 30, 2015.
+ # This is based on a law (no 35) from May 15, 2014 saying it starts the last
+--- contrib/tzdata/antarctica.orig
++++ contrib/tzdata/antarctica
+@@ -80,6 +80,11 @@
+ # - 2018 Oct 7 4:00 - 2019 Mar 17 3:00 - 2019 Oct 4 3:00 - 2020 Mar 8 3:00
+ # and now - 2020 Oct 4 0:01
+
++# From Paul Eggert (2023-12-20):
++# Transitions from 2021 on are taken from:
++# https://www.timeanddate.com/time/zone/antarctica/casey
++# retrieved at various dates.
++
+ # Zone NAME STDOFF RULES FORMAT [UNTIL]
+ Zone Antarctica/Casey 0 - -00 1969
+ 8:00 - +08 2009 Oct 18 2:00
+@@ -93,7 +98,12 @@
+ 8:00 - +08 2019 Oct 4 3:00
+ 11:00 - +11 2020 Mar 8 3:00
+ 8:00 - +08 2020 Oct 4 0:01
+- 11:00 - +11
++ 11:00 - +11 2021 Mar 14 0:00
++ 8:00 - +08 2021 Oct 3 0:01
++ 11:00 - +11 2022 Mar 13 0:00
++ 8:00 - +08 2022 Oct 2 0:01
++ 11:00 - +11 2023 Mar 9 3:00
++ 8:00 - +08
+ Zone Antarctica/Davis 0 - -00 1957 Jan 13
+ 7:00 - +07 1964 Nov
+ 0 - -00 1969 Feb
+@@ -240,7 +250,50 @@
+ # year-round from 1960/61 to 1992
+
+ # Vostok, since 1957-12-16, temporarily closed 1994-02/1994-11
+-# See Asia/Urumqi.
++# From Craig Mundell (1994-12-15):
++# http://quest.arc.nasa.gov/antarctica/QA/computers/Directions,Time,ZIP
++# Vostok, which is one of the Russian stations, is set on the same
++# time as Moscow, Russia.
++#
++# From Lee Hotz (2001-03-08):
++# I queried the folks at Columbia who spent the summer at Vostok and this is
++# what they had to say about time there:
++# "in the US Camp (East Camp) we have been on New Zealand (McMurdo)
++# time, which is 12 hours ahead of GMT. The Russian Station Vostok was
++# 6 hours behind that (although only 2 miles away, i.e. 6 hours ahead
++# of GMT). This is a time zone I think two hours east of Moscow. The
++# natural time zone is in between the two: 8 hours ahead of GMT."
++#
++# From Paul Eggert (2001-05-04):
++# This seems to be hopelessly confusing, so I asked Lee Hotz about it
++# in person. He said that some Antarctic locations set their local
++# time so that noon is the warmest part of the day, and that this
++# changes during the year and does not necessarily correspond to mean
++# solar noon. So the Vostok time might have been whatever the clocks
++# happened to be during their visit. So we still don't really know what time
++# it is at Vostok.
++#
++# From Zakhary V. Akulov (2023-12-17 22:00:48 +0700):
++# ... from December, 18, 2023 00:00 by my decision the local time of
++# the Antarctic research base Vostok will correspond to UTC+5.
++# (2023-12-19): We constantly interact with Progress base, with company who
++# builds new wintering station, with sledge convoys, with aviation - they all
++# use UTC+5. Besides, difference between Moscow time is just 2 hours now, not 4.
++# (2023-12-19, in response to the question "Has local time at Vostok
++# been UTC+6 ever since 1957, or has it changed before?"): No. At least
++# since my antarctic career start, 10 years ago, Vostok base has UTC+7.
++# (In response to a 2023-12-18 question "from 02:00 to 00:00 today"): This.
++#
++# From Paul Eggert (2023-12-18):
++# For lack of better info, guess Vostok was at +07 from founding through today,
++# except when closed.
++
++# Zone NAME STDOFF RULES FORMAT [UNTIL]
++Zone Antarctica/Vostok 0 - -00 1957 Dec 16
++ 7:00 - +07 1994 Feb
++ 0 - -00 1994 Nov
++ 7:00 - +07 2023 Dec 18 2:00
++ 5:00 - +05
+
+ # S Africa - year-round bases
+ # Marion Island, -4653+03752
+--- contrib/tzdata/asia.orig
++++ contrib/tzdata/asia
+@@ -655,7 +655,6 @@
+ 8:00 PRC C%sT
+ # Xinjiang time, used by many in western China; represented by Ürümqi / Ürümchi
+ # / Wulumuqi. (Please use Asia/Shanghai if you prefer Beijing time.)
+-# Vostok base in Antarctica matches this since 1970.
+ Zone Asia/Urumqi 5:50:20 - LMT 1928
+ 6:00 - +06
+
+@@ -2458,18 +2457,33 @@
+ # effective December 21st, 2018....
+ # http://adilet.zan.kz/rus/docs/P1800000817 (russian language).
+
++# From Zhanbolat Raimbekov (2024-01-19):
++# Kazakhstan (all parts) switching to UTC+5 on March 1, 2024
++# https://www.gov.kz/memleket/entities/mti/press/news/details/688998?lang=ru
++# [in Russian]
++# (2024-01-20): https://primeminister.kz/ru/decisions/19012024-20
++#
++# From Alexander Krivenyshev (2024-01-19):
++# According to a different news and the official web site for the Ministry of
++# Trade and Integration of the Republic of Kazakhstan:
++# https://en.inform.kz/news/kazakhstan-to-switch-to-single-hour-zone-mar-1-54ad0b/
++
+ # Zone NAME STDOFF RULES FORMAT [UNTIL]
+ #
+ # Almaty (formerly Alma-Ata), representing most locations in Kazakhstan
+-# This includes KZ-AKM, KZ-ALA, KZ-ALM, KZ-AST, KZ-BAY, KZ-VOS, KZ-ZHA,
+-# KZ-KAR, KZ-SEV, KZ-PAV, and KZ-YUZ.
++# This includes Abai/Abay (ISO 3166-2 code KZ-10), Aqmola/Akmola (KZ-11),
++# Almaty (KZ-19), Almaty city (KZ-75), Astana city (KZ-71),
++# East Kazkhstan (KZ-63), Jambyl/Zhambyl (KZ-31), Jetisu/Zhetysu (KZ-33),
++# Karaganda (KZ-35), North Kazakhstan (KZ-59), Pavlodar (KZ-55),
++# Shyumkent city (KZ-79), Turkistan (KZ-61), and Ulytau (KZ-62).
+ Zone Asia/Almaty 5:07:48 - LMT 1924 May 2 # or Alma-Ata
+ 5:00 - +05 1930 Jun 21
+ 6:00 RussiaAsia +06/+07 1991 Mar 31 2:00s
+ 5:00 RussiaAsia +05/+06 1992 Jan 19 2:00s
+ 6:00 RussiaAsia +06/+07 2004 Oct 31 2:00s
+- 6:00 - +06
+-# Qyzylorda (aka Kyzylorda, Kizilorda, Kzyl-Orda, etc.) (KZ-KZY)
++ 6:00 - +06 2024 Mar 1 0:00
++ 5:00 - +05
++# Qyzylorda (aka Kyzylorda, Kizilorda, Kzyl-Orda, etc.) (KZ-43)
+ Zone Asia/Qyzylorda 4:21:52 - LMT 1924 May 2
+ 4:00 - +04 1930 Jun 21
+ 5:00 - +05 1981 Apr 1
+@@ -2482,8 +2496,7 @@
+ 5:00 RussiaAsia +05/+06 2004 Oct 31 2:00s
+ 6:00 - +06 2018 Dec 21 0:00
+ 5:00 - +05
+-#
+-# Qostanay (aka Kostanay, Kustanay) (KZ-KUS)
++# Qostanay (aka Kostanay, Kustanay) (KZ-39)
+ # The 1991/2 rules are unclear partly because of the 1997 Turgai
+ # reorganization.
+ Zone Asia/Qostanay 4:14:28 - LMT 1924 May 2
+@@ -2494,9 +2507,9 @@
+ 5:00 RussiaAsia +05/+06 1991 Mar 31 2:00s
+ 4:00 RussiaAsia +04/+05 1992 Jan 19 2:00s
+ 5:00 RussiaAsia +05/+06 2004 Oct 31 2:00s
+- 6:00 - +06
+-
+-# Aqtöbe (aka Aktobe, formerly Aktyubinsk) (KZ-AKT)
++ 6:00 - +06 2024 Mar 1 0:00
++ 5:00 - +05
++# Aqtöbe (aka Aktobe, formerly Aktyubinsk) (KZ-15)
+ Zone Asia/Aqtobe 3:48:40 - LMT 1924 May 2
+ 4:00 - +04 1930 Jun 21
+ 5:00 - +05 1981 Apr 1
+@@ -2506,7 +2519,7 @@
+ 4:00 RussiaAsia +04/+05 1992 Jan 19 2:00s
+ 5:00 RussiaAsia +05/+06 2004 Oct 31 2:00s
+ 5:00 - +05
+-# Mangghystaū (KZ-MAN)
++# Mangghystaū (KZ-47)
+ # Aqtau was not founded until 1963, but it represents an inhabited region,
+ # so include timestamps before 1963.
+ Zone Asia/Aqtau 3:21:04 - LMT 1924 May 2
+@@ -2518,7 +2531,7 @@
+ 5:00 RussiaAsia +05/+06 1994 Sep 25 2:00s
+ 4:00 RussiaAsia +04/+05 2004 Oct 31 2:00s
+ 5:00 - +05
+-# Atyraū (KZ-ATY) is like Mangghystaū except it switched from
++# Atyraū (KZ-23) is like Mangghystaū except it switched from
+ # +04/+05 to +05/+06 in spring 1999, not fall 1994.
+ Zone Asia/Atyrau 3:27:44 - LMT 1924 May 2
+ 3:00 - +03 1930 Jun 21
+@@ -2529,7 +2542,7 @@
+ 5:00 RussiaAsia +05/+06 1999 Mar 28 2:00s
+ 4:00 RussiaAsia +04/+05 2004 Oct 31 2:00s
+ 5:00 - +05
+-# West Kazakhstan (KZ-ZAP)
++# West Kazakhstan (KZ-27)
+ # From Paul Eggert (2016-03-18):
+ # The 1989 transition is from USSR act No. 227 (1989-03-14).
+ Zone Asia/Oral 3:25:24 - LMT 1924 May 2 # or Ural'sk
+@@ -3427,20 +3440,30 @@
+ # From Heba Hamad (2023-03-22):
+ # ... summer time will begin in Palestine from Saturday 04-29-2023,
+ # 02:00 AM by 60 minutes forward.
+-#
+-# From Paul Eggert (2023-03-22):
++# From Heba Hemad (2023-10-09):
++# ... winter time will begin in Palestine from Saturday 10-28-2023,
++# 02:00 AM by 60 minutes back.
++#
++# From Heba Hamad (2024-01-25):
++# the summer time for the years 2024,2025 will begin in Palestine
++# from Saturday at 02:00 AM by 60 minutes forward as shown below:
++# year date
++# 2024 2024-04-20
++# 2025 2025-04-12
++#
++# From Paul Eggert (2024-01-25):
+ # For now, guess that spring and fall transitions will normally
+ # continue to use 2022's rules, that during DST Palestine will switch
+ # to standard time at 02:00 the last Saturday before Ramadan and back
+-# to DST at 02:00 the first Saturday after Ramadan, and that
++# to DST at 02:00 the second Saturday after Ramadan, and that
+ # if the normal spring-forward or fall-back transition occurs during
+ # Ramadan the former is delayed and the latter advanced.
+ # To implement this, I predicted Ramadan-oriented transition dates for
+-# 2023 through 2086 by running the following program under GNU Emacs 28.2,
++# 2026 through 2086 by running the following program under GNU Emacs 29.2,
+ # with the results integrated by hand into the table below.
+ # Predictions after 2086 are approximated without Ramadan.
+ #
+-# (let ((islamic-year 1444))
++# (let ((islamic-year 1447))
+ # (require 'cal-islam)
+ # (while (< islamic-year 1510)
+ # (let ((a (calendar-islamic-to-absolute (list 9 1 islamic-year)))
+@@ -3449,6 +3472,7 @@
+ # (while (/= saturday (mod (setq a (1- a)) 7)))
+ # (while (/= saturday (mod b 7))
+ # (setq b (1+ b)))
++# (setq b (+ 7 b))
+ # (setq a (calendar-gregorian-from-absolute a))
+ # (setq b (calendar-gregorian-from-absolute b))
+ # (insert
+@@ -3499,84 +3523,84 @@
+ Rule Palestine 2022 only - Mar 27 0:00 1:00 S
+ Rule Palestine 2022 2035 - Oct Sat<=30 2:00 0 -
+ Rule Palestine 2023 only - Apr 29 2:00 1:00 S
+-Rule Palestine 2024 only - Apr 13 2:00 1:00 S
+-Rule Palestine 2025 only - Apr 5 2:00 1:00 S
++Rule Palestine 2024 only - Apr 20 2:00 1:00 S
++Rule Palestine 2025 only - Apr 12 2:00 1:00 S
+ Rule Palestine 2026 2054 - Mar Sat<=30 2:00 1:00 S
+ Rule Palestine 2036 only - Oct 18 2:00 0 -
+ Rule Palestine 2037 only - Oct 10 2:00 0 -
+ Rule Palestine 2038 only - Sep 25 2:00 0 -
+ Rule Palestine 2039 only - Sep 17 2:00 0 -
+-Rule Palestine 2039 only - Oct 22 2:00 1:00 S
+-Rule Palestine 2039 2067 - Oct Sat<=30 2:00 0 -
+ Rule Palestine 2040 only - Sep 1 2:00 0 -
+-Rule Palestine 2040 only - Oct 13 2:00 1:00 S
++Rule Palestine 2040 only - Oct 20 2:00 1:00 S
++Rule Palestine 2040 2067 - Oct Sat<=30 2:00 0 -
+ Rule Palestine 2041 only - Aug 24 2:00 0 -
+-Rule Palestine 2041 only - Sep 28 2:00 1:00 S
++Rule Palestine 2041 only - Oct 5 2:00 1:00 S
+ Rule Palestine 2042 only - Aug 16 2:00 0 -
+-Rule Palestine 2042 only - Sep 20 2:00 1:00 S
++Rule Palestine 2042 only - Sep 27 2:00 1:00 S
+ Rule Palestine 2043 only - Aug 1 2:00 0 -
+-Rule Palestine 2043 only - Sep 12 2:00 1:00 S
++Rule Palestine 2043 only - Sep 19 2:00 1:00 S
+ Rule Palestine 2044 only - Jul 23 2:00 0 -
+-Rule Palestine 2044 only - Aug 27 2:00 1:00 S
++Rule Palestine 2044 only - Sep 3 2:00 1:00 S
+ Rule Palestine 2045 only - Jul 15 2:00 0 -
+-Rule Palestine 2045 only - Aug 19 2:00 1:00 S
++Rule Palestine 2045 only - Aug 26 2:00 1:00 S
+ Rule Palestine 2046 only - Jun 30 2:00 0 -
+-Rule Palestine 2046 only - Aug 11 2:00 1:00 S
++Rule Palestine 2046 only - Aug 18 2:00 1:00 S
+ Rule Palestine 2047 only - Jun 22 2:00 0 -
+-Rule Palestine 2047 only - Jul 27 2:00 1:00 S
++Rule Palestine 2047 only - Aug 3 2:00 1:00 S
+ Rule Palestine 2048 only - Jun 6 2:00 0 -
+-Rule Palestine 2048 only - Jul 18 2:00 1:00 S
++Rule Palestine 2048 only - Jul 25 2:00 1:00 S
+ Rule Palestine 2049 only - May 29 2:00 0 -
+-Rule Palestine 2049 only - Jul 3 2:00 1:00 S
++Rule Palestine 2049 only - Jul 10 2:00 1:00 S
+ Rule Palestine 2050 only - May 21 2:00 0 -
+-Rule Palestine 2050 only - Jun 25 2:00 1:00 S
++Rule Palestine 2050 only - Jul 2 2:00 1:00 S
+ Rule Palestine 2051 only - May 6 2:00 0 -
+-Rule Palestine 2051 only - Jun 17 2:00 1:00 S
++Rule Palestine 2051 only - Jun 24 2:00 1:00 S
+ Rule Palestine 2052 only - Apr 27 2:00 0 -
+-Rule Palestine 2052 only - Jun 1 2:00 1:00 S
++Rule Palestine 2052 only - Jun 8 2:00 1:00 S
+ Rule Palestine 2053 only - Apr 12 2:00 0 -
+-Rule Palestine 2053 only - May 24 2:00 1:00 S
++Rule Palestine 2053 only - May 31 2:00 1:00 S
+ Rule Palestine 2054 only - Apr 4 2:00 0 -
+-Rule Palestine 2054 only - May 16 2:00 1:00 S
+-Rule Palestine 2055 only - May 1 2:00 1:00 S
+-Rule Palestine 2056 only - Apr 22 2:00 1:00 S
+-Rule Palestine 2057 only - Apr 7 2:00 1:00 S
+-Rule Palestine 2058 max - Mar Sat<=30 2:00 1:00 S
++Rule Palestine 2054 only - May 23 2:00 1:00 S
++Rule Palestine 2055 only - May 8 2:00 1:00 S
++Rule Palestine 2056 only - Apr 29 2:00 1:00 S
++Rule Palestine 2057 only - Apr 14 2:00 1:00 S
++Rule Palestine 2058 only - Apr 6 2:00 1:00 S
++Rule Palestine 2059 max - Mar Sat<=30 2:00 1:00 S
+ Rule Palestine 2068 only - Oct 20 2:00 0 -
+ Rule Palestine 2069 only - Oct 12 2:00 0 -
+ Rule Palestine 2070 only - Oct 4 2:00 0 -
+ Rule Palestine 2071 only - Sep 19 2:00 0 -
+ Rule Palestine 2072 only - Sep 10 2:00 0 -
+-Rule Palestine 2072 only - Oct 15 2:00 1:00 S
++Rule Palestine 2072 only - Oct 22 2:00 1:00 S
++Rule Palestine 2072 max - Oct Sat<=30 2:00 0 -
+ Rule Palestine 2073 only - Sep 2 2:00 0 -
+-Rule Palestine 2073 only - Oct 7 2:00 1:00 S
++Rule Palestine 2073 only - Oct 14 2:00 1:00 S
+ Rule Palestine 2074 only - Aug 18 2:00 0 -
+-Rule Palestine 2074 only - Sep 29 2:00 1:00 S
++Rule Palestine 2074 only - Oct 6 2:00 1:00 S
+ Rule Palestine 2075 only - Aug 10 2:00 0 -
+-Rule Palestine 2075 only - Sep 14 2:00 1:00 S
+-Rule Palestine 2075 max - Oct Sat<=30 2:00 0 -
++Rule Palestine 2075 only - Sep 21 2:00 1:00 S
+ Rule Palestine 2076 only - Jul 25 2:00 0 -
+-Rule Palestine 2076 only - Sep 5 2:00 1:00 S
++Rule Palestine 2076 only - Sep 12 2:00 1:00 S
+ Rule Palestine 2077 only - Jul 17 2:00 0 -
+-Rule Palestine 2077 only - Aug 28 2:00 1:00 S
++Rule Palestine 2077 only - Sep 4 2:00 1:00 S
+ Rule Palestine 2078 only - Jul 9 2:00 0 -
+-Rule Palestine 2078 only - Aug 13 2:00 1:00 S
++Rule Palestine 2078 only - Aug 20 2:00 1:00 S
+ Rule Palestine 2079 only - Jun 24 2:00 0 -
+-Rule Palestine 2079 only - Aug 5 2:00 1:00 S
++Rule Palestine 2079 only - Aug 12 2:00 1:00 S
+ Rule Palestine 2080 only - Jun 15 2:00 0 -
+-Rule Palestine 2080 only - Jul 20 2:00 1:00 S
++Rule Palestine 2080 only - Jul 27 2:00 1:00 S
+ Rule Palestine 2081 only - Jun 7 2:00 0 -
+-Rule Palestine 2081 only - Jul 12 2:00 1:00 S
++Rule Palestine 2081 only - Jul 19 2:00 1:00 S
+ Rule Palestine 2082 only - May 23 2:00 0 -
+-Rule Palestine 2082 only - Jul 4 2:00 1:00 S
++Rule Palestine 2082 only - Jul 11 2:00 1:00 S
+ Rule Palestine 2083 only - May 15 2:00 0 -
+-Rule Palestine 2083 only - Jun 19 2:00 1:00 S
++Rule Palestine 2083 only - Jun 26 2:00 1:00 S
+ Rule Palestine 2084 only - Apr 29 2:00 0 -
+-Rule Palestine 2084 only - Jun 10 2:00 1:00 S
++Rule Palestine 2084 only - Jun 17 2:00 1:00 S
+ Rule Palestine 2085 only - Apr 21 2:00 0 -
+-Rule Palestine 2085 only - Jun 2 2:00 1:00 S
++Rule Palestine 2085 only - Jun 9 2:00 1:00 S
+ Rule Palestine 2086 only - Apr 13 2:00 0 -
+-Rule Palestine 2086 only - May 18 2:00 1:00 S
++Rule Palestine 2086 only - May 25 2:00 1:00 S
+
+ # Zone NAME STDOFF RULES FORMAT [UNTIL]
+ Zone Asia/Gaza 2:17:52 - LMT 1900 Oct
+@@ -3604,7 +3628,7 @@
+
+ # Philippines
+
+-# From Paul Eggert (2018-11-18):
++# From Paul Eggert (2024-01-21):
+ # The Spanish initially used American (west-of-Greenwich) time.
+ # It is unknown what time Manila kept when the British occupied it from
+ # 1762-10-06 through 1764-04; for now assume it kept American time.
+@@ -3612,7 +3636,7 @@
+ # Philippines, issued a proclamation announcing that 1844-12-30 was to
+ # be immediately followed by 1845-01-01; see R.H. van Gent's
+ # History of the International Date Line
+-# https://www.staff.science.uu.nl/~gent0113/idl/idl_philippines.htm
++# https://webspace.science.uu.nl/~gent0113/idl/idl_philippines.htm
+ # The rest of the data entries are from Shanks & Pottenger.
+
+ # From Jesper Nørgaard Welen (2006-04-26):
+@@ -4039,7 +4063,8 @@
+ # The English-language name of Vietnam's most populous city is "Ho Chi Minh
+ # City"; use Ho_Chi_Minh below to avoid a name of more than 14 characters.
+
+-# From Paul Eggert (2022-07-27) after a 2014 heads-up from Trần Ngọc Quân:
++# From Paul Eggert (2024-01-14) after a 2014 heads-up from Trần Ngọc Quân
++# and a 2024-01-14 heads-up from Đoàn Trần Công Danh:
+ # Trần Tiến Bình's authoritative book "Lịch Việt Nam: thế kỷ XX-XXI (1901-2100)"
+ # (Nhà xuất bản Văn Hoá - Thông Tin, Hanoi, 2005), pp 49-50,
+ # is quoted verbatim in:
+@@ -4069,14 +4094,35 @@
+ #
+ # Trần cites the following sources; it's unclear which supplied the info above.
+ #
+-# Hoàng Xuân Hãn: "Lịch và lịch Việt Nam". Tập san Khoa học Xã hội,
+-# No. 9, Paris, February 1982.
++# Hoàng Xuân Hãn: "Lịch và lịch Việt Nam". Tập san Khoa học Xã hội,
++# No. 9, Paris, February 1982.
++#
++# Lê Thành Lân: "Lịch và niên biểu lịch sử hai mươi thế kỷ (0001-2010)",
++# NXB Thống kê, Hanoi, 2000.
+ #
+-# Lê Thành Lân: "Lịch và niên biểu lịch sử hai mươi thế kỷ (0001-2010)",
+-# NXB Thống kê, Hanoi, 2000.
++# Lê Thành Lân: "Lịch hai thế kỷ (1802-2010) và các lịch vĩnh cửu",
++# NXB Thuận Hoá, Huế, 1995.
+ #
+-# Lê Thành Lân: "Lịch hai thế kỷ (1802-2010) và các lịch vĩnh cửu",
+-# NXB Thuận Hoá, Huế, 1995.
++# Here is the decision for the September 1945 transition:
++# Võ Nguyên Giáp, Việt Nam Dân Quốc Công Báo, No. 1 (1945-09-29), page 13
++# http://baochi.nlv.gov.vn/baochi/cgi-bin/baochi?a=d&d=JwvzO19450929.2.5&dliv=none
++# It says that on 1945-09-01 at 24:00, Vietnam moved back two hours, to +07.
++# It also mentions a 1945-03-29 decree (by a Japanese Goveror-General)
++# to set the time zone to +09, but does not say whether that decree
++# merely legalized an earlier change to +09.
++#
++# July 1955 transition:
++# Ngô Đình Diệm, Công Báo Việt Nam, No. 92 (1955-07-02), page 1780-1781
++# Ordinance (Dụ) No. 46 (1955-06-25)
++# http://ddsnext.crl.edu/titles/32341#?c=0&m=29&s=0&cv=4&r=0&xywh=-89%2C342%2C1724%2C1216
++# It says that on 1955-07-01 at 01:00, South Vietnam moved back 1 hour (to +07).
++#
++# December 1959 transition:
++# Ngô Đình Diệm, Công Báo Việt Nam Cộng Hòa, 1960 part 1 (1960-01-02), page 62
++# Decree (Sắc lệnh) No. 362-TTP (1959-12-30)
++# http://ddsnext.crl.edu/titles/32341#?c=0&m=138&s=0&cv=793&r=0&xywh=-54%2C1504%2C1705%2C1202
++# It says that on 1959-12-31 at 23:00, South Vietnam moved forward 1 hour (to +08).
++
+
+ # Zone NAME STDOFF RULES FORMAT [UNTIL]
+ #STDOFF 7:06:30.13
+@@ -4084,9 +4130,9 @@
+ 7:06:30 - PLMT 1911 May 1 # Phù Liễn MT
+ 7:00 - +07 1942 Dec 31 23:00
+ 8:00 - +08 1945 Mar 14 23:00
+- 9:00 - +09 1945 Sep 2
++ 9:00 - +09 1945 Sep 1 24:00
+ 7:00 - +07 1947 Apr 1
+- 8:00 - +08 1955 Jul 1
++ 8:00 - +08 1955 Jul 1 01:00
+ 7:00 - +07 1959 Dec 31 23:00
+ 8:00 - +08 1975 Jun 13
+ 7:00 - +07
+--- contrib/tzdata/australasia.orig
++++ contrib/tzdata/australasia
+@@ -391,8 +391,14 @@
+ # Please note that there will not be any daylight savings time change
+ # in Fiji for 2022-2023....
+ # https://www.facebook.com/FijianGovernment/posts/pfbid0mmWVTYmTibn66ybpFda75pDcf34SSpoSaskJW5gXwaKo5Sgc7273Q4fXWc6kQV6Hl
++
++# From Almaz Mingaleev (2023-10-06):
++# Cabinet approved the suspension of Daylight Saving and appropriate
++# legislative changes will be considered including the repeal of the
++# Daylight Saving Act 1998
++# https://www.fiji.gov.fj/Media-Centre/Speeches/English/CABINET-DECISIONS-3-OCTOBER-2023
+ #
+-# From Paul Eggert (2022-10-27):
++# From Paul Eggert (2023-10-06):
+ # For now, assume DST is suspended indefinitely.
+
+ # Rule NAME FROM TO - IN ON AT SAVE LETTER/S
+@@ -414,11 +420,11 @@
+
+ # French Polynesia
+ # Zone NAME STDOFF RULES FORMAT [UNTIL]
+-Zone Pacific/Gambier -8:59:48 - LMT 1912 Oct # Rikitea
++Zone Pacific/Gambier -8:59:48 - LMT 1912 Oct 1 # Rikitea
+ -9:00 - -09
+-Zone Pacific/Marquesas -9:18:00 - LMT 1912 Oct
++Zone Pacific/Marquesas -9:18:00 - LMT 1912 Oct 1
+ -9:30 - -0930
+-Zone Pacific/Tahiti -9:58:16 - LMT 1912 Oct # Papeete
++Zone Pacific/Tahiti -9:58:16 - LMT 1912 Oct 1 # Papeete
+ -10:00 - -10
+ # Clipperton (near North America) is administered from French Polynesia;
+ # it is uninhabited.
+@@ -796,7 +802,7 @@
+ # Solomon Is
+ # excludes Bougainville, for which see Papua New Guinea
+ # Zone NAME STDOFF RULES FORMAT [UNTIL]
+-Zone Pacific/Guadalcanal 10:39:48 - LMT 1912 Oct # Honiara
++Zone Pacific/Guadalcanal 10:39:48 - LMT 1912 Oct 1 # Honiara
+ 11:00 - +11
+
+ # Tokelau
+@@ -957,6 +963,10 @@
+ # Milne J. Civil time. Geogr J. 1899 Feb;13(2):173-94.
+ # https://www.jstor.org/stable/1774359
+ #
++# For the 1911/1912 establishment of standard time in French possessions, see:
++# Société Française de Physique, Recueil de constantes physiques (1913),
++# page 752, 18b.
++#
+ # A reliable and entertaining source about time zones is
+ # Derek Howse, Greenwich time and longitude, Philip Wilson Publishers (1997).
+ #
+@@ -2033,7 +2043,7 @@
+ # ordaining - by a masterpiece of diplomatic flattery - that
+ # the Fourth of July should be celebrated twice in that year."
+ # This happened in 1892, according to the Evening News (Sydney) of 1892-07-20.
+-# https://www.staff.science.uu.nl/~gent0113/idl/idl.htm
++# https://webspace.science.uu.nl/~gent0113/idl/idl_alaska_samoa.htm
+
+ # Although Shanks & Pottenger says they both switched to UT -11:30
+ # in 1911, and to -11 in 1950. many earlier sources give -11
+--- contrib/tzdata/backward.orig
++++ contrib/tzdata/backward
+@@ -205,7 +205,6 @@
+ Link Pacific/Port_Moresby Antarctica/DumontDUrville
+ Link Pacific/Auckland Antarctica/McMurdo
+ Link Asia/Riyadh Antarctica/Syowa
+-Link Asia/Urumqi Antarctica/Vostok
+ Link Europe/Berlin Arctic/Longyearbyen
+ Link Asia/Riyadh Asia/Aden
+ Link Asia/Qatar Asia/Bahrain
+--- contrib/tzdata/backzone.orig
++++ contrib/tzdata/backzone
+@@ -963,35 +963,6 @@
+ Zone Antarctica/Syowa 0 - -00 1957 Jan 29
+ 3:00 - +03
+
+-# Vostok, Antarctica
+-#
+-# Vostok, since 1957-12-16, temporarily closed 1994-02/1994-11
+-# From Craig Mundell (1994-12-15):
+-# http://quest.arc.nasa.gov/antarctica/QA/computers/Directions,Time,ZIP
+-# Vostok, which is one of the Russian stations, is set on the same
+-# time as Moscow, Russia.
+-#
+-# From Lee Hotz (2001-03-08):
+-# I queried the folks at Columbia who spent the summer at Vostok and this is
+-# what they had to say about time there:
+-# "in the US Camp (East Camp) we have been on New Zealand (McMurdo)
+-# time, which is 12 hours ahead of GMT. The Russian Station Vostok was
+-# 6 hours behind that (although only 2 miles away, i.e. 6 hours ahead
+-# of GMT). This is a time zone I think two hours east of Moscow. The
+-# natural time zone is in between the two: 8 hours ahead of GMT."
+-#
+-# From Paul Eggert (2001-05-04):
+-# This seems to be hopelessly confusing, so I asked Lee Hotz about it
+-# in person. He said that some Antarctic locations set their local
+-# time so that noon is the warmest part of the day, and that this
+-# changes during the year and does not necessarily correspond to mean
+-# solar noon. So the Vostok time might have been whatever the clocks
+-# happened to be during their visit. So we still don't really know what time
+-# it is at Vostok. But we'll guess +06.
+-#
+-Zone Antarctica/Vostok 0 - -00 1957 Dec 16
+- 6:00 - +06
+-
+ # Yemen
+ # Milne says 2:59:54 was the meridian of the saluting battery at Aden,
+ # and that Yemen was at 1:55:56, the meridian of the Hagia Sophia.
+--- /dev/null
++++ contrib/tzdata/checknow.awk
+@@ -0,0 +1,54 @@
++# Check zonenow.tab for consistency with primary data.
++
++# Contributed by Paul Eggert. This file is in the public domain.
++
++function record_zone(zone, data) {
++ if (zone) {
++ zone_data[zone] = data
++ zones[data] = zones[data] " " zone
++ }
++}
++
++BEGIN {
++ while (getline >"/dev/stderr"
+ status = 1
+@@ -110,7 +110,7 @@
+ used_max_cc = cc
+ }
+ }
+- if (used_max <= 1 && comments) {
++ if (used_max <= 1 && comments && zone_table != "zonenow.tab") {
+ printf "%s:%d: unnecessary comment '%s'\n", \
+ zone_table, i, comments \
+ >>"/dev/stderr"
+@@ -149,7 +149,8 @@
+ if ($3 ~ /%/) rulePercentUsed[$2] = 1
+ }
+ if (tz && tz ~ /\// && tz !~ /^Etc\//) {
+- if (!tztab[tz] && FILENAME != "backward") {
++ if (!tztab[tz] && FILENAME != "backward" \
++ && zone_table != "zonenow.tab") {
+ printf "%s: no data for '%s'\n", zone_table, tz \
+ >>"/dev/stderr"
+ status = 1
+--- contrib/tzdata/etcetera.orig
++++ contrib/tzdata/etcetera
+@@ -5,7 +5,7 @@
+
+ # These entries are for uses not otherwise covered by the tz database.
+ # Their main practical use is for platforms like Android that lack
+-# support for POSIX-style TZ strings. On such platforms these entries
++# support for POSIX.1-2017-style TZ strings. On such platforms these entries
+ # can be useful if the timezone database is wrong or if a ship or
+ # aircraft at sea is not in a timezone.
+
+--- contrib/tzdata/europe.orig
++++ contrib/tzdata/europe
+@@ -990,9 +990,34 @@
+ # Czech Republic (Czechia)
+ # Slovakia
+ #
+-# From Paul Eggert (2018-04-15):
+-# The source for Czech data is: Kdy začíná a končí letní čas. 2018-04-15.
++# From Ivan Benovic (2024-01-30):
++# https://www.slov-lex.sk/pravne-predpisy/SK/ZZ/1946/54/
++# (This is an official link to the Czechoslovak Summer Time Act of
++# March 8, 1946 that authorizes the Czechoslovak government to set the
++# exact dates of change to summer time and back to Central European Time.
++# The act also implicitly confirms Central European Time as the
++# official time zone of Czechoslovakia and currently remains in force
++# in both the Czech Republic and Slovakia.)
++# https://www.psp.cz/eknih/1945pns/tisky/t0216_00.htm
++# (This is a link to the original legislative proposal dating back to
++# February 22, 1946. The accompanying memorandum to the proposal says
++# that an advisory committee on European railroad transportation that
++# met in Brussels in October 1945 decided that the change of time
++# should be carried out in all participating countries in a strictly
++# coordinated manner....)
++#
++# From Paul Eggert (2024-01-30):
++# The source for Czech data is: Kdy začíná a končí letní čas.
+ # https://kalendar.beda.cz/kdy-zacina-a-konci-letni-cas
++# Its main text disagrees with its quoted sources only in 1918,
++# where the main text says spring and autumn transitions
++# occurred at 02:00 and 03:00 respectively (as usual),
++# whereas the 1918 source "Oznámení o zavedení letního času v roce 1918"
++# says transitions were at 01:00 and 02:00 respectively.
++# As the 1918 source appears to be a humorous piece, and it is
++# unlikely that Prague would have disagreed with its neighbors by an hour,
++# go with the main text for now.
++#
+ # We know of no English-language name for historical Czech winter time;
+ # abbreviate it as "GMT", as it happened to be GMT.
+ #
+@@ -1123,6 +1148,23 @@
+ # 2. The shift *from* DST in 2023 happens as normal, but coincides with the
+ # shift to UTC-02 normaltime (people will not change their clocks here).
+ # 3. After this, DST is still observed, but as -02/-01 instead of -03/-02.
++#
++# From Múte Bourup Egede via Jógvan Svabo Samuelsen (2023-03-15):
++# Greenland will not switch to Daylight Saving Time this year, 2023,
++# because the standard time for Greenland will change from UTC -3 to UTC -2.
++# However, Greenland will change to Daylight Saving Time again in 2024
++# and onwards.
++
++# From a contributor who wishes to remain anonymous for now (2023-10-29):
++# https://www.dr.dk/nyheder/seneste/i-nat-skal-uret-stilles-en-time-tilbage-men-foerste-gang-sker-det-ikke-i-groenland
++# with a link to that page:
++# https://naalakkersuisut.gl/Nyheder/2023/10/2710_sommertid
++# ... Ittoqqortoormiit joins the time of Nuuk at March 2024.
++# What would mean that America/Scoresbysund would either be in -01 year round
++# or in -02/-01 like America/Nuuk, but no longer in -01/+00.
++#
++# From Paul Eggert (2023-10-29):
++# For now, assume it will be like America/Nuuk.
+
+ # Rule NAME FROM TO - IN ON AT SAVE LETTER/S
+ Rule Thule 1991 1992 - Mar lastSun 2:00 1:00 D
+@@ -1143,10 +1185,12 @@
+ Zone America/Scoresbysund -1:27:52 - LMT 1916 Jul 28 # Ittoqqortoormiit
+ -2:00 - -02 1980 Apr 6 2:00
+ -2:00 C-Eur -02/-01 1981 Mar 29
+- -1:00 EU -01/+00
++ -1:00 EU -01/+00 2024 Mar 31
++ -2:00 EU -02/-01
+ Zone America/Nuuk -3:26:56 - LMT 1916 Jul 28 # Godthåb
+ -3:00 - -03 1980 Apr 6 2:00
+- -3:00 EU -03/-02 2023 Oct 29 1:00u
++ -3:00 EU -03/-02 2023 Mar 26 1:00u
++ -2:00 - -02 2023 Oct 29 1:00u
+ -2:00 EU -02/-01
+ Zone America/Thule -4:35:08 - LMT 1916 Jul 28 # Pituffik
+ -4:00 Thule A%sT
+@@ -3711,11 +3755,7 @@
+ # and not at 3:00 as would have been under EU rules.
+ # This is why I have set the change to EU rules into May 1996,
+ # so that the change in March is stil covered by the Ukraine rule.
+-# The next change in October 1996 happened under EU rules....
+-# TZ database holds three other zones for Ukraine.... I have not yet
+-# worked out the consequences for these three zones, as we (me and my
+-# US colleague David Cochrane) are still trying to get more
+-# information upon these local deviations from Kiev rules.
++# The next change in October 1996 happened under EU rules.
+ #
+ # From Paul Eggert (2022-08-27):
+ # For now, assume that Ukraine's zones all followed the same rules,
+--- contrib/tzdata/leap-seconds.list.orig
++++ contrib/tzdata/leap-seconds.list
+@@ -1,255 +1,120 @@
++# ATOMIC TIME.
++# The Coordinated Universal Time (UTC) is the reference time scale derived
++# from The "Temps Atomique International" (TAI) calculated by the Bureau
++# International des Poids et Mesures (BIPM) using a worldwide network of atomic
++# clocks. UTC differs from TAI by an integer number of seconds; it is the basis
++# of all activities in the world.
+ #
+-# In the following text, the symbol '#' introduces
+-# a comment, which continues from that symbol until
+-# the end of the line. A plain comment line has a
+-# whitespace character following the comment indicator.
+-# There are also special comment lines defined below.
+-# A special comment will always have a non-whitespace
+-# character in column 2.
+-#
+-# A blank line should be ignored.
+-#
+-# The following table shows the corrections that must
+-# be applied to compute International Atomic Time (TAI)
+-# from the Coordinated Universal Time (UTC) values that
+-# are transmitted by almost all time services.
+-#
+-# The first column shows an epoch as a number of seconds
+-# since 1 January 1900, 00:00:00 (1900.0 is also used to
+-# indicate the same epoch.) Both of these time stamp formats
+-# ignore the complexities of the time scales that were
+-# used before the current definition of UTC at the start
+-# of 1972. (See note 3 below.)
+-# The second column shows the number of seconds that
+-# must be added to UTC to compute TAI for any timestamp
+-# at or after that epoch. The value on each line is
+-# valid from the indicated initial instant until the
+-# epoch given on the next one or indefinitely into the
+-# future if there is no next line.
+-# (The comment on each line shows the representation of
+-# the corresponding initial epoch in the usual
+-# day-month-year format. The epoch always begins at
+-# 00:00:00 UTC on the indicated day. See Note 5 below.)
+-#
+-# Important notes:
+-#
+-# 1. Coordinated Universal Time (UTC) is often referred to
+-# as Greenwich Mean Time (GMT). The GMT time scale is no
+-# longer used, and the use of GMT to designate UTC is
+-# discouraged.
+-#
+-# 2. The UTC time scale is realized by many national
+-# laboratories and timing centers. Each laboratory
+-# identifies its realization with its name: Thus
+-# UTC(NIST), UTC(USNO), etc. The differences among
+-# these different realizations are typically on the
+-# order of a few nanoseconds (i.e., 0.000 000 00x s)
+-# and can be ignored for many purposes. These differences
+-# are tabulated in Circular T, which is published monthly
+-# by the International Bureau of Weights and Measures
+-# (BIPM). See www.bipm.org for more information.
+-#
+-# 3. The current definition of the relationship between UTC
+-# and TAI dates from 1 January 1972. A number of different
+-# time scales were in use before that epoch, and it can be
+-# quite difficult to compute precise timestamps and time
+-# intervals in those "prehistoric" days. For more information,
+-# consult:
+-#
+-# The Explanatory Supplement to the Astronomical
+-# Ephemeris.
+-# or
+-# Terry Quinn, "The BIPM and the Accurate Measurement
+-# of Time," Proc. of the IEEE, Vol. 79, pp. 894-905,
+-# July, 1991.
+-# reprinted in:
+-# Christine Hackman and Donald B Sullivan (eds.)
+-# Time and Frequency Measurement
+-# American Association of Physics Teachers (1996)
+-# , pp. 75-86
+-#
+-# 4. The decision to insert a leap second into UTC is currently
+-# the responsibility of the International Earth Rotation and
+-# Reference Systems Service. (The name was changed from the
+-# International Earth Rotation Service, but the acronym IERS
+-# is still used.)
+-#
+-# Leap seconds are announced by the IERS in its Bulletin C.
+-#
+-# See www.iers.org for more details.
+-#
+-# Every national laboratory and timing center uses the
+-# data from the BIPM and the IERS to construct UTC(lab),
+-# their local realization of UTC.
+-#
+-# Although the definition also includes the possibility
+-# of dropping seconds ("negative" leap seconds), this has
+-# never been done and is unlikely to be necessary in the
+-# foreseeable future.
+-#
+-# 5. If your system keeps time as the number of seconds since
+-# some epoch (e.g., NTP timestamps), then the algorithm for
+-# assigning a UTC time stamp to an event that happens during a positive
+-# leap second is not well defined. The official name of that leap
+-# second is 23:59:60, but there is no way of representing that time
+-# in these systems.
+-# Many systems of this type effectively stop the system clock for
+-# one second during the leap second and use a time that is equivalent
+-# to 23:59:59 UTC twice. For these systems, the corresponding TAI
+-# timestamp would be obtained by advancing to the next entry in the
+-# following table when the time equivalent to 23:59:59 UTC
+-# is used for the second time. Thus the leap second which
+-# occurred on 30 June 1972 at 23:59:59 UTC would have TAI
+-# timestamps computed as follows:
+-#
+-# ...
+-# 30 June 1972 23:59:59 (2287785599, first time): TAI= UTC + 10 seconds
+-# 30 June 1972 23:59:60 (2287785599,second time): TAI= UTC + 11 seconds
+-# 1 July 1972 00:00:00 (2287785600) TAI= UTC + 11 seconds
+-# ...
+-#
+-# If your system realizes the leap second by repeating 00:00:00 UTC twice
+-# (this is possible but not usual), then the advance to the next entry
+-# in the table must occur the second time that a time equivalent to
+-# 00:00:00 UTC is used. Thus, using the same example as above:
+-#
+-# ...
+-# 30 June 1972 23:59:59 (2287785599): TAI= UTC + 10 seconds
+-# 30 June 1972 23:59:60 (2287785600, first time): TAI= UTC + 10 seconds
+-# 1 July 1972 00:00:00 (2287785600,second time): TAI= UTC + 11 seconds
+-# ...
+-#
+-# in both cases the use of timestamps based on TAI produces a smooth
+-# time scale with no discontinuity in the time interval. However,
+-# although the long-term behavior of the time scale is correct in both
+-# methods, the second method is technically not correct because it adds
+-# the extra second to the wrong day.
+-#
+-# This complexity would not be needed for negative leap seconds (if they
+-# are ever used). The UTC time would skip 23:59:59 and advance from
+-# 23:59:58 to 00:00:00 in that case. The TAI offset would decrease by
+-# 1 second at the same instant. This is a much easier situation to deal
+-# with, since the difficulty of unambiguously representing the epoch
+-# during the leap second does not arise.
+-#
+-# Some systems implement leap seconds by amortizing the leap second
+-# over the last few minutes of the day. The frequency of the local
+-# clock is decreased (or increased) to realize the positive (or
+-# negative) leap second. This method removes the time step described
+-# above. Although the long-term behavior of the time scale is correct
+-# in this case, this method introduces an error during the adjustment
+-# period both in time and in frequency with respect to the official
+-# definition of UTC.
+-#
+-# Questions or comments to:
+-# Judah Levine
+-# Time and Frequency Division
+-# NIST
+-# Boulder, Colorado
+-# Judah.Levine@nist.gov
+-#
+-# Last Update of leap second values: 8 July 2016
+-#
+-# The following line shows this last update date in NTP timestamp
+-# format. This is the date on which the most recent change to
+-# the leap second data was added to the file. This line can
+-# be identified by the unique pair of characters in the first two
+-# columns as shown below.
+-#
+-#$ 3676924800
+-#
+-# The NTP timestamps are in units of seconds since the NTP epoch,
+-# which is 1 January 1900, 00:00:00. The Modified Julian Day number
+-# corresponding to the NTP time stamp, X, can be computed as
+-#
+-# X/86400 + 15020
+-#
+-# where the first term converts seconds to days and the second
+-# term adds the MJD corresponding to the time origin defined above.
+-# The integer portion of the result is the integer MJD for that
+-# day, and any remainder is the time of day, expressed as the
+-# fraction of the day since 0 hours UTC. The conversion from day
+-# fraction to seconds or to hours, minutes, and seconds may involve
+-# rounding or truncation, depending on the method used in the
+-# computation.
+-#
+-# The data in this file will be updated periodically as new leap
+-# seconds are announced. In addition to being entered on the line
+-# above, the update time (in NTP format) will be added to the basic
+-# file name leap-seconds to form the name leap-seconds..
+-# In addition, the generic name leap-seconds.list will always point to
+-# the most recent version of the file.
+-#
+-# This update procedure will be performed only when a new leap second
+-# is announced.
+-#
+-# The following entry specifies the expiration date of the data
+-# in this file in units of seconds since the origin at the instant
+-# 1 January 1900, 00:00:00. This expiration date will be changed
+-# at least twice per year whether or not a new leap second is
+-# announced. These semi-annual changes will be made no later
+-# than 1 June and 1 December of each year to indicate what
+-# action (if any) is to be taken on 30 June and 31 December,
+-# respectively. (These are the customary effective dates for new
+-# leap seconds.) This expiration date will be identified by a
+-# unique pair of characters in columns 1 and 2 as shown below.
+-# In the unlikely event that a leap second is announced with an
+-# effective date other than 30 June or 31 December, then this
+-# file will be edited to include that leap second as soon as it is
+-# announced or at least one month before the effective date
+-# (whichever is later).
+-# If an announcement by the IERS specifies that no leap second is
+-# scheduled, then only the expiration date of the file will
+-# be advanced to show that the information in the file is still
+-# current -- the update time stamp, the data and the name of the file
+-# will not change.
+-#
+-# Updated through IERS Bulletin C65
+-# File expires on: 28 December 2023
+-#
+-#@ 3912710400
+-#
+-2272060800 10 # 1 Jan 1972
+-2287785600 11 # 1 Jul 1972
+-2303683200 12 # 1 Jan 1973
+-2335219200 13 # 1 Jan 1974
+-2366755200 14 # 1 Jan 1975
+-2398291200 15 # 1 Jan 1976
+-2429913600 16 # 1 Jan 1977
+-2461449600 17 # 1 Jan 1978
+-2492985600 18 # 1 Jan 1979
+-2524521600 19 # 1 Jan 1980
+-2571782400 20 # 1 Jul 1981
+-2603318400 21 # 1 Jul 1982
+-2634854400 22 # 1 Jul 1983
+-2698012800 23 # 1 Jul 1985
+-2776982400 24 # 1 Jan 1988
+-2840140800 25 # 1 Jan 1990
+-2871676800 26 # 1 Jan 1991
+-2918937600 27 # 1 Jul 1992
+-2950473600 28 # 1 Jul 1993
+-2982009600 29 # 1 Jul 1994
+-3029443200 30 # 1 Jan 1996
+-3076704000 31 # 1 Jul 1997
+-3124137600 32 # 1 Jan 1999
+-3345062400 33 # 1 Jan 2006
+-3439756800 34 # 1 Jan 2009
+-3550089600 35 # 1 Jul 2012
+-3644697600 36 # 1 Jul 2015
+-3692217600 37 # 1 Jan 2017
+-#
+-# the following special comment contains the
+-# hash value of the data in this file computed
+-# use the secure hash algorithm as specified
+-# by FIPS 180-1. See the files in ~/pub/sha for
+-# the details of how this hash value is
+-# computed. Note that the hash computation
+-# ignores comments and whitespace characters
+-# in data lines. It includes the NTP values
+-# of both the last modification time and the
+-# expiration time of the file, but not the
+-# white space on those lines.
+-# the hash line is also ignored in the
+-# computation.
+-#
+-#h e76a99dc 65f15cc7 e613e040 f5078b5e b23834fe
++#
++# ASTRONOMICAL TIME (UT1) is the time scale based on the rate of rotation of the earth.
++# It is now mainly derived from Very Long Baseline Interferometry (VLBI). The various
++# irregular fluctuations progressively detected in the rotation rate of the Earth lead
++# in 1972 to the replacement of UT1 by UTC as the reference time scale.
++#
++#
++# LEAP SECOND
++# Atomic clocks are more stable than the rate of the earth rotation since the latter
++# undergoes a full range of geophysical perturbations at various time scales: lunisolar
++# and core-mantle torques, atmospheric and oceanic effetcs, etc.
++# Leap seconds are needed to keep the two time scales in agreement, i.e. UT1-UTC smaller
++# than 0.9 second. Therefore, when necessary a "leap second" is applied to UTC.
++# Since the adoption of this system in 1972 it has been necessary to add a number of seconds to UTC,
++# firstly due to the initial choice of the value of the second (1/86400 mean solar day of
++# the year 1820) and secondly to the general slowing down of the Earth's rotation. It is
++# theorically possible to have a negative leap second (a second removed from UTC), but so far,
++# all leap seconds have been positive (a second has been added to UTC). Based on what we know about
++# the earth's rotation, it is unlikely that we will ever have a negative leap second.
++#
++#
++# HISTORY
++# The first leap second was added on June 30, 1972. Until yhe year 2000, it was necessary in average to add a
++# leap second at a rate of 1 to 2 years. Since the year 2000 leap seconds are introduced with an
++# average interval of 3 to 4 years due to the acceleration of the Earth rotation speed.
++#
++#
++# RESPONSABILITY OF THE DECISION TO INTRODUCE A LEAP SECOND IN UTC
++# The decision to introduce a leap second in UTC is the responsibility of the Earth Orientation Center of
++# the International Earth Rotation and reference System Service (IERS). This center is located at Paris
++# Observatory. According to international agreements, leap seconds should only be scheduled for certain dates:
++# first preference is given to the end of December and June, and second preference at the end of March
++# and September. Since the introduction of leap seconds in 1972, only dates in June and December were used.
++#
++# Questions or comments to:
++# Christian Bizouard: christian.bizouard@obspm.fr
++# Earth orientation Center of the IERS
++# Paris Observatory, France
++#
++#
++#
++# COPYRIGHT STATUS OF THIS FILE
++# This file is in the public domain.
++#
++#
++# VALIDITY OF THE FILE
++# It is important to express the validity of the file. These next two dates are
++# given in units of seconds since 1900.0.
++#
++# 1) Last update of the file.
++#
++# Updated through IERS Bulletin C (https://hpiers.obspm.fr/iers/bul/bulc/bulletinc.dat)
++#
++# The following line shows the last update of this file in NTP timestamp:
++#
++#$ 3913697179
++#
++# 2) Expiration date of the file given on a semi-annual basis: last June or last December
++#
++# File expires on 28 December 2024
++#
++# Expire date in NTP timestamp:
++#
++#@ 3944332800
++#
++#
++# LIST OF LEAP SECONDS
++# NTP timestamp (X parameter) is the number of seconds since 1900.0
++#
++# MJD: The Modified Julian Day number. MJD = X/86400 + 15020
++#
++# DTAI: The difference DTAI= TAI-UTC in units of seconds
++# It is the quantity to add to UTC to get the time in TAI
++#
++# Day Month Year : epoch in clear
++#
++#NTP Time DTAI Day Month Year
++#
++2272060800 10 # 1 Jan 1972
++2287785600 11 # 1 Jul 1972
++2303683200 12 # 1 Jan 1973
++2335219200 13 # 1 Jan 1974
++2366755200 14 # 1 Jan 1975
++2398291200 15 # 1 Jan 1976
++2429913600 16 # 1 Jan 1977
++2461449600 17 # 1 Jan 1978
++2492985600 18 # 1 Jan 1979
++2524521600 19 # 1 Jan 1980
++2571782400 20 # 1 Jul 1981
++2603318400 21 # 1 Jul 1982
++2634854400 22 # 1 Jul 1983
++2698012800 23 # 1 Jul 1985
++2776982400 24 # 1 Jan 1988
++2840140800 25 # 1 Jan 1990
++2871676800 26 # 1 Jan 1991
++2918937600 27 # 1 Jul 1992
++2950473600 28 # 1 Jul 1993
++2982009600 29 # 1 Jul 1994
++3029443200 30 # 1 Jan 1996
++3076704000 31 # 1 Jul 1997
++3124137600 32 # 1 Jan 1999
++3345062400 33 # 1 Jan 2006
++3439756800 34 # 1 Jan 2009
++3550089600 35 # 1 Jul 2012
++3644697600 36 # 1 Jul 2015
++3692217600 37 # 1 Jan 2017
++#
++# A hash code has been generated to be able to verify the integrity
++# of this file. For more information about using this hash code,
++# please see the readme file in the 'source' directory :
++# https://hpiers.obspm.fr/iers/bul/bulc/ntp/sources/README
++#
++#h 9dac5845 8acd32c0 2947d462 daf4a943 f58d9391
+--- contrib/tzdata/leapseconds.orig
++++ contrib/tzdata/leapseconds
+@@ -3,13 +3,10 @@
+ # This file is in the public domain.
+
+ # This file is generated automatically from the data in the public-domain
+-# NIST format leap-seconds.list file, which can be copied from
+-#
+-# or .
+-# The NIST file is used instead of its IERS upstream counterpart
++# NIST/IERS format leap-seconds.list file, which can be copied from
+ #
+-# because under US law the NIST file is public domain
+-# whereas the IERS file's copyright and license status is unclear.
++# or, in a variant with different comments, from
++# .
+ # For more about leap-seconds.list, please see
+ # The NTP Timescale and Leap Seconds
+ # .
+@@ -72,11 +69,11 @@
+ # Any additional leap seconds will come after this.
+ # This Expires line is commented out for now,
+ # so that pre-2020a zic implementations do not reject this file.
+-#Expires 2023 Dec 28 00:00:00
++#Expires 2024 Dec 28 00:00:00
+
+ # POSIX timestamps for the data in this file:
+-#updated 1467936000 (2016-07-08 00:00:00 UTC)
+-#expires 1703721600 (2023-12-28 00:00:00 UTC)
++#updated 1704708379 (2024-01-08 10:06:19 UTC)
++#expires 1735344000 (2024-12-28 00:00:00 UTC)
+
+-# Updated through IERS Bulletin C65
+-# File expires on: 28 December 2023
++# Updated through IERS Bulletin C (https://hpiers.obspm.fr/iers/bul/bulc/bulletinc.dat)
++# File expires on 28 December 2024
+--- contrib/tzdata/leapseconds.awk.orig
++++ contrib/tzdata/leapseconds.awk
+@@ -1,4 +1,4 @@
+-# Generate zic format 'leapseconds' from NIST format 'leap-seconds.list'.
++# Generate zic format 'leapseconds' from NIST/IERS format 'leap-seconds.list'.
+
+ # This file is in the public domain.
+
+@@ -21,13 +21,10 @@
+ print "# This file is in the public domain."
+ print ""
+ print "# This file is generated automatically from the data in the public-domain"
+- print "# NIST format leap-seconds.list file, which can be copied from"
+- print "# "
+- print "# or ."
+- print "# The NIST file is used instead of its IERS upstream counterpart"
++ print "# NIST/IERS format leap-seconds.list file, which can be copied from"
+ print "# "
+- print "# because under US law the NIST file is public domain"
+- print "# whereas the IERS file's copyright and license status is unclear."
++ print "# or, in a variant with different comments, from"
++ print "# ."
+ print "# For more about leap-seconds.list, please see"
+ print "# The NTP Timescale and Leap Seconds"
+ print "# ."
+--- contrib/tzdata/northamerica.orig
++++ contrib/tzdata/northamerica
+@@ -1268,6 +1268,10 @@
+ #
+ # [PDF] (1914-03)
+ #
++# For the 1911/1912 establishment of standard time in French possessions, see:
++# Société Française de Physique, Recueil de constantes physiques (1913),
++# page 752, 18b.
++#
+ # See the 'europe' file for Greenland.
+
+ # Canada
+@@ -1354,7 +1358,7 @@
+ # From Paul Eggert (2014-10-18):
+ # H. David Matthews and Mary Vincent's map
+ # "It's about TIME", _Canadian Geographic_ (September-October 1998)
+-# http://www.canadiangeographic.ca/Magazine/SO98/alacarte.asp
++# https://web.archive.org/web/19990827055050/https://canadiangeographic.ca/SO98/geomap.htm
+ # contains detailed boundaries for regions observing nonstandard
+ # time and daylight saving time arrangements in Canada circa 1998.
+ #
+@@ -1453,7 +1457,7 @@
+ Rule StJohns 2007 2011 - Mar Sun>=8 0:01 1:00 D
+ Rule StJohns 2007 2010 - Nov Sun>=1 0:01 0 S
+ #
+-# St John's has an apostrophe, but Posix file names can't have apostrophes.
++# St John's has an apostrophe, but POSIX file names can't have apostrophes.
+ # Zone NAME STDOFF RULES FORMAT [UNTIL]
+ Zone America/St_Johns -3:30:52 - LMT 1884
+ -3:30:52 StJohns N%sT 1918
+@@ -1642,6 +1646,15 @@
+ # Some cities in the United States have pushed the deadline back
+ # three weeks and will change over from daylight saving in October.
+
++# From Chris Walton (2024-01-09):
++# The [Toronto] changes in 1947, 1948, and 1949 took place at 2:00 a.m. local
++# time instead of midnight.... Toronto Daily Star - ...
++# April 2, 1947 - Page 39 ... April 7, 1948 - Page 13 ...
++# April 2, 1949 - Page 1 ... April 7, 1949 - Page 24 ...
++# November 25, 1949 - Page 52 ... April 21, 1950 - Page 14 ...
++# September 19, 1950 - Page 46 ... September 20, 1950 - Page 3 ...
++# November 24, 1950 - Page 21
++
+ # From Arthur David Olson (2010-07-17):
+ #
+ # "Standard Time and Time Zones in Canada" appeared in
+@@ -1703,13 +1716,9 @@
+ Rule Toronto 1928 1937 - Apr Sun>=25 2:00 1:00 D
+ Rule Toronto 1938 1940 - Apr lastSun 2:00 1:00 D
+ Rule Toronto 1938 1939 - Sep lastSun 2:00 0 S
+-Rule Toronto 1945 1946 - Sep lastSun 2:00 0 S
+-Rule Toronto 1946 only - Apr lastSun 2:00 1:00 D
+-Rule Toronto 1947 1949 - Apr lastSun 0:00 1:00 D
+-Rule Toronto 1947 1948 - Sep lastSun 0:00 0 S
+-Rule Toronto 1949 only - Nov lastSun 0:00 0 S
+-Rule Toronto 1950 1973 - Apr lastSun 2:00 1:00 D
+-Rule Toronto 1950 only - Nov lastSun 2:00 0 S
++Rule Toronto 1945 1948 - Sep lastSun 2:00 0 S
++Rule Toronto 1946 1973 - Apr lastSun 2:00 1:00 D
++Rule Toronto 1949 1950 - Nov lastSun 2:00 0 S
+ Rule Toronto 1951 1956 - Sep lastSun 2:00 0 S
+ # Shanks & Pottenger say Toronto ended DST a week early in 1971,
+ # namely on 1971-10-24, but Mark Brader wrote (2003-05-31) that this
+@@ -3432,7 +3441,7 @@
+ # Martinique
+ # Zone NAME STDOFF RULES FORMAT [UNTIL]
+ Zone America/Martinique -4:04:20 - LMT 1890 # Fort-de-France
+- -4:04:20 - FFMT 1911 May # Fort-de-France MT
++ -4:04:20 - FFMT 1911 May 1 # Fort-de-France MT
+ -4:00 - AST 1980 Apr 6
+ -4:00 1:00 ADT 1980 Sep 28
+ -4:00 - AST
+@@ -3539,7 +3548,7 @@
+ # St Pierre and Miquelon
+ # There are too many St Pierres elsewhere, so we'll use 'Miquelon'.
+ # Zone NAME STDOFF RULES FORMAT [UNTIL]
+-Zone America/Miquelon -3:44:40 - LMT 1911 May 15 # St Pierre
++Zone America/Miquelon -3:44:40 - LMT 1911 Jun 15 # St Pierre
+ -4:00 - AST 1980 May
+ -3:00 - -03 1987
+ -3:00 Canada -03/-02
+--- contrib/tzdata/southamerica.orig
++++ contrib/tzdata/southamerica
+@@ -1570,8 +1570,11 @@
+ -3:00 - -03
+
+ # French Guiana
++# For the 1911/1912 establishment of standard time in French possessions, see:
++# Société Française de Physique, Recueil de constantes physiques (1913),
++# page 752, 18b.
+ # Zone NAME STDOFF RULES FORMAT [UNTIL]
+-Zone America/Cayenne -3:29:20 - LMT 1911 Jul
++Zone America/Cayenne -3:29:20 - LMT 1911 Jul 1
+ -4:00 - -04 1967 Oct
+ -3:00 - -03
+
+@@ -1697,6 +1700,12 @@
+ # From Carlos Raúl Perasso (2014-02-28):
+ # Decree 1264 can be found at:
+ # http://www.presidencia.gov.py/archivos/documentos/DECRETO1264_ey9r8zai.pdf
++#
++# From Paul Eggert (2023-07-26):
++# Transition dates are now set by Law No. 7115, not by presidential decree.
++# https://www.abc.com.py/politica/2023/07/12/promulgacion-el-cambio-de-hora-sera-por-ley/
++# From Carlos Raúl Perasso (2023-07-27):
++# http://silpy.congreso.gov.py/descarga/ley-144138
+ Rule Para 2013 max - Mar Sun>=22 0:00 0 -
+
+ # Zone NAME STDOFF RULES FORMAT [UNTIL]
+--- contrib/tzdata/theory.html.orig
++++ contrib/tzdata/theory.html
+@@ -95,7 +95,7 @@
+ Edition.
+ Because the database's scope encompasses real-world changes to civil
+ timekeeping, its model for describing time is more complex than the
+-standard and daylight saving times supported by POSIX.
++standard and daylight saving times supported by POSIX.1-2017.
+ A tz
timezone corresponds to a ruleset that can
+ have more than two changes per year, these changes need not merely
+ flip back and forth between two alternatives, and the rules themselves
+@@ -187,7 +187,7 @@
+ href="https://en.wikipedia.org/wiki/ASCII">ASCII letters,
+ '.
', '-
' and '_
'.
+ Do not use digits, as that might create an ambiguity with POSIX
++ href="https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html#tag_08_03">POSIX.1-2017
+ TZ
strings.
+ A file name component must not exceed 14 characters or start with
+ '-
'.
+@@ -362,6 +362,11 @@
+ but conforms to the older-version guidelines related to ISO 3166-1;
+ it lists only one country code per entry and unlike zone1970.tab
+ it can list names defined in backward
.
++Applications that process only timestamps from now on can instead use the file
++zonenow.tab
, which partitions the world more coarsely,
++into regions where clocks agree now and in the predicted future;
++this file is smaller and simpler than zone1970.tab
++and zone.tab
.
+
+
+
+@@ -373,7 +378,7 @@
+ and no great weight should be attached to whether a link
+ is defined in backward
or in some other file.
+ The source file etcetera
defines names that may be useful
+-on platforms that do not support POSIX-style TZ
strings;
++on platforms that do not support POSIX.1-2017-style TZ
strings;
+ no other source file other than backward
+ contains links to its zones.
+ One of etcetera
's names is Etc/UTC
,
+@@ -421,7 +426,7 @@
+ expression [-+[:alnum:]]{3,6}
should match the
+ abbreviation.
+ This guarantees that all abbreviations could have been specified by a
+- POSIX TZ
string.
++ POSIX.1-2017 TZ
string.
+
+
+
+@@ -765,12 +770,12 @@
+ calendar with 24-hour days. These divergences range from
+ relatively minor, such as Japanese bars giving times like "24:30" for the
+ wee hours of the morning, to more-significant differences such as the
++ href="https://theworld.org/stories/2015-01-30/if-you-have-meeting-ethiopia-you-better-double-check-time">the
+ east African practice of starting the day at dawn, renumbering
+ the Western 06:00 to be 12:00. These practices are largely outside
+ the scope of the tz
code and data, which
+ provide only limited support for date and time localization
+- such as that required by POSIX.
++ such as that required by POSIX.1-2017.
+ If DST is not used a different time zone
+ can often do the trick; for example, in Kenya a TZ
setting
+ like <-03>3
or America/Cayenne
starts
+@@ -867,23 +872,23 @@
+ an older zic
.
+
+
+-POSIX properties and limitations
++POSIX.1-2017 properties and limitations
+
+ -
+
+- In POSIX, time display in a process is controlled by the
++ In POSIX.1-2017, time display in a process is controlled by the
+ environment variable TZ
.
+- Unfortunately, the POSIX
++ Unfortunately, the POSIX.1-2017
+ TZ
string takes a form that is hard to describe and
+ is error-prone in practice.
+- Also, POSIX TZ
strings cannot deal with daylight
++ Also, POSIX.1-2017 TZ
strings cannot deal with daylight
+ saving time rules not based on the Gregorian calendar (as in
+ Morocco), or with situations where more than two time zone
+ abbreviations or UT offsets are used in an area.
+
+
+
+- The POSIX TZ
string takes the following form:
++ The POSIX.1-2017 TZ
string takes the following form:
+
+
+
+@@ -950,7 +955,7 @@
+
+
+
+- Here is an example POSIX TZ
string for New
++ Here is an example POSIX.1-2017 TZ
string for New
+ Zealand after 2007.
+ It says that standard time (NZST) is 12 hours ahead
+ of UT, and that daylight saving time
+@@ -961,7 +966,7 @@
+
TZ='NZST-12NZDT,M9.5.0,M4.1.0/3'
+
+
+- This POSIX TZ
string is hard to remember, and
++ This POSIX.1-2017 TZ
string is hard to remember, and
+ mishandles some timestamps before 2008.
+ With this package you can use this instead:
+
+@@ -999,7 +1004,7 @@
+ limit phone calls to off-peak hours.
+
+ -
+- POSIX provides no convenient and efficient way to determine
++ POSIX.1-2017 provides no convenient and efficient way to determine
+ the UT offset and time zone abbreviation of arbitrary
+ timestamps, particularly for timezones
+ that do not fit into the POSIX model.
+@@ -1026,14 +1031,14 @@
+
+
+
+-Extensions to POSIX in the
++Extensions to POSIX.1-2017 in the
+ tz
code
+
+ -
+
+ The TZ
environment variable is used in generating
+ the name of a file from which time-related information is read
+- (or is interpreted à la POSIX); TZ
is no longer
++ (or is interpreted à la POSIX.1-2017); TZ
is no longer
+ constrained to be a string containing abbreviations
+ and numeric data as described above.
+ The file's format is TZif,
+--- contrib/tzdata/version.orig
++++ contrib/tzdata/version
+@@ -1 +1 @@
+-2023c
++2024a
+--- contrib/tzdata/zishrink.awk.orig
++++ contrib/tzdata/zishrink.awk
+@@ -162,7 +162,7 @@
+ # Process the input line LINE and save it for later output.
+
+ function process_input_line(line, \
+- f, field, end, i, n, r, startdef, \
++ f, field, end, n, outline, r, \
+ linkline, ruleline, zoneline)
+ {
+ # Remove comments, normalize spaces, and append a space to each line.
+@@ -199,8 +199,10 @@
+ }
+
+ # Abbreviate "max", "min", "only" and month names.
+- gsub(/ max /, " ma ", line)
+- gsub(/ min /, " mi ", line)
++ # Although "max" and "min" can both be abbreviated to just "m",
++ # the longer forms "ma" and "mi" are needed with zic 2023d and earlier.
++ gsub(/ max /, dataform == "vanguard" ? " m " : " ma ", line)
++ gsub(/ min /, dataform == "vanguard" ? " m " : " mi ", line)
+ gsub(/ only /, " o ", line)
+ gsub(/ Jan /, " Ja ", line)
+ gsub(/ Feb /, " F ", line)
+@@ -234,66 +236,96 @@
+ rule_used[r] = 1
+ }
+
+- # If this zone supersedes an earlier one, delete the earlier one
+- # from the saved output lines.
+- startdef = ""
+ if (zoneline)
+ zonename = startdef = field[2]
+ else if (linkline)
+ zonename = startdef = field[3]
+ else if (ruleline)
+ zonename = ""
+- if (startdef) {
+- i = zonedef[startdef]
+- if (i) {
+- do
+- output_line[i - 1] = ""
+- while (output_line[i++] ~ /^[-+0-9]/);
+- }
+- }
+- zonedef[zonename] = nout + 1
+
+- # Save the line for later output.
+- output_line[nout++] = make_line(n, field)
++ # Save the information for later output.
++ outline = make_line(n, field)
++ if (ruleline)
++ rule_output_line[nrule_out++] = outline
++ else if (linkline) {
++ # In vanguard format with Gawk, links are output sorted by destination.
++ if (dataform == "vanguard" && PROCINFO["version"])
++ linkdef[zonename] = field[2]
++ else
++ link_output_line[nlink_out++] = outline
++ }else
++ zonedef[zonename] = (zoneline ? "" : zonedef[zonename] "\n") outline
+ }
+
+ function omit_unused_rules( \
+ i, field)
+ {
+- for (i = 0; i < nout; i++) {
+- split(output_line[i], field)
+- if (field[1] == "R" && !rule_used[field[2]]) {
+- output_line[i] = ""
+- }
++ for (i = 0; i < nrule_out; i++) {
++ split(rule_output_line[i], field)
++ if (!rule_used[field[2]])
++ rule_output_line[i] = ""
+ }
+ }
+
+ function abbreviate_rule_names( \
+- abbr, f, field, i, n, r)
++ abbr, f, field, i, n, newdef, newline, r, \
++ zoneline, zonelines, zonename)
+ {
+- for (i = 0; i < nout; i++) {
+- n = split(output_line[i], field)
++ for (i = 0; i < nrule_out; i++) {
++ n = split(rule_output_line[i], field)
+ if (n) {
+- f = field[1] == "Z" ? 4 : field[1] == "L" ? 0 : 2
+- r = field[f]
++ r = field[2]
+ if (r ~ /^[^-+0-9]/) {
+ abbr = rule[r]
+ if (!abbr) {
+ rule[r] = abbr = gen_rule_name(r)
+ }
+- field[f] = abbr
+- output_line[i] = make_line(n, field)
++ field[2] = abbr
++ rule_output_line[i] = make_line(n, field)
+ }
+ }
+ }
++ for (zonename in zonedef) {
++ zonelines = split(zonedef[zonename], zoneline, /\n/)
++ newdef = ""
++ for (i = 1; i <= zonelines; i++) {
++ newline = zoneline[i]
++ n = split(newline, field)
++ f = i == 1 ? 4 : 2
++ r = rule[field[f]]
++ if (r) {
++ field[f] = r
++ newline = make_line(n, field)
++ }
++ newdef = (newdef ? newdef "\n" : "") newline
++ }
++ zonedef[zonename] = newdef
++ }
+ }
+
+ function output_saved_lines( \
+- i)
++ i, zonename)
+ {
+- for (i = 0; i < nout; i++)
+- if (output_line[i])
+- print output_line[i]
++ for (i = 0; i < nrule_out; i++)
++ if (rule_output_line[i])
++ print rule_output_line[i]
++
++ # When using gawk, output zones sorted by name.
++ # This makes the output a bit more compressible.
++ PROCINFO["sorted_in"] = "@ind_str_asc"
++ for (zonename in zonedef)
++ print zonedef[zonename]
++
++ if (nlink_out)
++ for (i = 0; i < nlink_out; i++)
++ print link_output_line[i]
++ else {
++ # When using gawk, output links sorted by destination.
++ # This also helps compressibility a bit.
++ PROCINFO["sorted_in"] = "@val_type_asc"
++ for (zonename in linkdef)
++ printf "L %s %s\n", linkdef[zonename], zonename
++ }
+ }
+
+ BEGIN {
+--- contrib/tzdata/zone.tab.orig
++++ contrib/tzdata/zone.tab
+@@ -48,7 +48,7 @@
+ AR -2447-06525 America/Argentina/Salta Salta (SA, LP, NQ, RN)
+ AR -2411-06518 America/Argentina/Jujuy Jujuy (JY)
+ AR -2649-06513 America/Argentina/Tucuman Tucuman (TM)
+-AR -2828-06547 America/Argentina/Catamarca Catamarca (CT); Chubut (CH)
++AR -2828-06547 America/Argentina/Catamarca Catamarca (CT), Chubut (CH)
+ AR -2926-06651 America/Argentina/La_Rioja La Rioja (LR)
+ AR -3132-06831 America/Argentina/San_Juan San Juan (SJ)
+ AR -3253-06849 America/Argentina/Mendoza Mendoza (MZ)
+@@ -87,7 +87,7 @@
+ BO -1630-06809 America/La_Paz
+ BQ +120903-0681636 America/Kralendijk
+ BR -0351-03225 America/Noronha Atlantic islands
+-BR -0127-04829 America/Belem Para (east); Amapa
++BR -0127-04829 America/Belem Para (east), Amapa
+ BR -0343-03830 America/Fortaleza Brazil (northeast: MA, PI, CE, RN, PB)
+ BR -0803-03454 America/Recife Pernambuco
+ BR -0712-04812 America/Araguaina Tocantins
+@@ -107,21 +107,21 @@
+ BW -2439+02555 Africa/Gaborone
+ BY +5354+02734 Europe/Minsk
+ BZ +1730-08812 America/Belize
+-CA +4734-05243 America/St_Johns Newfoundland; Labrador (southeast)
+-CA +4439-06336 America/Halifax Atlantic - NS (most areas); PE
++CA +4734-05243 America/St_Johns Newfoundland, Labrador (SE)
++CA +4439-06336 America/Halifax Atlantic - NS (most areas), PE
+ CA +4612-05957 America/Glace_Bay Atlantic - NS (Cape Breton)
+ CA +4606-06447 America/Moncton Atlantic - New Brunswick
+ CA +5320-06025 America/Goose_Bay Atlantic - Labrador (most areas)
+ CA +5125-05707 America/Blanc-Sablon AST - QC (Lower North Shore)
+-CA +4339-07923 America/Toronto Eastern - ON, QC (most areas)
++CA +4339-07923 America/Toronto Eastern - ON & QC (most areas)
+ CA +6344-06828 America/Iqaluit Eastern - NU (most areas)
+-CA +484531-0913718 America/Atikokan EST - ON (Atikokan); NU (Coral H)
+-CA +4953-09709 America/Winnipeg Central - ON (west); Manitoba
++CA +484531-0913718 America/Atikokan EST - ON (Atikokan), NU (Coral H)
++CA +4953-09709 America/Winnipeg Central - ON (west), Manitoba
+ CA +744144-0944945 America/Resolute Central - NU (Resolute)
+ CA +624900-0920459 America/Rankin_Inlet Central - NU (central)
+ CA +5024-10439 America/Regina CST - SK (most areas)
+ CA +5017-10750 America/Swift_Current CST - SK (midwest)
+-CA +5333-11328 America/Edmonton Mountain - AB; BC (E); NT (E); SK (W)
++CA +5333-11328 America/Edmonton Mountain - AB, BC(E), NT(E), SK(W)
+ CA +690650-1050310 America/Cambridge_Bay Mountain - NU (west)
+ CA +682059-1334300 America/Inuvik Mountain - NT (west)
+ CA +4906-11631 America/Creston MST - BC (Creston)
+@@ -207,8 +207,8 @@
+ HU +4730+01905 Europe/Budapest
+ ID -0610+10648 Asia/Jakarta Java, Sumatra
+ ID -0002+10920 Asia/Pontianak Borneo (west, central)
+-ID -0507+11924 Asia/Makassar Borneo (east, south); Sulawesi/Celebes, Bali, Nusa Tengarra; Timor (west)
+-ID -0232+14042 Asia/Jayapura New Guinea (West Papua / Irian Jaya); Malukus/Moluccas
++ID -0507+11924 Asia/Makassar Borneo (east, south), Sulawesi/Celebes, Bali, Nusa Tengarra, Timor (west)
++ID -0232+14042 Asia/Jayapura New Guinea (West Papua / Irian Jaya), Malukus/Moluccas
+ IE +5320-00615 Europe/Dublin
+ IL +314650+0351326 Asia/Jerusalem
+ IM +5409-00428 Europe/Isle_of_Man
+@@ -355,7 +355,7 @@
+ RU +643337+1431336 Asia/Ust-Nera MSK+07 - Oymyakonsky
+ RU +5934+15048 Asia/Magadan MSK+08 - Magadan
+ RU +4658+14242 Asia/Sakhalin MSK+08 - Sakhalin Island
+-RU +6728+15343 Asia/Srednekolymsk MSK+08 - Sakha (E); N Kuril Is
++RU +6728+15343 Asia/Srednekolymsk MSK+08 - Sakha (E), N Kuril Is
+ RU +5301+15839 Asia/Kamchatka MSK+09 - Kamchatka
+ RU +6445+17729 Asia/Anadyr MSK+09 - Bering Sea
+ RW -0157+03004 Africa/Kigali
+@@ -418,7 +418,7 @@
+ US +465042-1012439 America/North_Dakota/New_Salem Central - ND (Morton rural)
+ US +471551-1014640 America/North_Dakota/Beulah Central - ND (Mercer)
+ US +394421-1045903 America/Denver Mountain (most areas)
+-US +433649-1161209 America/Boise Mountain - ID (south); OR (east)
++US +433649-1161209 America/Boise Mountain - ID (south), OR (east)
+ US +332654-1120424 America/Phoenix MST - AZ (except Navajo)
+ US +340308-1181434 America/Los_Angeles Pacific
+ US +611305-1495401 America/Anchorage Alaska (most areas)
+--- contrib/tzdata/zone1970.tab.orig
++++ contrib/tzdata/zone1970.tab
+@@ -38,7 +38,7 @@
+ #country-
+ #codes coordinates TZ comments
+ AD +4230+00131 Europe/Andorra
+-AE,OM,RE,SC,TF +2518+05518 Asia/Dubai Crozet, Scattered Is
++AE,OM,RE,SC,TF +2518+05518 Asia/Dubai Crozet
+ AF +3431+06912 Asia/Kabul
+ AL +4120+01950 Europe/Tirane
+ AM +4011+04430 Asia/Yerevan
+@@ -48,12 +48,13 @@
+ AQ -6448-06406 Antarctica/Palmer Palmer
+ AQ -6734-06808 Antarctica/Rothera Rothera
+ AQ -720041+0023206 Antarctica/Troll Troll
++AQ -7824+10654 Antarctica/Vostok Vostok
+ AR -3436-05827 America/Argentina/Buenos_Aires Buenos Aires (BA, CF)
+ AR -3124-06411 America/Argentina/Cordoba most areas: CB, CC, CN, ER, FM, MN, SE, SF
+ AR -2447-06525 America/Argentina/Salta Salta (SA, LP, NQ, RN)
+ AR -2411-06518 America/Argentina/Jujuy Jujuy (JY)
+ AR -2649-06513 America/Argentina/Tucuman Tucumán (TM)
+-AR -2828-06547 America/Argentina/Catamarca Catamarca (CT); Chubut (CH)
++AR -2828-06547 America/Argentina/Catamarca Catamarca (CT), Chubut (CH)
+ AR -2926-06651 America/Argentina/La_Rioja La Rioja (LR)
+ AR -3132-06831 America/Argentina/San_Juan San Juan (SJ)
+ AR -3253-06849 America/Argentina/Mendoza Mendoza (MZ)
+@@ -82,7 +83,7 @@
+ BM +3217-06446 Atlantic/Bermuda
+ BO -1630-06809 America/La_Paz
+ BR -0351-03225 America/Noronha Atlantic islands
+-BR -0127-04829 America/Belem Pará (east); Amapá
++BR -0127-04829 America/Belem Pará (east), Amapá
+ BR -0343-03830 America/Fortaleza Brazil (northeast: MA, PI, CE, RN, PB)
+ BR -0803-03454 America/Recife Pernambuco
+ BR -0712-04812 America/Araguaina Tocantins
+@@ -100,19 +101,19 @@
+ BT +2728+08939 Asia/Thimphu
+ BY +5354+02734 Europe/Minsk
+ BZ +1730-08812 America/Belize
+-CA +4734-05243 America/St_Johns Newfoundland; Labrador (southeast)
+-CA +4439-06336 America/Halifax Atlantic - NS (most areas); PE
++CA +4734-05243 America/St_Johns Newfoundland, Labrador (SE)
++CA +4439-06336 America/Halifax Atlantic - NS (most areas), PE
+ CA +4612-05957 America/Glace_Bay Atlantic - NS (Cape Breton)
+ CA +4606-06447 America/Moncton Atlantic - New Brunswick
+ CA +5320-06025 America/Goose_Bay Atlantic - Labrador (most areas)
+-CA,BS +4339-07923 America/Toronto Eastern - ON, QC (most areas)
++CA,BS +4339-07923 America/Toronto Eastern - ON & QC (most areas)
+ CA +6344-06828 America/Iqaluit Eastern - NU (most areas)
+-CA +4953-09709 America/Winnipeg Central - ON (west); Manitoba
++CA +4953-09709 America/Winnipeg Central - ON (west), Manitoba
+ CA +744144-0944945 America/Resolute Central - NU (Resolute)
+ CA +624900-0920459 America/Rankin_Inlet Central - NU (central)
+ CA +5024-10439 America/Regina CST - SK (most areas)
+ CA +5017-10750 America/Swift_Current CST - SK (midwest)
+-CA +5333-11328 America/Edmonton Mountain - AB; BC (E); NT (E); SK (W)
++CA +5333-11328 America/Edmonton Mountain - AB, BC(E), NT(E), SK(W)
+ CA +690650-1050310 America/Cambridge_Bay Mountain - NU (west)
+ CA +682059-1334300 America/Inuvik Mountain - NT (west)
+ CA +5546-12014 America/Dawson_Creek MST - BC (Dawson Cr, Ft St John)
+@@ -127,7 +128,7 @@
+ CL -5309-07055 America/Punta_Arenas Region of Magallanes
+ CL -2709-10926 Pacific/Easter Easter Island
+ CN +3114+12128 Asia/Shanghai Beijing Time
+-CN,AQ +4348+08735 Asia/Urumqi Xinjiang Time, Vostok
++CN +4348+08735 Asia/Urumqi Xinjiang Time
+ CO +0436-07405 America/Bogota
+ CR +0956-08405 America/Costa_Rica
+ CU +2308-08222 America/Havana
+@@ -172,8 +173,8 @@
+ HU +4730+01905 Europe/Budapest
+ ID -0610+10648 Asia/Jakarta Java, Sumatra
+ ID -0002+10920 Asia/Pontianak Borneo (west, central)
+-ID -0507+11924 Asia/Makassar Borneo (east, south); Sulawesi/Celebes, Bali, Nusa Tengarra; Timor (west)
+-ID -0232+14042 Asia/Jayapura New Guinea (West Papua / Irian Jaya); Malukus/Moluccas
++ID -0507+11924 Asia/Makassar Borneo (east, south), Sulawesi/Celebes, Bali, Nusa Tengarra, Timor (west)
++ID -0232+14042 Asia/Jayapura New Guinea (West Papua / Irian Jaya), Malukus/Moluccas
+ IE +5320-00615 Europe/Dublin
+ IL +314650+0351326 Asia/Jerusalem
+ IN +2232+08822 Asia/Kolkata
+@@ -252,7 +253,7 @@
+ PL +5215+02100 Europe/Warsaw
+ PM +4703-05620 America/Miquelon
+ PN -2504-13005 Pacific/Pitcairn
+-PR,AG,CA,AI,AW,BL,BQ,CW,DM,GD,GP,KN,LC,MF,MS,SX,TT,VC,VG,VI +182806-0660622 America/Puerto_Rico AST
++PR,AG,CA,AI,AW,BL,BQ,CW,DM,GD,GP,KN,LC,MF,MS,SX,TT,VC,VG,VI +182806-0660622 America/Puerto_Rico AST - QC (Lower North Shore)
+ PS +3130+03428 Asia/Gaza Gaza Strip
+ PS +313200+0350542 Asia/Hebron West Bank
+ PT +3843-00908 Europe/Lisbon Portugal (mainland)
+@@ -288,7 +289,7 @@
+ RU +643337+1431336 Asia/Ust-Nera MSK+07 - Oymyakonsky
+ RU +5934+15048 Asia/Magadan MSK+08 - Magadan
+ RU +4658+14242 Asia/Sakhalin MSK+08 - Sakhalin Island
+-RU +6728+15343 Asia/Srednekolymsk MSK+08 - Sakha (E); N Kuril Is
++RU +6728+15343 Asia/Srednekolymsk MSK+08 - Sakha (E), N Kuril Is
+ RU +5301+15839 Asia/Kamchatka MSK+09 - Kamchatka
+ RU +6445+17729 Asia/Anadyr MSK+09 - Bering Sea
+ SA,AQ,KW,YE +2438+04643 Asia/Riyadh Syowa
+@@ -330,7 +331,7 @@
+ US +465042-1012439 America/North_Dakota/New_Salem Central - ND (Morton rural)
+ US +471551-1014640 America/North_Dakota/Beulah Central - ND (Mercer)
+ US +394421-1045903 America/Denver Mountain (most areas)
+-US +433649-1161209 America/Boise Mountain - ID (south); OR (east)
++US +433649-1161209 America/Boise Mountain - ID (south), OR (east)
+ US,CA +332654-1120424 America/Phoenix MST - AZ (most areas), Creston BC
+ US +340308-1181434 America/Los_Angeles Pacific
+ US +611305-1495401 America/Anchorage Alaska (most areas)
+--- /dev/null
++++ contrib/tzdata/zonenow.tab
+@@ -0,0 +1,303 @@
++# tzdb timezone descriptions, for users who do not care about old timestamps
++#
++# This file is in the public domain.
++#
++# From Paul Eggert (2023-12-18):
++# This file contains a table where each row stands for a timezone
++# where civil timestamps are predicted to agree from now on.
++# This file is like zone1970.tab (see zone1970.tab's coments),
++# but with the following changes:
++#
++# 1. Each timezone corresponds to a set of clocks that are planned
++# to agree from now on. This is a larger set of clocks than in
++# zone1970.tab, where each timezone's clocks must agree from 1970 on.
++# 2. The first column is irrelevant and ignored.
++# 3. The table is sorted in a different way:
++# first by standard time UTC offset;
++# then, if DST is used, by daylight saving UTC offset;
++# then by time zone abbreviation.
++# 4. Every timezone has a nonempty comments column, with wording
++# distinguishing the timezone only from other timezones with the
++# same UTC offset at some point during the year.
++#
++# The format of this table is experimental, and may change in future versions.
++#
++# This table is intended as an aid for users, to help them select timezones
++# appropriate for their practical needs. It is not intended to take or
++# endorse any position on legal or territorial claims.
++#
++#XX coordinates TZ comments
++#
++# -11 - SST
++XX -1416-17042 Pacific/Pago_Pago Midway; Samoa ("SST")
++#
++# -11
++XX -1901-16955 Pacific/Niue Niue
++#
++# -10 - HST
++XX +211825-1575130 Pacific/Honolulu Hawaii ("HST")
++#
++# -10
++XX -1732-14934 Pacific/Tahiti Tahiti; Cook Islands
++#
++# -10/-09 - HST / HDT (North America DST)
++XX +515248-1763929 America/Adak western Aleutians in Alaska ("HST/HDT")
++#
++# -09:30
++XX -0900-13930 Pacific/Marquesas Marquesas
++#
++# -09
++XX -2308-13457 Pacific/Gambier Gambier
++#
++# -09/-08 - AKST/AKDT (North America DST)
++XX +611305-1495401 America/Anchorage most of Alaska ("AKST/AKDT")
++#
++# -08
++XX -2504-13005 Pacific/Pitcairn Pitcairn
++#
++# -08/-07 - PST/PDT (North America DST)
++XX +340308-1181434 America/Los_Angeles Pacific ("PST/PDT") - US & Canada; Mexico near US border
++#
++# -07 - MST
++XX +332654-1120424 America/Phoenix Mountain Standard ("MST") - Arizona; western Mexico; Yukon
++#
++# -07/-06 - MST/MDT (North America DST)
++XX +394421-1045903 America/Denver Mountain ("MST/MDT") - US & Canada; Mexico near US border
++#
++# -06
++XX -0054-08936 Pacific/Galapagos Galápagos
++#
++# -06 - CST
++XX +1924-09909 America/Mexico_City Central Standard ("CST") - Saskatchewan; central Mexico; Central America
++#
++# -06/-05 (Chile DST)
++XX -2709-10926 Pacific/Easter Easter Island
++#
++# -06/-05 - CST/CDT (North America DST)
++XX +415100-0873900 America/Chicago Central ("CST/CDT") - US & Canada; Mexico near US border
++#
++# -05
++XX -1203-07703 America/Lima eastern South America
++#
++# -05 - EST
++XX +175805-0764736 America/Jamaica Eastern Standard ("EST") - Caymans; Jamaica; eastern Mexico; Panama
++#
++# -05/-04 - CST/CDT (Cuba DST)
++XX +2308-08222 America/Havana Cuba
++#
++# -05/-04 - EST/EDT (North America DST)
++XX +404251-0740023 America/New_York Eastern ("EST/EDT") - US & Canada
++#
++# -04
++XX +1030-06656 America/Caracas western South America
++#
++# -04 - AST
++XX +1828-06954 America/Santo_Domingo Atlantic Standard ("AST") - eastern Caribbean
++#
++# -04/-03 (Chile DST)
++XX -3327-07040 America/Santiago most of Chile
++#
++# -04/-03 (Paraguay DST)
++XX -2516-05740 America/Asuncion Paraguay
++#
++# -04/-03 - AST/ADT (North America DST)
++XX +4439-06336 America/Halifax Atlantic ("AST/ADT") - Canada; Bermuda
++#
++# -03:30/-02:30 - NST/NDT (North America DST)
++XX +4734-05243 America/St_Johns Newfoundland ("NST/NDT")
++#
++# -03
++XX -2332-04637 America/Sao_Paulo eastern South America
++#
++# -03/-02 (North America DST)
++XX +4703-05620 America/Miquelon St Pierre & Miquelon
++#
++# -02
++XX -0351-03225 America/Noronha Fernando de Noronha; South Georgia
++#
++# -02/-01 (EU DST)
++XX +6411-05144 America/Nuuk most of Greenland
++#
++# -01
++XX +1455-02331 Atlantic/Cape_Verde Cape Verde
++#
++# -01/+00 (EU DST)
++XX +3744-02540 Atlantic/Azores Azores
++# -01/+00 (EU DST) until 2024-03-31; then -02/-01 (EU DST)
++XX +7029-02158 America/Scoresbysund Ittoqqortoormiit
++#
++# +00 - GMT
++XX +0519-00402 Africa/Abidjan far western Africa; Iceland ("GMT")
++#
++# +00/+01 - GMT/BST (EU DST)
++XX +513030-0000731 Europe/London United Kingdom ("GMT/BST")
++#
++# +00/+01 - WET/WEST (EU DST)
++XX +3843-00908 Europe/Lisbon western Europe ("WET/WEST")
++#
++# +00/+02 - Troll DST
++XX -720041+0023206 Antarctica/Troll Troll Station in Antarctica
++#
++# +01 - CET
++XX +3647+00303 Africa/Algiers Algeria, Tunisia ("CET")
++#
++# +01 - WAT
++XX +0627+00324 Africa/Lagos western Africa ("WAT")
++#
++# +01/+00 - IST/GMT (EU DST in reverse)
++XX +5320-00615 Europe/Dublin Ireland ("IST/GMT")
++#
++# +01/+00 - (Morocco DST)
++XX +3339-00735 Africa/Casablanca Morocco
++#
++# +01/+02 - CET/CEST (EU DST)
++XX +4852+00220 Europe/Paris central Europe ("CET/CEST")
++#
++# +02 - CAT
++XX -2558+03235 Africa/Maputo central Africa ("CAT")
++#
++# +02 - EET
++XX +3254+01311 Africa/Tripoli Libya; Kaliningrad ("EET")
++#
++# +02 - SAST
++XX -2615+02800 Africa/Johannesburg southern Africa ("SAST")
++#
++# +02/+03 - EET/EEST (EU DST)
++XX +3758+02343 Europe/Athens eastern Europe ("EET/EEST")
++#
++# +02/+03 - EET/EEST (Egypt DST)
++XX +3003+03115 Africa/Cairo Egypt
++#
++# +02/+03 - EET/EEST (Lebanon DST)
++XX +3353+03530 Asia/Beirut Lebanon
++#
++# +02/+03 - EET/EEST (Moldova DST)
++XX +4700+02850 Europe/Chisinau Moldova
++#
++# +02/+03 - EET/EEST (Palestine DST)
++XX +3130+03428 Asia/Gaza Palestine
++#
++# +02/+03 - IST/IDT (Israel DST)
++XX +314650+0351326 Asia/Jerusalem Israel
++#
++# +03
++XX +4101+02858 Europe/Istanbul Near East; Belarus
++#
++# +03 - EAT
++XX -0117+03649 Africa/Nairobi eastern Africa ("EAT")
++#
++# +03 - MSK
++XX +554521+0373704 Europe/Moscow Moscow ("MSK")
++#
++# +03:30
++XX +3540+05126 Asia/Tehran Iran
++#
++# +04
++XX +2518+05518 Asia/Dubai Russia; Caucasus; Persian Gulf; Seychelles; Réunion
++#
++# +04:30
++XX +3431+06912 Asia/Kabul Afghanistan
++#
++# +05
++XX +4120+06918 Asia/Tashkent Russia; west Kazakhstan; Tajikistan; Turkmenistan; Uzbekistan; Maldives
++#
++# +05 - PKT
++XX +2452+06703 Asia/Karachi Pakistan ("PKT")
++#
++# +05:30
++XX +0656+07951 Asia/Colombo Sri Lanka
++#
++# +05:30 - IST
++XX +2232+08822 Asia/Kolkata India ("IST")
++#
++# +05:45
++XX +2743+08519 Asia/Kathmandu Nepal
++#
++# +06
++XX +2343+09025 Asia/Dhaka Russia; Kyrgyzstan; Bhutan; Bangladesh; Chagos
++# +06 until 2024-03-01; then +05
++XX +4315+07657 Asia/Almaty Kazakhstan (except western areas)
++#
++# +06:30
++XX +1647+09610 Asia/Yangon Myanmar; Cocos
++#
++# +07
++XX +1345+10031 Asia/Bangkok Russia; Indochina; Christmas Island
++#
++# +07 - WIB
++XX -0610+10648 Asia/Jakarta Indonesia ("WIB")
++#
++# +08
++XX +0117+10351 Asia/Singapore Russia; Brunei; Malaysia; Singapore
++#
++# +08 - AWST
++XX -3157+11551 Australia/Perth Western Australia ("AWST")
++#
++# +08 - CST
++XX +3114+12128 Asia/Shanghai China ("CST")
++#
++# +08 - HKT
++XX +2217+11409 Asia/Hong_Kong Hong Kong ("HKT")
++#
++# +08 - PHT
++XX +1435+12100 Asia/Manila Philippines ("PHT")
++#
++# +08 - WITA
++XX -0507+11924 Asia/Makassar Indonesia ("WITA")
++#
++# +08:45
++XX -3143+12852 Australia/Eucla Eucla
++#
++# +09
++XX +5203+11328 Asia/Chita Russia; Palau; East Timor
++#
++# +09 - JST
++XX +353916+1394441 Asia/Tokyo Japan ("JST")
++#
++# +09 - KST
++XX +3733+12658 Asia/Seoul Korea ("KST")
++#
++# +09 - WIT
++XX -0232+14042 Asia/Jayapura Indonesia ("WIT")
++#
++# +09:30 - ACST
++XX -1228+13050 Australia/Darwin Northern Territory ("ACST")
++#
++# +09:30/+10:30 - ACST/ACDT (Australia DST)
++XX -3455+13835 Australia/Adelaide South Australia ("ACST/ACDT")
++#
++# +10
++XX +4310+13156 Asia/Vladivostok Russia; Yap; Chuuk; Papua New Guinea; Dumont d'Urville
++#
++# +10 - AEST
++XX -2728+15302 Australia/Brisbane Queensland ("AEST")
++#
++# +10 - ChST
++XX +1328+14445 Pacific/Guam Mariana Islands ("ChST")
++#
++# +10/+11 - AEST/AEDT (Australia DST)
++XX -3352+15113 Australia/Sydney southeast Australia ("AEST/AEDT")
++#
++# +10:30/+11
++XX -3133+15905 Australia/Lord_Howe Lord Howe Island
++#
++# +11
++XX -0613+15534 Pacific/Bougainville Russia; Kosrae; Bougainville; Solomons
++#
++# +11/+12 (Australia DST)
++XX -2903+16758 Pacific/Norfolk Norfolk Island
++#
++# +12
++XX +5301+15839 Asia/Kamchatka Russia; Tuvalu; Fiji; etc.
++#
++# +12/+13 (New Zealand DST)
++XX -3652+17446 Pacific/Auckland New Zealand ("NZST/NZDT")
++#
++# +12:45/+13:45 (Chatham DST)
++XX -4357-17633 Pacific/Chatham Chatham Islands
++#
++# +13
++XX -210800-1751200 Pacific/Tongatapu Kanton; Tokelau; Samoa (western); Tonga
++#
++# +14
++XX +0152-15720 Pacific/Kiritimati Kiritimati
+--- usr.sbin/periodic/etc/daily/480.leapfile-ntpd.orig
++++ usr.sbin/periodic/etc/daily/480.leapfile-ntpd
+@@ -12,9 +12,9 @@
+
+ case "$daily_ntpd_leapfile_enable" in
+ [Yy][Ee][Ss])
+- if service ntpd oneneedfetch; then
++ if service ntpd enabled && service ntpd needfetch; then
+ anticongestion
+- service ntpd onefetch
++ service ntpd fetch
+ fi
+ ;;
+ esac
+--- libexec/rc/rc.conf.orig
++++ libexec/rc/rc.conf
+@@ -421,8 +421,8 @@
+ ntp_src_leapfile="/etc/ntp/leap-seconds"
+ # Initial source for ntpd leapfile
+ ntp_db_leapfile="/var/db/ntpd.leap-seconds.list"
+- # Working copy (updated weekly) leapfile
+-ntp_leapfile_sources="https://www.ietf.org/timezones/data/leap-seconds.list"
++ # Canonical place to get the leap seconds from
++ntp_leapfile_sources="https://hpiers.obspm.fr/iers/bul/bulc/ntp/leap-seconds.list"
+ # Source from which to fetch leapfile
+ ntp_leapfile_fetch_opts="-mq" # Options to use for ntp leapfile fetch,
+ # e.g. --no-verify-peer
diff --git a/website/static/security/patches/EN-24:01/tzdata-2024a.patch.asc b/website/static/security/patches/EN-24:01/tzdata-2024a.patch.asc
new file mode 100644
index 0000000000..7a6b65e1aa
--- /dev/null
+++ b/website/static/security/patches/EN-24:01/tzdata-2024a.patch.asc
@@ -0,0 +1,16 @@
+-----BEGIN PGP SIGNATURE-----
+
+iQIzBAABCgAdFiEEthUnfoEIffdcgYM7bljekB8AGu8FAmXMYQkACgkQbljekB8A
+Gu9sxRAApIFupjUSxhQLOUUL3IaHMlV2IMF/nSyXjkGm5MYHmwY8r8KjrT1qMmkZ
+pJArXPFzxr/mMWsGux1VyP2Z6euiYapo1l2CCSSUSbUvuWucZhq39bY6wAAbEo36
+t7XEifQ1mCnhnQIVRL3JyOzQfCQbnUWOF+xzRH5UbMCzSz1qHy5KSMgX9YN5PRqL
+KPZP0RzocLfaRdZ3TjsXrjCL/8CjvWCMTQ2NNKcEdH+66Ek1g0ciOy+QEwIIa8IX
+J3XNFrkkGkozm/c0J2VZgs8GU9PrHK5cAryEPBGZg+L+noE3KL/Szv8OAH4G+ZYC
+c/wLsYY/vNhL56yAG43s3KSsgZXt+QtZOkSYBR9fwvMw7LBSI2y5HGeM7FncDO8n
+KI1bA9G0Y2/jAnmCoKBXqqwigV6SRT3FtMEIs3nCEz1s8T6aCA76aVv0rlmvuO/m
+/SvpDDc2BjVGcnpVFiNzZeWjMzOWMVqHvzRokgQuCfjTXyd0p+Cq49LROp0z/P9r
+2CZK7j7cZkP8DaLi4BN1osJzWKIUuY69b6T8i6xbg2QB8KSDJuiV0/8iFkzpADvB
+qexSMaLM42VgBMHkypqupXXLoFh0rOMcgMXskG5aBRZGpT12PbqkPvj7IJXulYkf
+DYikNRezyXySUJ3H/AWdZhxYF4atOofFqhb6zPQQ3ASzNZPFEwk=
+=KKM/
+-----END PGP SIGNATURE-----
diff --git a/website/static/security/patches/EN-24:02/libutil.patch b/website/static/security/patches/EN-24:02/libutil.patch
new file mode 100644
index 0000000000..a53fff7d6d
--- /dev/null
+++ b/website/static/security/patches/EN-24:02/libutil.patch
@@ -0,0 +1,11 @@
+--- lib/libutil/login_class.c.orig
++++ lib/libutil/login_class.c
+@@ -546,7 +546,7 @@
+ /*
+ * Now, we repeat some of the above for the user's private entries
+ */
+- if (getuid() == uid && (lc = login_getuserclass(pwd)) != NULL) {
++ if (geteuid() == uid && (lc = login_getuserclass(pwd)) != NULL) {
+ mymask = setlogincontext(lc, pwd, mymask, flags);
+ login_close(lc);
+ }
diff --git a/website/static/security/patches/EN-24:02/libutil.patch.asc b/website/static/security/patches/EN-24:02/libutil.patch.asc
new file mode 100644
index 0000000000..6569aa29fa
--- /dev/null
+++ b/website/static/security/patches/EN-24:02/libutil.patch.asc
@@ -0,0 +1,16 @@
+-----BEGIN PGP SIGNATURE-----
+
+iQIzBAABCgAdFiEEthUnfoEIffdcgYM7bljekB8AGu8FAmXMYQsACgkQbljekB8A
+Gu/OQxAAiBl7mqf/XTcGmszQhlspHof71hbkx1JC6af42EQmBDO6Cz+441m0l8MF
+ppfU+TUZLjskFdHQx29XQz87GXn5xPl8uHvdQ9hj6gk1mre1naMH2H18WtqHp4er
+VDmzx52qYagSb43RmLXE2pQ4oHPMwWduqwTVqYgx8Tl3WoYcw9nVfJMpGL64jg2a
+FrwYNt1uI6H8Rm4NRkEALKpbj3jEe7tY3oqws/6BFDYdlIYBQE6Z4iyx95QJwJqI
+jRWQgGnqArCg1LWlCrUwMo3HcMpmcPr4apIpWxrtWeu0kSNS3VFgFYhqvPy1+fMn
+d6Gq6x4RjRuRmYZPWS8CGfyuphb+ZMtrblXeOBKRKn2oW7eHyoEn5/zhu3EoJdCK
+i79/A2WeY3n6T/IjOW8SbdmpF78r9Il6WooXvwjUluRT/R0aQjxzCWJVYK+deHm3
+MAVVF1XwW7ZRnq727dKXREdPTWKbyMQKghQCE63IKyGO5x3RTBRBgkyC8SACX6bF
+N5JKJYrjcxNOCZgqWEjROKNi91jUtd4oBPt2ZpUyr++jYriDm8/6Xv38y+ybShqG
+P0j2m27teZ7xH612aVeDRPUEMIUlvv03NjYKWa1i+e20vFdFYVon5qvUyXkvcnRs
+czC3MeMwaWb03mBr6p4VWadMNT+sLeqIZOqmijL2OcvDjndbZWQ=
+=EzzL
+-----END PGP SIGNATURE-----
diff --git a/website/static/security/patches/EN-24:03/kqueue.patch b/website/static/security/patches/EN-24:03/kqueue.patch
new file mode 100644
index 0000000000..53bf0db7fe
--- /dev/null
+++ b/website/static/security/patches/EN-24:03/kqueue.patch
@@ -0,0 +1,13 @@
+--- sys/kern/kern_sig.c.orig
++++ sys/kern/kern_sig.c
+@@ -4291,9 +4291,7 @@
+ static void
+ filt_sigdetach(struct knote *kn)
+ {
+- struct proc *p = kn->kn_ptr.p_proc;
+-
+- knlist_remove(p->p_klist, kn, 0);
++ knlist_remove(kn->kn_knlist, kn, 0);
+ }
+
+ /*
diff --git a/website/static/security/patches/EN-24:03/kqueue.patch.asc b/website/static/security/patches/EN-24:03/kqueue.patch.asc
new file mode 100644
index 0000000000..c0abd016fa
--- /dev/null
+++ b/website/static/security/patches/EN-24:03/kqueue.patch.asc
@@ -0,0 +1,16 @@
+-----BEGIN PGP SIGNATURE-----
+
+iQIzBAABCgAdFiEEthUnfoEIffdcgYM7bljekB8AGu8FAmXMYQ0ACgkQbljekB8A
+Gu/k3w/9HaTPxYkvTidhd/6BrWjY2SFX01k20EkW9T1GidVUQ5NcvEAabBwE18/7
+eQRJoAZjEiQUuKzh9uH8UgtQrngbeEaUkYiKXdOwV/ps91UD9vpmaHuy07mMwacM
+v3pCqWgYWTZD6HoOeWkilxtiKlSdZ3Cnxvgz7UGCFTylxUqbkg/2F31LwJJ5KxFy
+8RSPnwP0PZlUkDTfhqMVRt/KUVKIpg5IQ7ZVocIKxRm+XXRGgWcxdS41N4VrIwQ/
+C8DtJ/HJR3uF0WDXK+qa31oCvkhmaO6WGUHLahASqJZj86SnvEyAkcxU8GN4x5ZY
+ZFqq9Rd1EIjUThnFg1SXoXLEQ60DofQQ3ibMj7uUxvakn4k+A/692k511qN/v4AP
+9PEdRPFxwHcf7OF7+alqa7ssxzKcls9PSHFwQ/w9XaCmhc7xVmAWOeT8B2I0r8Yh
+f32G+YBhlRmOPLA+s625Tp1qIaL1OHkEXt0wB2Ceks6lDQ48Ya+dNUAwqSzBFADc
+U9kTqZLsjXQMkwieqN548010nbzOylC7TqFBUV8vTP10Qcl1ULbsHNweejaeTJTf
+MVQR/6sDQftqKTSoCVxGib1iJtNqCPJFro7D3MFRLzxrRERh6KBQ7r2ucrzeq0cN
+zZGibAcZc3T/1OmTomI+0h1x4fjT6AjCJDmnrX8+jTDf+MhsgJE=
+=wPX7
+-----END PGP SIGNATURE-----
diff --git a/website/static/security/patches/EN-24:04/ip.patch b/website/static/security/patches/EN-24:04/ip.patch
new file mode 100644
index 0000000000..5851876f83
--- /dev/null
+++ b/website/static/security/patches/EN-24:04/ip.patch
@@ -0,0 +1,150 @@
+--- sys/netinet/in_pcb.c.orig
++++ sys/netinet/in_pcb.c
+@@ -1403,26 +1403,6 @@
+ }
+ #endif /* INET */
+
+-/*
+- * in_pcbdetach() is responsibe for disassociating a socket from an inpcb.
+- * For most protocols, this will be invoked immediately prior to calling
+- * in_pcbfree(). However, with TCP the inpcb may significantly outlive the
+- * socket, in which case in_pcbfree() is deferred.
+- */
+-void
+-in_pcbdetach(struct inpcb *inp)
+-{
+-
+- KASSERT(inp->inp_socket != NULL, ("%s: inp_socket == NULL", __func__));
+-
+-#ifdef RATELIMIT
+- if (inp->inp_snd_tag != NULL)
+- in_pcbdetach_txrtlmt(inp);
+-#endif
+- inp->inp_socket->so_pcb = NULL;
+- inp->inp_socket = NULL;
+-}
+-
+ /*
+ * inpcb hash lookups are protected by SMR section.
+ *
+@@ -1733,19 +1713,30 @@
+ #endif
+
+ INP_WLOCK_ASSERT(inp);
+- KASSERT(inp->inp_socket == NULL, ("%s: inp_socket != NULL", __func__));
++ KASSERT(inp->inp_socket != NULL, ("%s: inp_socket == NULL", __func__));
+ KASSERT((inp->inp_flags & INP_FREED) == 0,
+ ("%s: called twice for pcb %p", __func__, inp));
+
+- inp->inp_flags |= INP_FREED;
++ /*
++ * in_pcblookup_local() and in6_pcblookup_local() may return an inpcb
++ * from the hash without acquiring inpcb lock, they rely on the hash
++ * lock, thus in_pcbremhash() should be the first action.
++ */
++ if (inp->inp_flags & INP_INHASHLIST)
++ in_pcbremhash(inp);
+ INP_INFO_WLOCK(pcbinfo);
+ inp->inp_gencnt = ++pcbinfo->ipi_gencnt;
+ pcbinfo->ipi_count--;
+ CK_LIST_REMOVE(inp, inp_list);
+ INP_INFO_WUNLOCK(pcbinfo);
+
+- if (inp->inp_flags & INP_INHASHLIST)
+- in_pcbremhash(inp);
++#ifdef RATELIMIT
++ if (inp->inp_snd_tag != NULL)
++ in_pcbdetach_txrtlmt(inp);
++#endif
++ inp->inp_flags |= INP_FREED;
++ inp->inp_socket->so_pcb = NULL;
++ inp->inp_socket = NULL;
+
+ RO_INVALIDATE_CACHE(&inp->inp_route);
+ #ifdef MAC
+--- sys/netinet/in_pcb.h.orig
++++ sys/netinet/in_pcb.h
+@@ -670,7 +670,6 @@
+ bool);
+ int in_pcbconnect_setup(struct inpcb *, struct sockaddr_in *, in_addr_t *,
+ u_short *, in_addr_t *, u_short *, struct ucred *);
+-void in_pcbdetach(struct inpcb *);
+ void in_pcbdisconnect(struct inpcb *);
+ void in_pcbdrop(struct inpcb *);
+ void in_pcbfree(struct inpcb *);
+--- sys/netinet/raw_ip.c.orig
++++ sys/netinet/raw_ip.c
+@@ -860,7 +860,6 @@
+ ip_rsvp_force_done(so);
+ if (so == V_ip_rsvpd)
+ ip_rsvp_done();
+- in_pcbdetach(inp);
+ in_pcbfree(inp);
+ }
+
+--- sys/netinet/tcp_syncache.c.orig
++++ sys/netinet/tcp_syncache.c
+@@ -803,7 +803,6 @@
+ }
+ inp = sotoinpcb(so);
+ if ((tp = tcp_newtcpcb(inp)) == NULL) {
+- in_pcbdetach(inp);
+ in_pcbfree(inp);
+ sodealloc(so);
+ goto allocfail;
+@@ -1051,7 +1050,6 @@
+ return (NULL);
+
+ abort:
+- in_pcbdetach(inp);
+ in_pcbfree(inp);
+ sodealloc(so);
+ if ((s = tcp_log_addrs(&sc->sc_inc, NULL, NULL, NULL))) {
+--- sys/netinet/tcp_usrreq.c.orig
++++ sys/netinet/tcp_usrreq.c
+@@ -175,7 +175,6 @@
+ tp = tcp_newtcpcb(inp);
+ if (tp == NULL) {
+ error = ENOBUFS;
+- in_pcbdetach(inp);
+ in_pcbfree(inp);
+ goto out;
+ }
+@@ -213,7 +212,6 @@
+ ("%s: inp %p not dropped or embryonic", __func__, inp));
+
+ tcp_discardcb(tp);
+- in_pcbdetach(inp);
+ in_pcbfree(inp);
+ }
+
+--- sys/netinet/udp_usrreq.c.orig
++++ sys/netinet/udp_usrreq.c
+@@ -1641,7 +1641,6 @@
+ KASSERT(inp->inp_faddr.s_addr == INADDR_ANY,
+ ("udp_detach: not disconnected"));
+ INP_WLOCK(inp);
+- in_pcbdetach(inp);
+ in_pcbfree(inp);
+ }
+
+--- sys/netinet6/raw_ip6.c.orig
++++ sys/netinet6/raw_ip6.c
+@@ -687,7 +687,6 @@
+ /* xxx: RSVP */
+ INP_WLOCK(inp);
+ free(inp->in6p_icmp6filt, M_PCB);
+- in_pcbdetach(inp);
+ in_pcbfree(inp);
+ }
+
+--- sys/netinet6/udp6_usrreq.c.orig
++++ sys/netinet6/udp6_usrreq.c
+@@ -1201,7 +1201,6 @@
+ KASSERT(inp != NULL, ("udp6_detach: inp == NULL"));
+
+ INP_WLOCK(inp);
+- in_pcbdetach(inp);
+ in_pcbfree(inp);
+ }
+
diff --git a/website/static/security/patches/EN-24:04/ip.patch.asc b/website/static/security/patches/EN-24:04/ip.patch.asc
new file mode 100644
index 0000000000..8f325e2cb3
--- /dev/null
+++ b/website/static/security/patches/EN-24:04/ip.patch.asc
@@ -0,0 +1,16 @@
+-----BEGIN PGP SIGNATURE-----
+
+iQIzBAABCgAdFiEEthUnfoEIffdcgYM7bljekB8AGu8FAmXMYQ8ACgkQbljekB8A
+Gu9EmBAAugzbROyodoFVhi5IqF38s1+IYOtM63VrFNED4SalgjzaJS0GQnsU0+eX
+2OsGZ+7z7f8nX0Ob9+tcgLdr8i4k6V41josos6t4szGZm7aYVYF4xP3y74R5DU7/
+ps6PXxh9vxl5z73jpv6YR6Mkfq8FybCtTzCMYlqBwgT2Ei9J8KK7DMv7Go/A8O93
+SMTCmF1ky87lfeZ/YaGy+WJIudUaLCqVegelOBCtzbed3opTF6pHOSZ9VbVmzC5c
+x8geUHGq6+u9fEKk5TOnaNnwspqYV8bp5s/tgmzAMloijC4z2vsUq0oHgbTtORqq
+78eZQVbXDQljGPh6Ojd4PWtdFeSTBBnyLrCZkQ222uEd1P6DxpcwaqP1J3jZ15c0
+69rEBecCbJUnRGSz+rUuAyQdZIlfLWpU+xOmnkxi/obBlOBzT6dklLawSSQBqiR/
+VvFbxIjTh+g0smn7Kdi7KNg58bgnsgaHuery2WsilTW2uHChI7yWwefYcktZ4NML
+rKNa0G/sxCZbKs4pBQKcBYwQOhySinwf+p9EE76ULQ2Ej0QWnrXeJM/KkZ9Cuemo
+JVr5x7YlbHTffPXdD64u1mWrNMqdh9HG7PPbAEtLxdJntxdgex/vIqUN6H2yN2fi
+39UFR9JCGV9y+uIzu/O73Oue0rzSH8RzqOHxwi/rrDi6eRtttho=
+=+b3N
+-----END PGP SIGNATURE-----
diff --git a/website/static/security/patches/SA-24:01/bhyveload-13.2.patch b/website/static/security/patches/SA-24:01/bhyveload-13.2.patch
new file mode 100644
index 0000000000..ea4af29208
--- /dev/null
+++ b/website/static/security/patches/SA-24:01/bhyveload-13.2.patch
@@ -0,0 +1,137 @@
+--- usr.sbin/bhyveload/bhyveload.c.orig
++++ usr.sbin/bhyveload/bhyveload.c
+@@ -67,6 +67,7 @@
+ #include
+ #include
+
++#include
+ #include
+ #include
+ #include
+@@ -93,11 +94,11 @@
+
+ #define NDISKS 32
+
+-static char *host_base;
+ static struct termios term, oldterm;
+ static int disk_fd[NDISKS];
+ static int ndisks;
+ static int consin_fd, consout_fd;
++static int hostbase_fd = -1;
+
+ static int need_reinit;
+
+@@ -163,42 +164,61 @@
+ cb_open(void *arg, const char *filename, void **hp)
+ {
+ struct cb_file *cf;
+- char path[PATH_MAX];
++ struct stat sb;
++ int fd, flags;
+
+- if (!host_base)
++ cf = NULL;
++ fd = -1;
++ flags = O_RDONLY | O_RESOLVE_BENEATH;
++ if (hostbase_fd == -1)
+ return (ENOENT);
+
+- strlcpy(path, host_base, PATH_MAX);
+- if (path[strlen(path) - 1] == '/')
+- path[strlen(path) - 1] = 0;
+- strlcat(path, filename, PATH_MAX);
+- cf = malloc(sizeof(struct cb_file));
+- if (stat(path, &cf->cf_stat) < 0) {
+- free(cf);
++ /* Absolute paths are relative to our hostbase, chop off leading /. */
++ if (filename[0] == '/')
++ filename++;
++
++ /* Lookup of /, use . instead. */
++ if (filename[0] == '\0')
++ filename = ".";
++
++ if (fstatat(hostbase_fd, filename, &sb, AT_RESOLVE_BENEATH) < 0)
+ return (errno);
++
++ if (!S_ISDIR(sb.st_mode) && !S_ISREG(sb.st_mode))
++ return (EINVAL);
++
++ if (S_ISDIR(sb.st_mode))
++ flags |= O_DIRECTORY;
++
++ /* May be opening the root dir */
++ fd = openat(hostbase_fd, filename, flags);
++ if (fd < 0)
++ return (errno);
++
++ cf = malloc(sizeof(struct cb_file));
++ if (cf == NULL) {
++ close(fd);
++ return (ENOMEM);
+ }
+
++ cf->cf_stat = sb;
+ cf->cf_size = cf->cf_stat.st_size;
++
+ if (S_ISDIR(cf->cf_stat.st_mode)) {
+ cf->cf_isdir = 1;
+- cf->cf_u.dir = opendir(path);
+- if (!cf->cf_u.dir)
+- goto out;
+- *hp = cf;
+- return (0);
+- }
+- if (S_ISREG(cf->cf_stat.st_mode)) {
++ cf->cf_u.dir = fdopendir(fd);
++ if (cf->cf_u.dir == NULL) {
++ close(fd);
++ free(cf);
++ return (ENOMEM);
++ }
++ } else {
++ assert(S_ISREG(cf->cf_stat.st_mode));
+ cf->cf_isdir = 0;
+- cf->cf_u.fd = open(path, O_RDONLY);
+- if (cf->cf_u.fd < 0)
+- goto out;
+- *hp = cf;
+- return (0);
++ cf->cf_u.fd = fd;
+ }
+-
+-out:
+- free(cf);
+- return (EINVAL);
++ *hp = cf;
++ return (0);
+ }
+
+ static int
+@@ -712,6 +732,17 @@
+ exit(1);
+ }
+
++static void
++hostbase_open(const char *base)
++{
++
++ if (hostbase_fd != -1)
++ close(hostbase_fd);
++ hostbase_fd = open(base, O_DIRECTORY | O_PATH);
++ if (hostbase_fd == -1)
++ err(EX_OSERR, "open");
++}
++
+ int
+ main(int argc, char** argv)
+ {
+@@ -746,7 +777,7 @@
+ break;
+
+ case 'h':
+- host_base = optarg;
++ hostbase_open(optarg);
+ break;
+
+ case 'l':
diff --git a/website/static/security/patches/SA-24:01/bhyveload-13.2.patch.asc b/website/static/security/patches/SA-24:01/bhyveload-13.2.patch.asc
new file mode 100644
index 0000000000..764c050735
--- /dev/null
+++ b/website/static/security/patches/SA-24:01/bhyveload-13.2.patch.asc
@@ -0,0 +1,16 @@
+-----BEGIN PGP SIGNATURE-----
+
+iQIzBAABCgAdFiEEthUnfoEIffdcgYM7bljekB8AGu8FAmXMYREACgkQbljekB8A
+Gu/FTRAA34D4cV0RkVOaGZ28h2QV1cRIdPIcfZfBRASeiHTAsdssOIBWdKWPaDs+
+VSB6mTHq5YBJwrtsMZTwn+NOA9QjPKBiYhT5WPxx/GrbP4IwZ8WSco6oTTO2pygE
+1XCUbdESJQGRczsfpsxfQU/YxqxvXA6GQ4AiV+c4/TtGbSBKkxceYaqU3fRHd72X
+eaJ8QiliB2yiDsJ7lIeGKdWrCGARYvnXKJMHRF4KFuBjz8NT9ZLwYWw/pD9YLA6G
+0N146Zahz9u/RKOqdA8aNxfwlQ3s10Bc+FBzQ8MP+gtLTHyQ1hwI0wPAoEzj5sJ5
+G8jyAH4umjzbH3LQKJGvRt9i9uoWC9fls2MjEE9gBffVrLsxS537Ub2V2OCQ21Tu
+cB5kWU71LSwHYTL1MMxT19QiYoShoK1Ty19t/rXYCiqE+diQHn2QFpFzU7crjm8n
+/Vg9zAII0yT2IvqnEFhKP1EgAowzA0I9E0XOvw189ULzs0Pr4C/YPmvd8jxrFClt
+Q96d9UI2Lcldo9eoeZ1E6eG3sRWWWa1E9UBXlsUZduMTKp2kz1TdmEzYZTfMe8w6
+EQtpPAOSkUL/Y8tCRm7kSZFHAew78mjImogagLjAoivc04jckgDg8MrbaQzz8N9B
+s5CjOWt2jD7dOap9SbLuneArNRMZQ8DBtRrJvONlCrkjVLSbuXI=
+=CHdG
+-----END PGP SIGNATURE-----
diff --git a/website/static/security/patches/SA-24:01/bhyveload-14.0.patch b/website/static/security/patches/SA-24:01/bhyveload-14.0.patch
new file mode 100644
index 0000000000..20c02e7ca4
--- /dev/null
+++ b/website/static/security/patches/SA-24:01/bhyveload-14.0.patch
@@ -0,0 +1,129 @@
+--- usr.sbin/bhyveload/bhyveload.c.orig
++++ usr.sbin/bhyveload/bhyveload.c
+@@ -88,11 +88,11 @@
+
+ #define NDISKS 32
+
+-static char *host_base;
+ static struct termios term, oldterm;
+ static int disk_fd[NDISKS];
+ static int ndisks;
+ static int consin_fd, consout_fd;
++static int hostbase_fd = -1;
+
+ static int need_reinit;
+
+@@ -159,42 +159,61 @@
+ cb_open(void *arg __unused, const char *filename, void **hp)
+ {
+ struct cb_file *cf;
+- char path[PATH_MAX];
++ struct stat sb;
++ int fd, flags;
+
+- if (!host_base)
++ cf = NULL;
++ fd = -1;
++ flags = O_RDONLY | O_RESOLVE_BENEATH;
++ if (hostbase_fd == -1)
+ return (ENOENT);
+
+- strlcpy(path, host_base, PATH_MAX);
+- if (path[strlen(path) - 1] == '/')
+- path[strlen(path) - 1] = 0;
+- strlcat(path, filename, PATH_MAX);
+- cf = malloc(sizeof(struct cb_file));
+- if (stat(path, &cf->cf_stat) < 0) {
+- free(cf);
++ /* Absolute paths are relative to our hostbase, chop off leading /. */
++ if (filename[0] == '/')
++ filename++;
++
++ /* Lookup of /, use . instead. */
++ if (filename[0] == '\0')
++ filename = ".";
++
++ if (fstatat(hostbase_fd, filename, &sb, AT_RESOLVE_BENEATH) < 0)
+ return (errno);
++
++ if (!S_ISDIR(sb.st_mode) && !S_ISREG(sb.st_mode))
++ return (EINVAL);
++
++ if (S_ISDIR(sb.st_mode))
++ flags |= O_DIRECTORY;
++
++ /* May be opening the root dir */
++ fd = openat(hostbase_fd, filename, flags);
++ if (fd < 0)
++ return (errno);
++
++ cf = malloc(sizeof(struct cb_file));
++ if (cf == NULL) {
++ close(fd);
++ return (ENOMEM);
+ }
+
++ cf->cf_stat = sb;
+ cf->cf_size = cf->cf_stat.st_size;
++
+ if (S_ISDIR(cf->cf_stat.st_mode)) {
+ cf->cf_isdir = 1;
+- cf->cf_u.dir = opendir(path);
+- if (!cf->cf_u.dir)
+- goto out;
+- *hp = cf;
+- return (0);
+- }
+- if (S_ISREG(cf->cf_stat.st_mode)) {
++ cf->cf_u.dir = fdopendir(fd);
++ if (cf->cf_u.dir == NULL) {
++ close(fd);
++ free(cf);
++ return (ENOMEM);
++ }
++ } else {
++ assert(S_ISREG(cf->cf_stat.st_mode));
+ cf->cf_isdir = 0;
+- cf->cf_u.fd = open(path, O_RDONLY);
+- if (cf->cf_u.fd < 0)
+- goto out;
+- *hp = cf;
+- return (0);
++ cf->cf_u.fd = fd;
+ }
+-
+-out:
+- free(cf);
+- return (EINVAL);
++ *hp = cf;
++ return (0);
+ }
+
+ static int
+@@ -714,6 +733,17 @@
+ exit(1);
+ }
+
++static void
++hostbase_open(const char *base)
++{
++
++ if (hostbase_fd != -1)
++ close(hostbase_fd);
++ hostbase_fd = open(base, O_DIRECTORY | O_PATH);
++ if (hostbase_fd == -1)
++ err(EX_OSERR, "open");
++}
++
+ int
+ main(int argc, char** argv)
+ {
+@@ -748,7 +778,7 @@
+ break;
+
+ case 'h':
+- host_base = optarg;
++ hostbase_open(optarg);
+ break;
+
+ case 'l':
diff --git a/website/static/security/patches/SA-24:01/bhyveload-14.0.patch.asc b/website/static/security/patches/SA-24:01/bhyveload-14.0.patch.asc
new file mode 100644
index 0000000000..20c758702f
--- /dev/null
+++ b/website/static/security/patches/SA-24:01/bhyveload-14.0.patch.asc
@@ -0,0 +1,16 @@
+-----BEGIN PGP SIGNATURE-----
+
+iQIzBAABCgAdFiEEthUnfoEIffdcgYM7bljekB8AGu8FAmXMYRIACgkQbljekB8A
+Gu8tTA//fV7t4r0OBHgY0OZLMSPa6lwBx6oPVtfGXKEtCIxZc0oSoTf7Ld0n6crL
+CYjurf+jRrtVSqyfh/P5L8TGgDHSx6+Y296ln8459Nyj4IzJeulnlOeGQR99Ey2z
+lEq5Ezqdydav6nKmVXxOcGZQOlRMBtDNG4wlSK4S2BVtQ9cwzWUyhiC19RhZgAjl
+r1zU55iJf6H3LEYxSUCSixNaTTqTkhcEm8il+swBsK8fIp2yRvXtJi8Pnui5AiMD
+wvVmUmroDLvGl9E7M1RQUjOpumher94Bj/yBfCK0gmAm4tjntl4sfZ4nvgO3WH/a
+o0Sxg5WPPGSym06WtKzYWzrHz48Nm7qH96zBVNdOHvMEdnaYciJYy8NJQNnWpNUT
+HKYFWaPthcgfhfwmJFot4GxKKTM7ijq+AV5VVtoQLnm55u+vUpnxECgXTG3WYlDy
+fxYXQjoOH/GF+RYBc6cUzIx7BrHQz8AwGoOotmTVEQUiQY6uNi9734Sq1yLvoi2h
+ocWOuaotph7ZyVMxN4/iNj6mmkxP5IuROCUWey1m2Lj+VIvYugFBR2GVHsKqlQgC
+fMCJVNJN+B2HaRPJq3z5NZtYNfZc572NF4vLws+8yUCkDMlqdajjrpjjD3r3tz8k
+IaIk2EiU1yGgqGZ5ePGNIa5OuO7b7zXJPpeb0pB3wpGfGr84W0E=
+=hkM7
+-----END PGP SIGNATURE-----
diff --git a/website/static/security/patches/SA-24:02/tty.patch b/website/static/security/patches/SA-24:02/tty.patch
new file mode 100644
index 0000000000..b7a34fa86f
--- /dev/null
+++ b/website/static/security/patches/SA-24:02/tty.patch
@@ -0,0 +1,55 @@
+--- sys/kern/tty.c.orig
++++ sys/kern/tty.c
+@@ -44,6 +44,7 @@
+ #ifdef COMPAT_43TTY
+ #include
+ #endif /* COMPAT_43TTY */
++#include
+ #include
+ #include
+ #include
+@@ -1308,9 +1309,11 @@
+ sysctl_kern_ttys(SYSCTL_HANDLER_ARGS)
+ {
+ unsigned long lsize;
++ struct thread *td = curthread;
+ struct xtty *xtlist, *xt;
+ struct tty *tp;
+- int error;
++ struct proc *p;
++ int cansee, error;
+
+ sx_slock(&tty_list_sx);
+ lsize = tty_list_count * sizeof(struct xtty);
+@@ -1323,13 +1326,28 @@
+
+ TAILQ_FOREACH(tp, &tty_list, t_list) {
+ tty_lock(tp);
+- tty_to_xtty(tp, xt);
++ if (tp->t_session != NULL) {
++ p = tp->t_session->s_leader;
++ PROC_LOCK(p);
++ cansee = (p_cansee(td, p) == 0);
++ PROC_UNLOCK(p);
++ } else {
++ cansee = !jailed(td->td_ucred);
++ }
++ if (cansee) {
++ tty_to_xtty(tp, xt);
++ xt++;
++ }
+ tty_unlock(tp);
+- xt++;
+ }
+ sx_sunlock(&tty_list_sx);
+
+- error = SYSCTL_OUT(req, xtlist, lsize);
++ lsize = (xt - xtlist) * sizeof(struct xtty);
++ if (lsize > 0) {
++ error = SYSCTL_OUT(req, xtlist, lsize);
++ } else {
++ error = 0;
++ }
+ free(xtlist, M_TTY);
+ return (error);
+ }
diff --git a/website/static/security/patches/SA-24:02/tty.patch.asc b/website/static/security/patches/SA-24:02/tty.patch.asc
new file mode 100644
index 0000000000..4bfe03cc43
--- /dev/null
+++ b/website/static/security/patches/SA-24:02/tty.patch.asc
@@ -0,0 +1,16 @@
+-----BEGIN PGP SIGNATURE-----
+
+iQIzBAABCgAdFiEEthUnfoEIffdcgYM7bljekB8AGu8FAmXMYRQACgkQbljekB8A
+Gu/q5RAAtsZyZuV1QLpdsdE18DiiiMTSTmZX6RHTCmIdMScwJNszYG4C6mo5hWQx
++l6e8JM1HqBqx6P7KrJQb+LxRgnBVF/dKfBXzR4++UnDrQ/NMKdC5yr7OjhqKGD9
+7fkPU2d4fm3S+rQ/+FzXkySRyIkEtrTRrs76FhAfSL7Sv+KS2XLYMIk3va6JIcj/
+JDGcu3A4fpfc1qCLgBFTjKpStKXiOcbSAGI0ToRmXqIuFKvyd9lUiZnUM5UECslH
+3rYxuiJZznPqFmw3Mx8C8avPARBOVtx6xrQr3Ena7nDCGRjJzJYWUlmLD5Q8hD6e
+2STkarDA476+UefOgYtOtDMUKtFaZI+BGOtkUoq5T2GJpdyx8vKCit8zIISUeCpq
+gzQ36I/XVFtmOb0RZnkOguOLMBdHM2r+BtqFJw+FFTGM7U3ZWpnqVHalqt6PTi+6
+vEUGijebjRme0hrkCRVecUERs2dStomjWoDWxGeuU0PewChuzzF/A8CZsP9bA+Ok
+/eeexwP160nkt7DaNVnvgoB0yNmJ6uDX7GWO0SI5sOU4/p/X4CcdBYUoVzBJaEz3
+NoJ1ycbJ/K+bBGQnVBH6nNPPAT4TQh7oCxlUULAQulJXO6TqGrN6HsKDVR732LCu
+u6lhkpDtRCj8A1+vBszMdpam/2UTX1CG+sVCEob52K/60KRPTIc=
+=vBUT
+-----END PGP SIGNATURE-----