kernel-5.15.17-0

* Thu Jan 27 2022 Justin M. Forbes <jforbes@fedoraproject.org> [5.15.17-0]
- Revert "PCI/MSI: Mask MSI-X vectors only on success" (Justin M. Forbes)
Resolves: rhbz#

Signed-off-by: Justin M. Forbes <jforbes@fedoraproject.org>
This commit is contained in:
Justin M. Forbes 2022-01-27 10:03:08 -06:00
parent 6c12dff3f9
commit 0c347acd30
No known key found for this signature in database
GPG Key ID: B8FA7924A4B1C140
18 changed files with 63 additions and 100 deletions

View File

@ -1,3 +1,6 @@
https://gitlab.com/cki-project/kernel-ark/-/commit/63aede4769015c5f4cccb3f297229905f547dab5
63aede4769015c5f4cccb3f297229905f547dab5 Revert "PCI/MSI: Mask MSI-X vectors only on success"
https://gitlab.com/cki-project/kernel-ark/-/commit/d585d2f953aa602153c0912e68c27015c4c77320
d585d2f953aa602153c0912e68c27015c4c77320 drm/amdgpu: don't do resets on APUs which don't support it

View File

@ -4620,7 +4620,6 @@ CONFIG_NET_TEAM_MODE_LOADBALANCE=m
CONFIG_NET_TEAM_MODE_RANDOM=m
CONFIG_NET_TEAM_MODE_ROUNDROBIN=m
# CONFIG_NET_TULIP is not set
CONFIG_NET_UDP_TUNNEL=m
# CONFIG_NET_VENDOR_3COM is not set
CONFIG_NET_VENDOR_8390=y
# CONFIG_NET_VENDOR_ADAPTEC is not set

View File

@ -4596,7 +4596,6 @@ CONFIG_NET_TEAM_MODE_LOADBALANCE=m
CONFIG_NET_TEAM_MODE_RANDOM=m
CONFIG_NET_TEAM_MODE_ROUNDROBIN=m
# CONFIG_NET_TULIP is not set
CONFIG_NET_UDP_TUNNEL=m
# CONFIG_NET_VENDOR_3COM is not set
CONFIG_NET_VENDOR_8390=y
# CONFIG_NET_VENDOR_ADAPTEC is not set

View File

@ -4693,7 +4693,6 @@ CONFIG_NET_TEAM_MODE_LOADBALANCE=m
CONFIG_NET_TEAM_MODE_RANDOM=m
CONFIG_NET_TEAM_MODE_ROUNDROBIN=m
# CONFIG_NET_TULIP is not set
CONFIG_NET_UDP_TUNNEL=m
# CONFIG_NET_VENDOR_3COM is not set
CONFIG_NET_VENDOR_8390=y
# CONFIG_NET_VENDOR_ADAPTEC is not set

View File

@ -4670,7 +4670,6 @@ CONFIG_NET_TEAM_MODE_LOADBALANCE=m
CONFIG_NET_TEAM_MODE_RANDOM=m
CONFIG_NET_TEAM_MODE_ROUNDROBIN=m
# CONFIG_NET_TULIP is not set
CONFIG_NET_UDP_TUNNEL=m
# CONFIG_NET_VENDOR_3COM is not set
CONFIG_NET_VENDOR_8390=y
# CONFIG_NET_VENDOR_ADAPTEC is not set

View File

@ -4592,7 +4592,6 @@ CONFIG_NET_TEAM_MODE_LOADBALANCE=m
CONFIG_NET_TEAM_MODE_RANDOM=m
CONFIG_NET_TEAM_MODE_ROUNDROBIN=m
# CONFIG_NET_TULIP is not set
CONFIG_NET_UDP_TUNNEL=m
# CONFIG_NET_VENDOR_3COM is not set
CONFIG_NET_VENDOR_8390=y
# CONFIG_NET_VENDOR_ADAPTEC is not set

View File

@ -4569,7 +4569,6 @@ CONFIG_NET_TEAM_MODE_LOADBALANCE=m
CONFIG_NET_TEAM_MODE_RANDOM=m
CONFIG_NET_TEAM_MODE_ROUNDROBIN=m
# CONFIG_NET_TULIP is not set
CONFIG_NET_UDP_TUNNEL=m
# CONFIG_NET_VENDOR_3COM is not set
CONFIG_NET_VENDOR_8390=y
# CONFIG_NET_VENDOR_ADAPTEC is not set

View File

@ -4206,7 +4206,6 @@ CONFIG_NET_TEAM_MODE_LOADBALANCE=m
CONFIG_NET_TEAM_MODE_RANDOM=m
CONFIG_NET_TEAM_MODE_ROUNDROBIN=m
CONFIG_NET_TULIP=y
CONFIG_NET_UDP_TUNNEL=m
CONFIG_NET_VENDOR_3COM=y
CONFIG_NET_VENDOR_8390=y
CONFIG_NET_VENDOR_ADAPTEC=y

View File

@ -4183,7 +4183,6 @@ CONFIG_NET_TEAM_MODE_LOADBALANCE=m
CONFIG_NET_TEAM_MODE_RANDOM=m
CONFIG_NET_TEAM_MODE_ROUNDROBIN=m
CONFIG_NET_TULIP=y
CONFIG_NET_UDP_TUNNEL=m
CONFIG_NET_VENDOR_3COM=y
CONFIG_NET_VENDOR_8390=y
CONFIG_NET_VENDOR_ADAPTEC=y

View File

@ -3941,7 +3941,6 @@ CONFIG_NET_TEAM_MODE_LOADBALANCE=m
CONFIG_NET_TEAM_MODE_RANDOM=m
CONFIG_NET_TEAM_MODE_ROUNDROBIN=m
CONFIG_NET_TULIP=y
CONFIG_NET_UDP_TUNNEL=m
CONFIG_NET_VENDOR_3COM=y
CONFIG_NET_VENDOR_8390=y
CONFIG_NET_VENDOR_ADAPTEC=y

View File

@ -3917,7 +3917,6 @@ CONFIG_NET_TEAM_MODE_LOADBALANCE=m
CONFIG_NET_TEAM_MODE_RANDOM=m
CONFIG_NET_TEAM_MODE_ROUNDROBIN=m
CONFIG_NET_TULIP=y
CONFIG_NET_UDP_TUNNEL=m
CONFIG_NET_VENDOR_3COM=y
CONFIG_NET_VENDOR_8390=y
CONFIG_NET_VENDOR_ADAPTEC=y

View File

@ -3922,7 +3922,6 @@ CONFIG_NET_TEAM_MODE_LOADBALANCE=m
CONFIG_NET_TEAM_MODE_RANDOM=m
CONFIG_NET_TEAM_MODE_ROUNDROBIN=m
CONFIG_NET_TULIP=y
CONFIG_NET_UDP_TUNNEL=m
# CONFIG_NET_VENDOR_3COM is not set
# CONFIG_NET_VENDOR_8390 is not set
# CONFIG_NET_VENDOR_ADAPTEC is not set

View File

@ -3898,7 +3898,6 @@ CONFIG_NET_TEAM_MODE_LOADBALANCE=m
CONFIG_NET_TEAM_MODE_RANDOM=m
CONFIG_NET_TEAM_MODE_ROUNDROBIN=m
CONFIG_NET_TULIP=y
CONFIG_NET_UDP_TUNNEL=m
# CONFIG_NET_VENDOR_3COM is not set
# CONFIG_NET_VENDOR_8390 is not set
# CONFIG_NET_VENDOR_ADAPTEC is not set

View File

@ -4250,7 +4250,6 @@ CONFIG_NET_TEAM_MODE_LOADBALANCE=m
CONFIG_NET_TEAM_MODE_RANDOM=m
CONFIG_NET_TEAM_MODE_ROUNDROBIN=m
CONFIG_NET_TULIP=y
CONFIG_NET_UDP_TUNNEL=m
CONFIG_NET_VENDOR_3COM=y
CONFIG_NET_VENDOR_8390=y
CONFIG_NET_VENDOR_ADAPTEC=y

View File

@ -4227,7 +4227,6 @@ CONFIG_NET_TEAM_MODE_LOADBALANCE=m
CONFIG_NET_TEAM_MODE_RANDOM=m
CONFIG_NET_TEAM_MODE_ROUNDROBIN=m
CONFIG_NET_TULIP=y
CONFIG_NET_UDP_TUNNEL=m
CONFIG_NET_VENDOR_3COM=y
CONFIG_NET_VENDOR_8390=y
CONFIG_NET_VENDOR_ADAPTEC=y

View File

@ -128,7 +128,7 @@ Summary: The Linux kernel
# The kernel tarball/base version
%define kversion 5.15
%define rpmversion 5.15.16
%define rpmversion 5.15.17
%define patchversion 5.15
%define pkgrelease 200
@ -682,7 +682,7 @@ BuildRequires: lld
# exact git commit you can run
#
# xzcat -qq ${TARBALL} | git get-tar-commit-id
Source0: linux-5.15.16.tar.xz
Source0: linux-5.15.17.tar.xz
Source1: Makefile.rhelver
@ -1374,8 +1374,8 @@ ApplyOptionalPatch()
fi
}
%setup -q -n kernel-5.15.16 -c
mv linux-5.15.16 linux-%{KVERREL}
%setup -q -n kernel-5.15.17 -c
mv linux-5.15.17 linux-%{KVERREL}
cd linux-%{KVERREL}
cp -a %{SOURCE1} .
@ -2972,6 +2972,9 @@ fi
#
#
%changelog
* Thu Jan 27 2022 Justin M. Forbes <jforbes@fedoraproject.org> [5.15.17-0]
- Revert "PCI/MSI: Mask MSI-X vectors only on success" (Justin M. Forbes)
* Thu Jan 20 2022 Justin M. Forbes <jforbes@fedoraproject.org> [5.15.16-0]
- drm/amdgpu: don't do resets on APUs which don't support it (Alex Deucher)

View File

@ -23,17 +23,14 @@
drivers/firmware/efi/Makefile | 1 +
drivers/firmware/efi/efi.c | 124 +++++++++++++++------
drivers/firmware/efi/secureboot.c | 38 +++++++
drivers/gpu/drm/amd/amdgpu/cik.c | 4 +
drivers/gpu/drm/amd/amdgpu/vi.c | 4 +
drivers/hid/hid-rmi.c | 64 -----------
drivers/hwtracing/coresight/coresight-etm4x-core.c | 19 ++++
drivers/input/rmi4/rmi_driver.c | 124 ++++++++++++---------
drivers/iommu/iommu.c | 22 ++++
drivers/net/wireless/intel/iwlwifi/mvm/scan.c | 2 +-
drivers/net/wireless/marvell/mwifiex/usb.c | 3 +-
drivers/nvme/host/core.c | 22 +++-
drivers/nvme/host/multipath.c | 19 ++--
drivers/nvme/host/nvme.h | 4 +
drivers/pci/msi.c | 13 +--
drivers/pci/quirks.c | 24 ++++
drivers/platform/x86/thinkpad_acpi.c | 4 +-
drivers/usb/core/hub.c | 7 ++
@ -54,7 +51,7 @@
security/lockdown/lockdown.c | 1 +
security/security.c | 6 +
tools/testing/selftests/netfilter/nft_nat.sh | 5 +-
56 files changed, 808 insertions(+), 207 deletions(-)
53 files changed, 800 insertions(+), 215 deletions(-)
diff --git a/Documentation/admin-guide/kernel-parameters.txt b/Documentation/admin-guide/kernel-parameters.txt
index 8ff6dafafdf8..e3f786336cf9 100644
@ -77,7 +74,7 @@ index 8ff6dafafdf8..e3f786336cf9 100644
This is normally done in pci_enable_device(),
so this option is a temporary workaround
diff --git a/Makefile b/Makefile
index af173c9df942..b8b62c920fdf 100644
index 088197ed3f66..18279618693d 100644
--- a/Makefile
+++ b/Makefile
@@ -18,6 +18,10 @@ $(if $(filter __%, $(MAKECMDGOALS)), \
@ -579,11 +576,11 @@ index c68e694fca26..146cba5ae5bc 100644
return ctx.rc;
}
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
index 5b54c80b9d32..86c314f8d8a0 100644
index 6e9cd41c5f9b..07db2f6afa17 100644
--- a/drivers/acpi/scan.c
+++ b/drivers/acpi/scan.c
@@ -1720,6 +1720,15 @@ static bool acpi_device_enumeration_by_parent(struct acpi_device *device)
if (!acpi_match_device_ids(device, i2c_multi_instantiate_ids))
@@ -1727,6 +1727,15 @@ static bool acpi_device_enumeration_by_parent(struct acpi_device *device)
if (!acpi_match_device_ids(device, ignore_serial_bus_ids))
return false;
+ /*
@ -689,7 +686,7 @@ index fe91090e04a4..f00bc6886913 100644
rv = ipmi_register_driver();
mutex_unlock(&ipmi_interfaces_mutex);
diff --git a/drivers/char/random.c b/drivers/char/random.c
index 7470ee24db2f..a3ac18f64ba7 100644
index a27ae3999ff3..dc4e136adb08 100644
--- a/drivers/char/random.c
+++ b/drivers/char/random.c
@@ -335,6 +335,7 @@
@ -722,7 +719,7 @@ index 7470ee24db2f..a3ac18f64ba7 100644
/**********************************************************************
*
* OS independent entropy store. Here are the functions which handle
@@ -1878,6 +1887,13 @@ random_poll(struct file *file, poll_table * wait)
@@ -1880,6 +1889,13 @@ random_poll(struct file *file, poll_table * wait)
return mask;
}
@ -736,7 +733,7 @@ index 7470ee24db2f..a3ac18f64ba7 100644
static int
write_pool(struct entropy_store *r, const char __user *buffer, size_t count)
{
@@ -1981,7 +1997,58 @@ static int random_fasync(int fd, struct file *filp, int on)
@@ -1983,7 +1999,58 @@ static int random_fasync(int fd, struct file *filp, int on)
return fasync_helper(fd, filp, on, &fasync);
}
@ -795,7 +792,7 @@ index 7470ee24db2f..a3ac18f64ba7 100644
.read = random_read,
.write = random_write,
.poll = random_poll,
@@ -1992,6 +2059,7 @@ const struct file_operations random_fops = {
@@ -1994,6 +2061,7 @@ const struct file_operations random_fops = {
};
const struct file_operations urandom_fops = {
@ -803,7 +800,7 @@ index 7470ee24db2f..a3ac18f64ba7 100644
.read = urandom_read,
.write = random_write,
.unlocked_ioctl = random_ioctl,
@@ -2000,9 +2068,31 @@ const struct file_operations urandom_fops = {
@@ -2002,9 +2070,31 @@ const struct file_operations urandom_fops = {
.llseek = noop_llseek,
};
@ -835,7 +832,7 @@ index 7470ee24db2f..a3ac18f64ba7 100644
int ret;
if (flags & ~(GRND_NONBLOCK|GRND_RANDOM|GRND_INSECURE))
@@ -2018,6 +2108,18 @@ SYSCALL_DEFINE3(getrandom, char __user *, buf, size_t, count,
@@ -2020,6 +2110,18 @@ SYSCALL_DEFINE3(getrandom, char __user *, buf, size_t, count,
if (count > INT_MAX)
count = INT_MAX;
@ -854,7 +851,7 @@ index 7470ee24db2f..a3ac18f64ba7 100644
if (!(flags & GRND_INSECURE) && !crng_ready()) {
if (flags & GRND_NONBLOCK)
return -EAGAIN;
@@ -2324,3 +2426,16 @@ void add_bootloader_randomness(const void *buf, unsigned int size)
@@ -2329,3 +2431,16 @@ void add_bootloader_randomness(const void *buf, unsigned int size)
add_device_randomness(buf, size);
}
EXPORT_SYMBOL_GPL(add_bootloader_randomness);
@ -1072,36 +1069,6 @@ index 000000000000..de0a3714a5d4
+ }
+ }
+}
diff --git a/drivers/gpu/drm/amd/amdgpu/cik.c b/drivers/gpu/drm/amd/amdgpu/cik.c
index 54f28c075f21..f10ce740a29c 100644
--- a/drivers/gpu/drm/amd/amdgpu/cik.c
+++ b/drivers/gpu/drm/amd/amdgpu/cik.c
@@ -1428,6 +1428,10 @@ static int cik_asic_reset(struct amdgpu_device *adev)
{
int r;
+ /* APUs don't have full asic reset */
+ if (adev->flags & AMD_IS_APU)
+ return 0;
+
if (cik_asic_reset_method(adev) == AMD_RESET_METHOD_BACO) {
dev_info(adev->dev, "BACO reset\n");
r = amdgpu_dpm_baco_reset(adev);
diff --git a/drivers/gpu/drm/amd/amdgpu/vi.c b/drivers/gpu/drm/amd/amdgpu/vi.c
index fe9a7cc8d9eb..6645ebbd2696 100644
--- a/drivers/gpu/drm/amd/amdgpu/vi.c
+++ b/drivers/gpu/drm/amd/amdgpu/vi.c
@@ -956,6 +956,10 @@ static int vi_asic_reset(struct amdgpu_device *adev)
{
int r;
+ /* APUs don't have full asic reset */
+ if (adev->flags & AMD_IS_APU)
+ return 0;
+
if (vi_asic_reset_method(adev) == AMD_RESET_METHOD_BACO) {
dev_info(adev->dev, "BACO reset\n");
r = amdgpu_dpm_baco_reset(adev);
diff --git a/drivers/hid/hid-rmi.c b/drivers/hid/hid-rmi.c
index 311eee599ce9..2460c6bd46f8 100644
--- a/drivers/hid/hid-rmi.c
@ -1446,7 +1413,7 @@ index 258d5fe3d395..f7298e3dc8f3 100644
if (data->f01_container->dev.driver) {
/* Driver already bound, so enable ATTN now. */
diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c
index 3303d707bab4..372edaaafaa1 100644
index f62fb6a58f10..26ade573cec9 100644
--- a/drivers/iommu/iommu.c
+++ b/drivers/iommu/iommu.c
@@ -7,6 +7,7 @@
@ -1457,7 +1424,7 @@ index 3303d707bab4..372edaaafaa1 100644
#include <linux/dma-iommu.h>
#include <linux/kernel.h>
#include <linux/bits.h>
@@ -3118,6 +3119,27 @@ u32 iommu_sva_get_pasid(struct iommu_sva *handle)
@@ -3119,6 +3120,27 @@ u32 iommu_sva_get_pasid(struct iommu_sva *handle)
}
EXPORT_SYMBOL_GPL(iommu_sva_get_pasid);
@ -1485,33 +1452,6 @@ index 3303d707bab4..372edaaafaa1 100644
/*
* Changes the default domain of an iommu group that has *only* one device
*
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/scan.c b/drivers/net/wireless/intel/iwlwifi/mvm/scan.c
index d78e436fa8b5..b064d3137e46 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/scan.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/scan.c
@@ -2490,7 +2490,7 @@ static int iwl_mvm_check_running_scans(struct iwl_mvm *mvm, int type)
return -EIO;
}
-#define SCAN_TIMEOUT 20000
+#define SCAN_TIMEOUT 30000
void iwl_mvm_scan_timeout_wk(struct work_struct *work)
{
diff --git a/drivers/net/wireless/marvell/mwifiex/usb.c b/drivers/net/wireless/marvell/mwifiex/usb.c
index 9736aa0ab7fd..8f01fcbe9396 100644
--- a/drivers/net/wireless/marvell/mwifiex/usb.c
+++ b/drivers/net/wireless/marvell/mwifiex/usb.c
@@ -130,7 +130,8 @@ static int mwifiex_usb_recv(struct mwifiex_adapter *adapter,
default:
mwifiex_dbg(adapter, ERROR,
"unknown recv_type %#x\n", recv_type);
- return -1;
+ ret = -1;
+ goto exit_restore_skb;
}
break;
case MWIFIEX_USB_EP_DATA:
diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
index f8dd664b2eda..0ff9ea8340e4 100644
--- a/drivers/nvme/host/core.c
@ -1648,11 +1588,42 @@ index ed79a6c7e804..961dc67d7261 100644
static inline void nvme_kick_requeue_lists(struct nvme_ctrl *ctrl)
{
}
diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c
index cc4c2b8a5efd..96132d68be1e 100644
--- a/drivers/pci/msi.c
+++ b/drivers/pci/msi.c
@@ -721,6 +721,9 @@ static int msix_capability_init(struct pci_dev *dev, struct msix_entry *entries,
goto out_disable;
}
+ /* Ensure that all table entries are masked. */
+ msix_mask_all(base, tsize);
+
ret = msix_setup_entries(dev, base, entries, nvec, affd);
if (ret)
goto out_disable;
@@ -747,16 +750,6 @@ static int msix_capability_init(struct pci_dev *dev, struct msix_entry *entries,
/* Set MSI-X enabled bits and unmask the function */
pci_intx_for_msi(dev, 0);
dev->msix_enabled = 1;
-
- /*
- * Ensure that all table entries are masked to prevent
- * stale entries from firing in a crash kernel.
- *
- * Done late to deal with a broken Marvell NVME device
- * which takes the MSI-X mask bits into account even
- * when MSI-X is disabled, which prevents MSI delivery.
- */
- msix_mask_all(base, tsize);
pci_msix_clear_and_set_ctrl(dev, PCI_MSIX_FLAGS_MASKALL, 0);
pcibios_free_irq(dev);
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
index 208fa03acdda..88cfaa8ac3b3 100644
index 0663762ea69d..3f1215e8c5b2 100644
--- a/drivers/pci/quirks.c
+++ b/drivers/pci/quirks.c
@@ -4269,6 +4269,30 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_BROADCOM, 0x9000,
@@ -4272,6 +4272,30 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_BROADCOM, 0x9000,
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_BROADCOM, 0x9084,
quirk_bridge_cavm_thrx2_pcie_root);
@ -1702,10 +1673,10 @@ index 3dc055ce6e61..bb56640eb31f 100644
static inline bool tpacpi_is_led_restricted(const unsigned int led)
{
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
index 3bc4a86c3d0a..e346da4f58f2 100644
index ac6c5ccfe1cb..ec784479eece 100644
--- a/drivers/usb/core/hub.c
+++ b/drivers/usb/core/hub.c
@@ -5666,6 +5666,13 @@ static void hub_event(struct work_struct *work)
@@ -5669,6 +5669,13 @@ static void hub_event(struct work_struct *work)
(u16) hub->change_bits[0],
(u16) hub->event_bits[0]);

View File

@ -1,3 +1,3 @@
SHA512 (linux-5.15.16.tar.xz) = c963494c8f80a63db7e4db77aaf6b18b6a0c4c03c3c42d44490ab2fb541593b5e4f28ccfe9a6fad8dc7994aa27e02533a41b7de08618e6461246b86001e4cf98
SHA512 (kernel-abi-stablelists-5.15.16-200.tar.bz2) = 8c48387deceb0af61e3bbdeafe65cdc970c0346732f9278abbe26058a3a9ed618f5c03fa886d94156e3b977dd7d498975ef9db3ea89e1c0970d37ecef20e5855
SHA512 (kernel-kabi-dw-5.15.16-200.tar.bz2) = 77af2f3b4f5c0aef169102cc4ee34f97fdd4dcc0b7f338ac4b5d214884f8e8479cfb242fa634857cbc51cd5d6d30f027d0a9fe7bf0c0a311bf6979324a252433
SHA512 (linux-5.15.17.tar.xz) = 113ace76ff678efcf5ddf74faec7a0bdbf18a139f56cf01ad8ca7392727aa9a042da91bd1468ac0ab5e9cb53239b2a2a925f3e24cfa1499906b522d92c9a7468
SHA512 (kernel-abi-stablelists-5.15.17-200.tar.bz2) = 88267475ed0858205be3be11e71942e25b6cfb3783f3d3f3ab85d213ebceb6ed03f8207f56e9a8714f2664ba51049798d76636ce8b26805ea64a5e22d3cdcb5e
SHA512 (kernel-kabi-dw-5.15.17-200.tar.bz2) = 3d6b1a94c79d3ba13a33cb310522e80a5cf27309a457437092e1c5155dfc166b33e09ff1dce1475369b60890db50aec9896f1af9d9b87ff049ea33b5d87f045f