Compare commits

...

No commits in common. "c8" and "c10s" have entirely different histories.
c8 ... c10s

7 changed files with 289 additions and 241 deletions

3
.gitignore vendored
View File

@ -1 +1,2 @@
SOURCES/pygobject-3.28.3.tar.xz
/pygobject-3.44.1.tar.xz
/pygobject-3.46.0.tar.xz

View File

@ -1 +0,0 @@
bd173699b62832163ad23f8e076ec9513d875d2d SOURCES/pygobject-3.28.3.tar.xz

View File

@ -0,0 +1,29 @@
From 6f5a15e4c1a466dcc17bb2d64ef28842c4f7a000 Mon Sep 17 00:00:00 2001
From: Arjan Molenaar <gaphor@gmail.com>
Date: Sun, 17 Sep 2023 22:39:29 +0200
Subject: [PATCH] Fix tests when no GTK3 is installed
The Atk module was not used, yet imported. Atk is not a GTK 4 module.
---
tests/test_atoms.py | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/tests/test_atoms.py b/tests/test_atoms.py
index a74db38ce..febff78c1 100644
--- a/tests/test_atoms.py
+++ b/tests/test_atoms.py
@@ -2,10 +2,9 @@ import os
import unittest
try:
- from gi.repository import Gtk, Atk, Gdk
+ from gi.repository import Gtk, Gdk
except ImportError:
Gdk = None
- Atk = None
Gtk = None
from .helper import capture_glib_deprecation_warnings
--
GitLab

View File

@ -1,158 +0,0 @@
From eb791e7cca0998bc75e0b3f7e8ecf2672c96d7f8 Mon Sep 17 00:00:00 2001
From: Ray Strode <rstrode@redhat.com>
Date: Wed, 10 Jun 2020 18:04:07 -0400
Subject: [PATCH] IntrospectionModule: handle two threads loading type at same
time
If two threads are trying to load a type at exactly the same time,
it's possible for two wrappers to get generated for the type.
One thread will end up with the wrapper that's not blessed as the
"real" one and future calls will fail. The blessed wrapper will
be incomplete, and so future calls from it will fail as well.
This commit adds a lock to ensure the two threads don't stomp
on each others toes.
---
gi/module.py | 110 +++++++++++++++++++++++++++------------------------
1 file changed, 58 insertions(+), 52 deletions(-)
--- a/gi/module.py 2020-06-10 18:09:19.292409072 -0400
+++ b/gi/module.py 2020-06-10 18:11:24.727045466 -0400
@@ -24,6 +24,7 @@ from __future__ import absolute_import
import sys
import importlib
+from threading import Lock
_have_py3 = (sys.version_info[0] >= 3)
@@ -131,6 +132,8 @@ class IntrospectionModule(object):
if self._version is None:
self._version = repository.get_version(self._namespace)
+ self._lock = Lock()
+
def __getattr__(self, name):
info = repository.find_by_name(self._namespace, name)
if not info:
@@ -139,39 +142,40 @@ class IntrospectionModule(object):
if isinstance(info, EnumInfo):
g_type = info.get_g_type()
- wrapper = g_type.pytype
+ with self._lock:
+ wrapper = g_type.pytype
- if wrapper is None:
- if info.is_flags():
- if g_type.is_a(TYPE_FLAGS):
- wrapper = flags_add(g_type)
- else:
- assert g_type == TYPE_NONE
- wrapper = flags_register_new_gtype_and_add(info)
- else:
- if g_type.is_a(TYPE_ENUM):
- wrapper = enum_add(g_type)
+ if wrapper is None:
+ if info.is_flags():
+ if g_type.is_a(TYPE_FLAGS):
+ wrapper = flags_add(g_type)
+ else:
+ assert g_type == TYPE_NONE
+ wrapper = flags_register_new_gtype_and_add(info)
else:
- assert g_type == TYPE_NONE
- wrapper = enum_register_new_gtype_and_add(info)
-
- wrapper.__info__ = info
- wrapper.__module__ = 'gi.repository.' + info.get_namespace()
-
- # Don't use upper() here to avoid locale specific
- # identifier conversion (e. g. in Turkish 'i'.upper() == 'i')
- # see https://bugzilla.gnome.org/show_bug.cgi?id=649165
- ascii_upper_trans = maketrans(
- 'abcdefgjhijklmnopqrstuvwxyz',
- 'ABCDEFGJHIJKLMNOPQRSTUVWXYZ')
- for value_info in info.get_values():
- value_name = value_info.get_name_unescaped().translate(ascii_upper_trans)
- setattr(wrapper, value_name, wrapper(value_info.get_value()))
- for method_info in info.get_methods():
- setattr(wrapper, method_info.__name__, method_info)
+ if g_type.is_a(TYPE_ENUM):
+ wrapper = enum_add(g_type)
+ else:
+ assert g_type == TYPE_NONE
+ wrapper = enum_register_new_gtype_and_add(info)
+
+ wrapper.__info__ = info
+ wrapper.__module__ = 'gi.repository.' + info.get_namespace()
+
+ # Don't use upper() here to avoid locale specific
+ # identifier conversion (e. g. in Turkish 'i'.upper() == 'i')
+ # see https://bugzilla.gnome.org/show_bug.cgi?id=649165
+ ascii_upper_trans = maketrans(
+ 'abcdefgjhijklmnopqrstuvwxyz',
+ 'ABCDEFGJHIJKLMNOPQRSTUVWXYZ')
+ for value_info in info.get_values():
+ value_name = value_info.get_name_unescaped().translate(ascii_upper_trans)
+ setattr(wrapper, value_name, wrapper(value_info.get_value()))
+ for method_info in info.get_methods():
+ setattr(wrapper, method_info.__name__, method_info)
- if g_type != TYPE_NONE:
- g_type.pytype = wrapper
+ if g_type != TYPE_NONE:
+ g_type.pytype = wrapper
elif isinstance(info, RegisteredTypeInfo):
g_type = info.get_g_type()
@@ -202,27 +206,28 @@ class IntrospectionModule(object):
else:
raise NotImplementedError(info)
- # Check if there is already a Python wrapper that is not a parent class
- # of the wrapper being created. If it is a parent, it is ok to clobber
- # g_type.pytype with a new child class wrapper of the existing parent.
- # Note that the return here never occurs under normal circumstances due
- # to caching on the __dict__ itself.
- if g_type != TYPE_NONE:
- type_ = g_type.pytype
- if type_ is not None and type_ not in bases:
- self.__dict__[name] = type_
- return type_
-
- dict_ = {
- '__info__': info,
- '__module__': 'gi.repository.' + self._namespace,
- '__gtype__': g_type
- }
- wrapper = metaclass(name, bases, dict_)
-
- # Register the new Python wrapper.
- if g_type != TYPE_NONE:
- g_type.pytype = wrapper
+ with self._lock:
+ # Check if there is already a Python wrapper that is not a parent class
+ # of the wrapper being created. If it is a parent, it is ok to clobber
+ # g_type.pytype with a new child class wrapper of the existing parent.
+ # Note that the return here never occurs under normal circumstances due
+ # to caching on the __dict__ itself.
+ if g_type != TYPE_NONE:
+ type_ = g_type.pytype
+ if type_ is not None and type_ not in bases:
+ self.__dict__[name] = type_
+ return type_
+
+ dict_ = {
+ '__info__': info,
+ '__module__': 'gi.repository.' + self._namespace,
+ '__gtype__': g_type
+ }
+ wrapper = metaclass(name, bases, dict_)
+
+ # Register the new Python wrapper.
+ if g_type != TYPE_NONE:
+ g_type.pytype = wrapper
elif isinstance(info, FunctionInfo):
wrapper = info

6
gating.yaml Normal file
View File

@ -0,0 +1,6 @@
--- !Policy
product_versions:
- rhel-10
decision_context: osci_compose_gate
rules:
- !PassingTestCaseRule {test_case_name: desktop-qe.desktop-ci.tier1-gating.functional}

View File

@ -1,45 +1,38 @@
# Last updated for version 3.27.5
%define glib2_version 2.38.0
%define gobject_introspection_version 1.46.0
%define pycairo_version 1.11.1
%global with_python3 1
%define python3_version 3.4
%global with_check 0
%define glib2_version 2.64.0
%define gobject_introspection_version 1.64.0
%define pycairo_version 1.16.0
%define python3_version 3.8
Name: pygobject3
Version: 3.28.3
Release: 2%{?dist}
Version: 3.46.0
Release: 7%{?dist}
Summary: Python bindings for GObject Introspection
License: LGPLv2+ and MIT
License: LGPL-2.1-or-later
URL: https://wiki.gnome.org/Projects/PyGObject
Source0: https://download.gnome.org/sources/pygobject/3.28/pygobject-%{version}.tar.xz
Source0: https://download.gnome.org/sources/pygobject/3.46/pygobject-%{version}.tar.xz
# gtk4 no longer uses atk
Patch0: 0001-Fix-tests-when-no-GTK3.patch
BuildRequires: glib2-devel >= %{glib2_version}
BuildRequires: gobject-introspection-devel >= %{gobject_introspection_version}
BuildRequires: pkgconfig(cairo-gobject)
BuildRequires: pkgconfig(glib-2.0) >= %{glib2_version}
BuildRequires: pkgconfig(gobject-introspection-1.0) >= %{gobject_introspection_version}
BuildRequires: pkgconfig(libffi)
BuildRequires: pkgconfig(py3cairo) >= %{pycairo_version}
BuildRequires: meson
BuildRequires: python3-devel >= %{python3_version}
BuildRequires: python3-cairo-devel >= %{pycairo_version}
BuildRequires: cairo-gobject-devel
# Required by the upstream selftest suite:
%if %{with_check}
BuildRequires: python3-pyflakes
BuildRequires: python3-pep8
## for the Gdk and Gtk typelibs, used during the test suite:
BuildRequires: python3-setuptools
# Test dependencies.
# Keep TEST_GTK_VERSION in %%check in sync with gtk version used here
BuildRequires: python3dist(pytest)
BuildRequires: gtk3
## for xvfb-run:
BuildRequires: xorg-x11-server-Xvfb
BuildRequires: dejavu-sans-fonts
BuildRequires: dejavu-sans-mono-fonts
BuildRequires: dejavu-serif-fonts
## for dbus-launch, used by test_gdbus:
BuildRequires: dbus-x11
%endif # with_check
BuildRequires: xwayland-run
BuildRequires: mutter
BuildRequires: mesa-dri-drivers
Patch0: 0001-IntrospectionModule-handle-two-threads-loading-type-.patch
# https://docs.fedoraproject.org/en-US/packaging-guidelines/Python_Appendix/#_byte_compilation_reproducibility
%global py_reproducible_pyc_path %{buildroot}%{python3_sitelib}
BuildRequires: /usr/bin/marshalparser
%description
The %{name} package provides a convenient wrapper for the GObject library
@ -59,88 +52,265 @@ for use in Python 3 programs.
%package -n python3-gobject-base
Summary: Python 3 bindings for GObject Introspection base package
Requires: gobject-introspection%{?_isa} >= %{gobject_introspection_version}
Requires: python3-gobject-base-noarch = %{version}-%{release}
%description -n python3-gobject-base
This package provides the non-cairo specific bits of the GObject Introspection
library.
library that are architecture specific.
%package devel
%package -n python3-gobject-base-noarch
Summary: Python 3 bindings for GObject Introspection base (not architecture dependent)
BuildArch: noarch
Requires: python3-gobject-base = %{version}-%{release}
%description -n python3-gobject-base-noarch
This package provides the non-cairo specific bits of the GObject Introspection
library that are not architecture specific.
%package -n python3-gobject-devel
Summary: Development files for embedding PyGObject introspection support
Requires: python3-gobject%{?_isa} = %{version}-%{release}
Requires: gobject-introspection-devel%{?_isa}
# Renamed in F31
Obsoletes: pygobject3-devel < 3.34.0-2
Provides: pygobject3-devel = %{version}-%{release}
%description devel
%description -n python3-gobject-devel
This package contains files required to embed PyGObject
%prep
%setup -q -n pygobject-%{version}
%patch0 -p1 -b .lockablock
find -name '*.py' | xargs sed -i '1s|^#!python|#!%{__python3}|'
%autosetup -n pygobject-%{version} -p1
%build
PYTHON=%{__python3}
export PYTHON
%configure
make %{?_smp_mflags} V=1
%meson -Dpython=%{__python3}
%meson_build
%install
PYTHON=%{__python3}
export PYTHON
%make_install
find $RPM_BUILD_ROOT -name '*.la' -delete
# Don't include makefiles in the installed docs, in order to avoid creating
# multilib conflicts
rm -rf _docs
mkdir _docs
cp -a examples _docs
rm _docs/examples/Makefile*
%meson_install
%check
%if %{with_check}
# Run the selftests under a temporary xvfb X server (so that they can
# initialize Gdk etc):
export TEST_GTK_VERSION=3.0
%{shrink:xwfb-run -c mutter -- %meson_test --timeout-multiplier=5}
PYTHON=%{__python3}
export PYTHON
xvfb-run make DESTDIR=$RPM_BUILD_ROOT check V=1
xvfb-run make DESTDIR=$RPM_BUILD_ROOT check V=1
%endif # with_check
%files -n python3-gobject
%{python3_sitearch}/gi/_gi_cairo*.so
%files -n python3-gobject-base
%dir %{python3_sitearch}/gi/
%pycached %{python3_sitearch}/gi/*.py
%{python3_sitearch}/gi/_gi.*.so
%{python3_sitearch}/PyGObject-*.egg-info
%files -n python3-gobject-base-noarch
%license COPYING
%doc NEWS
%dir %{python3_sitearch}/gi
%{python3_sitearch}/gi/*
%exclude %{python3_sitearch}/gi/_gi_cairo*.so
%{python3_sitearch}/pygobject-*.egg-info
%{python3_sitearch}/pygtkcompat/
%dir %{python3_sitelib}/gi/
%{python3_sitelib}/gi/overrides/
%{python3_sitelib}/gi/repository/
%{python3_sitelib}/pygtkcompat/
%files devel
%doc _docs/*
%files -n python3-gobject-devel
%dir %{_includedir}/pygobject-3.0/
%{_includedir}/pygobject-3.0/pygobject.h
%{_libdir}/pkgconfig/pygobject-3.0.pc
%changelog
* Thu Jun 11 2020 Ray Strode <rstrode@redhat.com> - 3.28.3-2
- Add lock to avoid two type object wrappers getting generated at
the same time in multi-threaded programs.
Resolves: #1844578
* Tue Oct 29 2024 Troy Dawson <tdawson@redhat.com> - 3.46.0-7
- Bump release for October 2024 mass rebuild:
Resolves: RHEL-64018
* Fri Aug 10 2018 Kalev Lember <klember@redhat.com> - 3.28.3-1
* Tue Jul 23 2024 Tomas Popela <tpopela@redhat.com> - 3.46.0-6
- Move away from xvfb-run (done by nielsdg@redhat.com in Fedora)
* Mon Jun 24 2024 Troy Dawson <tdawson@redhat.com> - 3.46.0-5
- Bump release for June 2024 mass rebuild
* Mon Feb 12 2024 Yaakov Selkowitz <yselkowi@redhat.com> - 3.46.0-4
- Use gtk3 in tests
* Fri Jan 26 2024 Fedora Release Engineering <releng@fedoraproject.org> - 3.46.0-3
- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild
* Sun Jan 21 2024 Fedora Release Engineering <releng@fedoraproject.org> - 3.46.0-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild
* Mon Sep 18 2023 Kalev Lember <klember@redhat.com> - 3.46.0-1
- Update to 3.46.0
* Fri Jul 21 2023 Fedora Release Engineering <releng@fedoraproject.org> - 3.44.1-3
- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild
* Thu Jun 15 2023 Python Maint <python-maint@redhat.com> - 3.44.1-2
- Rebuilt for Python 3.12
* Mon Mar 27 2023 David King <amigadave@amigadave.com> - 3.44.1-1
- Update to 3.44.1
* Sun Mar 19 2023 David King <amigadave@amigadave.com> - 3.44.0-1
- Update to 3.44.0
* Mon Feb 06 2023 David King <amigadave@amigadave.com> - 3.43.1-1
- Update to 3.43.1
* Fri Jan 20 2023 Fedora Release Engineering <releng@fedoraproject.org> - 3.42.2-3
- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild
* Fri Jul 22 2022 Fedora Release Engineering <releng@fedoraproject.org> - 3.42.2-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild
* Mon Jul 18 2022 Kalev Lember <klember@redhat.com> - 3.42.2-1
- Update to 3.42.2
* Mon Jun 13 2022 Python Maint <python-maint@redhat.com> - 3.42.1-2
- Rebuilt for Python 3.11
* Sun Apr 17 2022 David King <amigadave@amigadave.com> - 3.42.1-1
- Update to 3.42.1
* Mon Feb 07 2022 Miro Hrončok <mhroncok@redhat.com> - 3.42.0-4
- Move pure Python modules to a noarch subpackage
- Ensure Python bytecode installed in the noarch subpackage is bit-to-bit identical
Related: rhbz#1915764
* Fri Jan 21 2022 Fedora Release Engineering <releng@fedoraproject.org> - 3.42.0-3
- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild
* Sat Jan 08 2022 Miro Hrončok <mhroncok@redhat.com> - 3.42.0-2
- Rebuilt for https://fedoraproject.org/wiki/Changes/LIBFFI34
* Mon Sep 20 2021 Kalev Lember <klember@redhat.com> - 3.42.0-1
- Update to 3.42.0
* Fri Jul 23 2021 Fedora Release Engineering <releng@fedoraproject.org> - 3.40.1-5
- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild
* Thu Jun 03 2021 Python Maint <python-maint@redhat.com> - 3.40.1-4
- Rebuilt for Python 3.10
* Thu May 20 2021 Tomas Hrnciar <thrnciar@redhat.com> - 3.40.1-3
- Backport upstream PR to fix ImportWarning: DynamicImporter.find_spec() not found
- Fixes: rhbz#1958890
* Wed May 05 2021 Ray Strode <rstrode@redhat.com> - 3.40.1-2
- Add concurrency fix
Related: #1957130
* Tue Mar 30 2021 Kalev Lember <klember@redhat.com> - 3.40.1-1
- Update to 3.40.1
* Mon Mar 22 2021 Kalev Lember <klember@redhat.com> - 3.40.0-1
- Update to 3.40.0
* Wed Jan 27 2021 Fedora Release Engineering <releng@fedoraproject.org> - 3.38.0-3
- Rebuilt for https://fedoraproject.org/wiki/Fedora_34_Mass_Rebuild
* Mon Oct 05 2020 Kalev Lember <klember@redhat.com> - 3.38.0-2
- Explicity BuildRequire python3-setuptools
* Sat Sep 12 2020 Kalev Lember <klember@redhat.com> - 3.38.0-1
- Update to 3.38.0
* Sat Aug 01 2020 Fedora Release Engineering <releng@fedoraproject.org> - 3.36.1-4
- Second attempt - Rebuilt for
https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild
* Tue Jul 28 2020 Fedora Release Engineering <releng@fedoraproject.org> - 3.36.1-3
- Rebuilt for https://fedoraproject.org/wiki/Fedora_33_Mass_Rebuild
* Fri May 22 2020 Miro Hrončok <mhroncok@redhat.com> - 3.36.1-2
- Rebuilt for Python 3.9
* Thu May 07 2020 Kalev Lember <klember@redhat.com> - 3.36.1-1
- Update to 3.36.1
* Sun Mar 08 2020 Kalev Lember <klember@redhat.com> - 3.36.0-2
- Drop pkgconfig provides filtering as we no longer ship the Python 2 package
* Sun Mar 08 2020 Kalev Lember <klember@redhat.com> - 3.36.0-1
- Update to 3.36.0
* Thu Jan 30 2020 Fedora Release Engineering <releng@fedoraproject.org> - 3.34.0-5
- Rebuilt for https://fedoraproject.org/wiki/Fedora_32_Mass_Rebuild
* Thu Jan 16 2020 Miro Hrončok <mhroncok@redhat.com> - 3.34.0-4
- Subpackages python2-gobject, python2-gobject-base, python2-gobject-devel have been removed
See https://fedoraproject.org/wiki/Changes/RetirePython2
* Wed Sep 25 2019 Kalev Lember <klember@redhat.com> - 3.34.0-3
- Don't add pkgconfig provides to python2-gobject-devel
* Sat Sep 21 2019 Kalev Lember <klember@redhat.com> - 3.34.0-2
- Drop Python 3 conditionals
- Split pygobject3-devel into python2-gobject-devel and python3-gobject-devel
(#1749589)
* Mon Sep 09 2019 Kalev Lember <klember@redhat.com> - 3.34.0-1
- Update to 3.34.0
* Mon Aug 19 2019 Kalev Lember <klember@redhat.com> - 3.33.1-1
- Update to 3.33.1
* Thu Aug 15 2019 Miro Hrončok <mhroncok@redhat.com> - 3.32.2-3
- Rebuilt for Python 3.8
* Fri Jul 26 2019 Fedora Release Engineering <releng@fedoraproject.org> - 3.32.2-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_31_Mass_Rebuild
* Mon Jun 24 2019 Kalev Lember <klember@redhat.com> - 3.32.2-1
- Update to 3.32.2
* Tue Jun 18 2019 Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> - 3.32.1-2
- Fix build under python3.8 (#1717655)
* Mon May 06 2019 Kalev Lember <klember@redhat.com> - 3.32.1-1
- Update to 3.32.1
* Mon Mar 11 2019 Kalev Lember <klember@redhat.com> - 3.32.0-1
- Update to 3.32.0
* Thu Mar 07 2019 Kalev Lember <klember@redhat.com> - 3.31.4-1
- Update to 3.31.4
* Mon Feb 04 2019 Kalev Lember <klember@redhat.com> - 3.31.3-1
- Update to 3.31.3
* Sat Feb 02 2019 Fedora Release Engineering <releng@fedoraproject.org> - 3.31.2-2
- Rebuilt for https://fedoraproject.org/wiki/Fedora_30_Mass_Rebuild
* Wed Jan 23 2019 Kalev Lember <klember@redhat.com> - 3.31.2-1
- Update to 3.31.2
* Sat Dec 01 2018 Kalev Lember <klember@redhat.com> - 3.30.4-1
- Update to 3.30.4
* Tue Nov 27 2018 Kalev Lember <klember@redhat.com> - 3.30.3-1
- Update to 3.30.3
* Mon Nov 12 2018 Kalev Lember <klember@redhat.com> - 3.30.2-1
- Update to 3.30.2
* Fri Sep 14 2018 Kalev Lember <klember@redhat.com> - 3.30.1-1
- Update to 3.30.1
* Fri Sep 14 2018 Dan Horák <dan[at]danny.cz> - 3.30.0-2
- Include temporary big endian fix (#1623547)
* Thu Sep 06 2018 Kalev Lember <klember@redhat.com> - 3.30.0-1
- Update to 3.30.0
* Mon Aug 13 2018 Kalev Lember <klember@redhat.com> - 3.29.2-1
- Update to 3.29.2
* Fri Jul 13 2018 Fedora Release Engineering <releng@fedoraproject.org> - 3.28.3-3
- Rebuilt for https://fedoraproject.org/wiki/Fedora_29_Mass_Rebuild
* Fri Jun 15 2018 Miro Hrončok <mhroncok@redhat.com> - 3.28.3-2
- Rebuilt for Python 3.7
* Fri Jun 01 2018 Kalev Lember <klember@redhat.com> - 3.28.3-1
- Update to 3.28.3
* Tue Aug 07 2018 Petr Viktorin <pviktori@redhat.com> - 3.28.2-2
- Remove the python2 subpackages
https://bugzilla.redhat.com/show_bug.cgi?id=1590819
* Wed Mar 28 2018 Kalev Lember <klember@redhat.com> - 3.28.2-1
- Update to 3.28.2

1
sources Normal file
View File

@ -0,0 +1 @@
SHA512 (pygobject-3.46.0.tar.xz) = 48293c193ba5aece38d99f45d325d0329ac33e88442bf00848fe818a7c838977b8d2cf50a404c30e8852ccc0b4a44dfda07751d51acc21f740aa2ab6aa3ce661