Update to latest upstream release (bz 1403093).

Also:
- Drop all patches; all have been upstreamed.
- Drop ancient obsoletes.
- Drop the yap interface since yap has been retired.
This commit is contained in:
Jerry James 2017-03-03 09:02:23 -07:00
parent 9af3a510db
commit a1cd3069e7
8 changed files with 21 additions and 403 deletions

1
.gitignore vendored
View File

@ -3,3 +3,4 @@ ppl-0.10.2.tar.bz2
/ppl-0.11.2.tar.bz2
/ppl-1.0.tar.bz2
/ppl-1.1.tar.bz2
/ppl-1.2.tar.bz2

View File

@ -1,20 +0,0 @@
diff -up ppl-1.1/interfaces/Prolog/GNU/gprolog_efli.hh.orig ppl-1.1/interfaces/Prolog/GNU/gprolog_efli.hh
--- ppl-1.1/interfaces/Prolog/GNU/gprolog_efli.hh.orig 2014-04-29 17:25:21.639273848 -0300
+++ ppl-1.1/interfaces/Prolog/GNU/gprolog_efli.hh 2014-04-29 17:25:30.757274198 -0300
@@ -45,14 +45,14 @@ extern bool Prolog_has_unbounded_integer
integer value representable by a Prolog integer.
Holds zero otherwise.
*/
-extern long Prolog_min_integer;
+extern PlLong Prolog_min_integer;
/*!
If \p Prolog_has_unbounded_integers is false, holds the maximum
integer value representable by a Prolog integer.
Holds zero otherwise.
*/
-extern long Prolog_max_integer;
+extern PlLong Prolog_max_integer;
/*!
Performs system-dependent initialization.

View File

@ -1,238 +0,0 @@
diff -up ppl-1.1/src/Dense_Row_defs.hh.orig ppl-1.1/src/Dense_Row_defs.hh
--- ppl-1.1/src/Dense_Row_defs.hh.orig 2014-04-29 13:08:10.516682937 -0300
+++ ppl-1.1/src/Dense_Row_defs.hh 2014-04-29 13:08:50.447684466 -0300
@@ -33,6 +33,7 @@ site: http://bugseng.com/products/ppl/ .
#include <memory>
#include <vector>
#include <limits>
+#include <cstddef>
#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
//! A finite sequence of coefficients.
@@ -433,7 +434,7 @@ public:
typedef std::bidirectional_iterator_tag iterator_category;
typedef Coefficient value_type;
- typedef ptrdiff_t difference_type;
+ typedef std::ptrdiff_t difference_type;
typedef value_type* pointer;
typedef value_type& reference;
@@ -474,7 +475,7 @@ class Parma_Polyhedra_Library::Dense_Row
public:
typedef const Coefficient value_type;
- typedef ptrdiff_t difference_type;
+ typedef std::ptrdiff_t difference_type;
typedef value_type* pointer;
typedef Coefficient_traits::const_reference reference;
diff -up ppl-1.1/src/Linear_Expression_Interface_defs.hh.orig ppl-1.1/src/Linear_Expression_Interface_defs.hh
--- ppl-1.1/src/Linear_Expression_Interface_defs.hh.orig 2014-04-29 13:08:17.337683198 -0300
+++ ppl-1.1/src/Linear_Expression_Interface_defs.hh 2014-04-29 13:08:40.999684104 -0300
@@ -32,6 +32,7 @@ site: http://bugseng.com/products/ppl/ .
#include "Sparse_Row_types.hh"
#include <vector>
#include <set>
+#include <cstddef>
#ifdef PPL_DOXYGEN_INCLUDE_IMPLEMENTATION_DETAILS
//! A linear expression.
@@ -65,7 +66,7 @@ public:
public:
typedef std::bidirectional_iterator_tag iterator_category;
typedef const Coefficient value_type;
- typedef ptrdiff_t difference_type;
+ typedef std::ptrdiff_t difference_type;
typedef value_type* pointer;
typedef Coefficient_traits::const_reference reference;
diff -up ppl-1.1/src/CO_Tree_defs.hh.orig ppl-1.1/src/CO_Tree_defs.hh
--- ppl-1.1/src/CO_Tree_defs.hh.orig 2014-04-29 13:11:33.725690719 -0300
+++ ppl-1.1/src/CO_Tree_defs.hh 2014-04-29 13:11:55.943691569 -0300
@@ -28,6 +28,7 @@ site: http://bugseng.com/products/ppl/ .
#include "Coefficient_defs.hh"
#include <memory>
+#include <cstddef>
#ifndef PPL_CO_TREE_EXTRA_DEBUG
#ifdef PPL_ABI_BREAKING_EXTRA_DEBUG
@@ -159,7 +160,7 @@ public:
typedef std::bidirectional_iterator_tag iterator_category;
typedef const data_type value_type;
- typedef ptrdiff_t difference_type;
+ typedef std::ptrdiff_t difference_type;
typedef value_type* pointer;
typedef data_type_const_reference reference;
@@ -314,7 +315,7 @@ public:
typedef std::bidirectional_iterator_tag iterator_category;
typedef data_type value_type;
- typedef ptrdiff_t difference_type;
+ typedef std::ptrdiff_t difference_type;
typedef value_type* pointer;
typedef value_type& reference;
diff -up ppl-1.1/src/CO_Tree_inlines.hh.orig ppl-1.1/src/CO_Tree_inlines.hh
--- ppl-1.1/src/CO_Tree_inlines.hh.orig 2014-04-29 13:14:12.738696808 -0300
+++ ppl-1.1/src/CO_Tree_inlines.hh 2014-04-29 13:14:48.887698192 -0300
@@ -24,6 +24,8 @@ site: http://bugseng.com/products/ppl/ .
#ifndef PPL_CO_Tree_inlines_hh
#define PPL_CO_Tree_inlines_hh 1
+#include <cstddef>
+
namespace Parma_Polyhedra_Library {
inline dimension_type
@@ -31,7 +33,7 @@ CO_Tree::dfs_index(const_iterator itr) c
PPL_ASSERT(itr.current_index != 0);
PPL_ASSERT(itr.current_index >= indexes + 1);
PPL_ASSERT(itr.current_index <= indexes + reserved_size);
- const ptrdiff_t index = itr.current_index - indexes;
+ const std::ptrdiff_t index = itr.current_index - indexes;
return static_cast<dimension_type>(index);
}
@@ -40,7 +42,7 @@ CO_Tree::dfs_index(iterator itr) const {
PPL_ASSERT(itr.current_index != 0);
PPL_ASSERT(itr.current_index >= indexes + 1);
PPL_ASSERT(itr.current_index <= indexes + reserved_size);
- const ptrdiff_t index = itr.current_index - indexes;
+ const std::ptrdiff_t index = itr.current_index - indexes;
return static_cast<dimension_type>(index);
}
@@ -772,7 +774,7 @@ CO_Tree::tree_iterator::follow_left_chil
p -= (offset - 1);
while (*p == unused_index)
++p;
- const ptrdiff_t distance = p - tree.indexes;
+ const std::ptrdiff_t distance = p - tree.indexes;
PPL_ASSERT(distance >= 0);
i = static_cast<dimension_type>(distance);
offset = least_significant_one_mask(i);
@@ -787,7 +789,7 @@ CO_Tree::tree_iterator::follow_right_chi
p += (offset - 1);
while (*p == unused_index)
--p;
- const ptrdiff_t distance = p - tree.indexes;
+ const std::ptrdiff_t distance = p - tree.indexes;
PPL_ASSERT(distance >= 0);
i = static_cast<dimension_type>(distance);
offset = least_significant_one_mask(i);
diff -up ppl-1.1/src/Linear_Expression_defs.hh.orig ppl-1.1/src/Linear_Expression_defs.hh
--- ppl-1.1/src/Linear_Expression_defs.hh.orig 2014-04-29 13:15:39.793700141 -0300
+++ ppl-1.1/src/Linear_Expression_defs.hh 2014-04-29 13:16:07.464701201 -0300
@@ -51,6 +51,7 @@ site: http://bugseng.com/products/ppl/ .
#include "Linear_Expression_Interface_defs.hh"
#include "Variable_defs.hh"
+#include <cstddef>
namespace Parma_Polyhedra_Library {
@@ -381,7 +382,7 @@ public:
public:
typedef std::bidirectional_iterator_tag iterator_category;
typedef const Coefficient value_type;
- typedef ptrdiff_t difference_type;
+ typedef std::ptrdiff_t difference_type;
typedef value_type* pointer;
typedef Coefficient_traits::const_reference reference;
diff -up ppl-1.1/src/CO_Tree.cc.orig ppl-1.1/src/CO_Tree.cc
--- ppl-1.1/src/CO_Tree.cc.orig 2014-04-29 13:19:37.192709232 -0300
+++ ppl-1.1/src/CO_Tree.cc 2014-04-29 13:19:58.000710029 -0300
@@ -954,7 +954,7 @@ PPL::CO_Tree
--subtree_size;
}
- const ptrdiff_t distance = first_unused_index - indexes;
+ const std::ptrdiff_t distance = first_unused_index - indexes;
PPL_ASSERT(distance >= 0);
return static_cast<dimension_type>(distance);
}
diff -up ppl-1.1/src/Constraint_System_defs.hh.orig ppl-1.1/src/Constraint_System_defs.hh
--- ppl-1.1/src/Constraint_System_defs.hh.orig 2014-04-29 13:30:05.530733294 -0300
+++ ppl-1.1/src/Constraint_System_defs.hh 2014-04-29 13:30:27.167734122 -0300
@@ -37,6 +37,7 @@ site: http://bugseng.com/products/ppl/ .
#include "termination_types.hh"
#include <iterator>
#include <iosfwd>
+#include <cstddef>
namespace Parma_Polyhedra_Library {
@@ -609,7 +610,7 @@ for (Constraint_System::const_iterator i
class Parma_Polyhedra_Library::Constraint_System_const_iterator
: public std::iterator<std::forward_iterator_tag,
Constraint,
- ptrdiff_t,
+ std::ptrdiff_t,
const Constraint*,
const Constraint&> {
public:
diff -up ppl-1.1/src/Congruence_System_defs.hh.orig ppl-1.1/src/Congruence_System_defs.hh
--- ppl-1.1/src/Congruence_System_defs.hh.orig 2014-04-29 13:33:56.927742155 -0300
+++ ppl-1.1/src/Congruence_System_defs.hh 2014-04-29 13:34:15.535742867 -0300
@@ -33,6 +33,7 @@ site: http://bugseng.com/products/ppl/ .
#include "Congruence_defs.hh"
#include "Constraint_System_types.hh"
#include <iosfwd>
+#include <cstddef>
namespace Parma_Polyhedra_Library {
@@ -249,7 +250,7 @@ public:
class const_iterator
: public std::iterator<std::forward_iterator_tag,
Congruence,
- ptrdiff_t,
+ std::ptrdiff_t,
const Congruence*,
const Congruence&> {
public:
diff -up ppl-1.1/src/Generator_System_defs.hh.orig ppl-1.1/src/Generator_System_defs.hh
--- ppl-1.1/src/Generator_System_defs.hh.orig 2014-04-29 13:44:30.122766402 -0300
+++ ppl-1.1/src/Generator_System_defs.hh 2014-04-29 13:44:48.167767093 -0300
@@ -33,6 +33,7 @@ site: http://bugseng.com/products/ppl/ .
#include "Poly_Con_Relation_defs.hh"
#include "Polyhedron_types.hh"
#include <iosfwd>
+#include <cstddef>
namespace Parma_Polyhedra_Library {
@@ -679,7 +680,7 @@ copy(gs.begin(), gs.end(), ostream_itera
class Parma_Polyhedra_Library::Generator_System_const_iterator
: public std::iterator<std::forward_iterator_tag,
Generator,
- ptrdiff_t,
+ std::ptrdiff_t,
const Generator*,
const Generator&> {
public:
diff -up ppl-1.1/src/Grid_Generator_System_defs.hh.orig ppl-1.1/src/Grid_Generator_System_defs.hh
--- ppl-1.1/src/Grid_Generator_System_defs.hh.orig 2014-04-29 13:45:26.073768544 -0300
+++ ppl-1.1/src/Grid_Generator_System_defs.hh 2014-04-29 13:45:42.535769175 -0300
@@ -31,6 +31,7 @@ site: http://bugseng.com/products/ppl/ .
#include "Variables_Set_types.hh"
#include "Polyhedron_types.hh"
#include <iosfwd>
+#include <cstddef>
namespace Parma_Polyhedra_Library {
@@ -277,7 +278,7 @@ public:
class const_iterator
: public std::iterator<std::forward_iterator_tag,
Grid_Generator,
- ptrdiff_t,
+ std::ptrdiff_t,
const Grid_Generator*,
const Grid_Generator&> {
public:

View File

@ -1,38 +0,0 @@
diff -up ppl-1.1/src/Pointset_Powerset_defs.hh.orig ppl-1.1/src/Pointset_Powerset_defs.hh
--- ppl-1.1/src/Pointset_Powerset_defs.hh.orig 2013-10-28 10:38:33.000000000 -0200
+++ ppl-1.1/src/Pointset_Powerset_defs.hh 2015-02-08 17:33:06.414149334 -0200
@@ -1391,6 +1391,7 @@ template <typename PSET>
bool
check_containment(const PSET& ph, const Pointset_Powerset<PSET>& ps);
+#if __GNUC__ < 5
// CHECKME: according to the Intel compiler, the declaration of the
// following specialization (of the class template parameter) should come
// before the declaration of the corresponding full specialization
@@ -1400,6 +1401,7 @@ template <typename QH>
Pointset_Powerset<NNC_Polyhedron>
::Pointset_Powerset(const Pointset_Powerset<QH>& y,
Complexity_Class);
+#endif
// Non-inline full specializations should be declared here
// so as to inhibit multiple instantiations of the generic template.
diff -up ppl-1.1/src/ppl.hh.dist.orig ppl-1.1/src/ppl.hh.dist
--- ppl-1.1/src/ppl.hh.dist.orig 2015-02-08 17:32:26.594146810 -0200
+++ ppl-1.1/src/ppl.hh.dist 2015-02-08 17:33:11.833149677 -0200
@@ -100618,6 +100618,7 @@ template <typename PSET>
bool
check_containment(const PSET& ph, const Pointset_Powerset<PSET>& ps);
+#if __GNUC__ < 5
// CHECKME: according to the Intel compiler, the declaration of the
// following specialization (of the class template parameter) should come
// before the declaration of the corresponding full specialization
@@ -100627,6 +100628,7 @@ template <typename QH>
Pointset_Powerset<NNC_Polyhedron>
::Pointset_Powerset(const Pointset_Powerset<QH>& y,
Complexity_Class);
+#endif
// Non-inline full specializations should be declared here
// so as to inhibit multiple instantiations of the generic template.

View File

@ -1,42 +0,0 @@
diff -up ppl-1.1/demos/ppl_lcdd/ppl_lcdd.cc.orig ppl-1.1/demos/ppl_lcdd/ppl_lcdd.cc
--- ppl-1.1/demos/ppl_lcdd/ppl_lcdd.cc.orig 2016-03-17 17:48:24.795619726 -0300
+++ ppl-1.1/demos/ppl_lcdd/ppl_lcdd.cc 2016-03-17 17:49:59.364623348 -0300
@@ -224,7 +224,7 @@ std::istream* input_stream_p = 0;
void
set_input(const char* file_name) {
- if (input_stream_p && *input_stream_p != std::cin)
+ if (input_stream_p && (void*)input_stream_p != (void*)&std::cin)
delete input_stream_p;
if (file_name) {
@@ -250,7 +250,7 @@ std::ostream* output_stream_p = 0;
void
set_output(const char* file_name) {
- if (output_stream_p && *output_stream_p != std::cout)
+ if (output_stream_p && (void*)output_stream_p != (void*)&std::cout)
delete output_stream_p;
if (file_name) {
diff -up ppl-1.1/demos/ppl_pips/ppl_pips.cc.orig ppl-1.1/demos/ppl_pips/ppl_pips.cc
--- ppl-1.1/demos/ppl_pips/ppl_pips.cc.orig 2016-03-18 12:01:23.174424242 -0300
+++ ppl-1.1/demos/ppl_pips/ppl_pips.cc 2016-03-18 12:02:23.743426561 -0300
@@ -538,7 +538,7 @@ std::istream* input_stream_p = 0;
void
set_input(const char* file_name) {
- if (input_stream_p && *input_stream_p != std::cin)
+ if (input_stream_p && (void*)input_stream_p != (void*)&std::cin)
delete input_stream_p;
if (file_name) {
@@ -558,7 +558,7 @@ std::ostream* output_stream_p = 0;
void
set_output(const char* file_name) {
- if (output_stream_p && *output_stream_p != std::cout)
+ if (output_stream_p && (void*)output_stream_p != (void*)&std::cout)
delete output_stream_p;
if (file_name) {

View File

@ -1,13 +0,0 @@
diff -up ppl-1.1/interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4.orig ppl-1.1/interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4
--- ppl-1.1/interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4.orig 2015-06-14 20:20:41.157476020 -0300
+++ ppl-1.1/interfaces/Prolog/SWI/ppl_interface_generator_swiprolog_cc.m4 2015-06-14 20:20:58.923476700 -0300
@@ -33,7 +33,8 @@ m4_include(`ppl_interface_generator_copy
#include "../ppl_prolog_domains.hh"
-#define PL_EXTENSION_ENTRY(name, arity) { #name, arity, (void*) name, 0 },
+#define PL_EXTENSION_ENTRY(name, arity) \
+ { #name, arity, reinterpret_cast<pl_function_t>(name), 0 },
namespace {

View File

@ -1,28 +1,23 @@
Name: ppl
Version: 1.1
Release: 15%{?dist}
Version: 1.2
Release: 1%{?dist}
Summary: The Parma Polyhedra Library: a library of numerical abstractions
Group: Development/Libraries
License: GPLv3+
URL: http://www.cs.unipr.it/ppl/
Source0: ftp://ftp.cs.unipr.it/pub/ppl/releases/%{version}/%{name}-%{version}.tar.bz2
Source1: ppl.hh
Source2: ppl_c.h
Requires(post): /sbin/ldconfig
Requires(postun): /sbin/ldconfig
# Merged into ppl as of 0.12
Provides: ppl-pwl = %{version}-%{release}
Obsoletes: ppl-pwl <= 0.11.2-11
BuildRequires: gmp-devel >= 4.1.3, m4 >= 1.4.8
BuildRequires: gcc-c++
BuildRequires: gmp-devel
BuildRequires: m4
BuildRequires: perl
BuildRequires: perl(Getopt::Long)
BuildRequires: perl(strict)
BuildRequires: perl(warnings)
Patch0: %{name}-cstddef.patch
Patch1: %{name}-PlLong.patch
Patch2: %{name}-gcc5.patch
Patch3: %{name}-swiprolog.patch
Patch4: %{name}-gcc6.patch
# This can be removed once F-25 reaches EOL
Obsoletes: %{name}-yap < 1.2-1%{?dist}
Provides: %{name}-yap = %{version}-%{release}
%description
The Parma Polyhedra Library (PPL) is a library for the manipulation of
@ -39,10 +34,7 @@ applications using the PPL through its C and C++ interfaces.
%package devel
Summary: Development tools for the Parma Polyhedra Library C and C++ interfaces
Requires: %{name}%{?_isa} = %{version}-%{release}, gmp-devel%{?_isa} >= 4.1.3
# Merged into ppl as of 0.12
Provides: ppl-pwl-devel = %{version}-%{release}
Obsoletes: ppl-pwl-devel <= 0.11.2-11
Requires: %{name}%{?_isa} = %{version}-%{release}, gmp-devel%{?_isa}
%description devel
The header files, Autoconf macro and minimal documentation for
@ -52,9 +44,6 @@ its C and C++ interfaces.
%package static
Summary: Static archives for the Parma Polyhedra Library C and C++ interfaces
Requires: %{name}-devel%{?_isa} = %{version}-%{release}
# Merged into ppl as of 0.12
Provides: ppl-pwl-static = %{version}-%{release}
Obsoletes: ppl-pwl-static <= 0.11.2-11
%description static
The static archives for the Parma Polyhedra Library C and C++ interfaces.
@ -75,8 +64,8 @@ and the parametric integer programming solver ppl_pips.
# The `gprolog' package is not available on ppc64:
# the GNU Prolog interface must thus be disabled for that architecture.
Summary: The GNU Prolog interface of the Parma Polyhedra Library
BuildRequires: gprolog >= 1.2.19
Requires: %{name}%{?_isa} = %{version}-%{release}, gprolog%{?_isa} >= 1.2.19
BuildRequires: gprolog >= 1.3.2
Requires: %{name}%{?_isa} = %{version}-%{release}, gprolog%{?_isa} >= 1.3.2
%description gprolog
This package adds GNU Prolog support to the Parma Polyhedra Library (PPL).
@ -112,18 +101,6 @@ Requires: %{name}-swiprolog%{?_isa} = %{version}-%{release}
This package contains the static archive for the SWI-Prolog interface
of the Parma Polyhedra Library.
%ifnarch sparc64 sparcv9 %{arm} ppc %{power64}
%package yap
Summary: The YAP Prolog interface of the Parma Polyhedra Library
BuildRequires: yap-devel >= 5.1.1
Requires: %{name}%{?_isa} = %{version}-%{release}, yap%{?_isa} >= 5.1.1
Obsoletes: ppl-yap-static
%description yap
This package adds YAP Prolog support to the Parma Polyhedra Library (PPL).
Install this package if you want to use the library in YAP Prolog programs.
%endif
%package java
Summary: The Java interface of the Parma Polyhedra Library
BuildRequires: java-devel >= 1:1.6.0
@ -153,11 +130,6 @@ Install this package if you want to program with the PPL.
%prep
%setup -q
%patch0 -p1
%patch1 -p1
%patch2 -p1
%patch3 -p1
%patch4 -p1
%build
CPPFLAGS="-I%{_includedir}/glpk"
@ -165,11 +137,8 @@ CPPFLAGS="-I%{_includedir}/glpk"
%ifarch x86_64 %{ix86} ppc alpha
CPPFLAGS="$CPPFLAGS -I%{_libdir}/gprolog-`gprolog --version 2>&1 | head -1 | sed -e "s/.* \([^ ]*\)$/\1/g"`/include"
%endif
%ifnarch sparc64 sparcv9 %{arm} ppc %{power64}
CPPFLAGS="$CPPFLAGS -I`swipl -dump-runtime-variables | grep PLBASE= | sed 's/PLBASE="\(.*\)";/\1/'`/include"
CPPFLAGS="$CPPFLAGS -I%{_includedir}/Yap"
%endif
%configure --docdir=%{_datadir}/doc/%{name} --enable-shared --disable-rpath --enable-interfaces="c++ c gnu_prolog swi_prolog yap_prolog java" CPPFLAGS="$CPPFLAGS"
%configure --docdir=%{_datadir}/doc/%{name} --enable-shared --disable-rpath --enable-interfaces="cxx c gnu_prolog swi_prolog java" CPPFLAGS="$CPPFLAGS"
sed -i 's|^hardcode_libdir_flag_spec=.*|hardcode_libdir_flag_spec=""|g' libtool
sed -i 's|^runpath_var=LD_RUN_PATH|runpath_var=DIE_RPATH_DIE|g' libtool
make %{?_smp_mflags}
@ -272,13 +241,6 @@ mv \
%files swiprolog-static
%{_libdir}/%{name}/libppl_swiprolog.a
%ifnarch sparc64 sparcv9 %{arm} ppc %{power64}
%files yap
%doc interfaces/Prolog/YAP/README.yap
%{_datadir}/%{name}/ppl_yap.pl
%{_libdir}/%{name}/ppl_yap.so
%endif
%files java
%doc interfaces/Java/README.java
%{_libdir}/%{name}/libppl_java.so
@ -309,6 +271,12 @@ mv \
%postun -p /sbin/ldconfig
%changelog
* Fri Mar 3 2017 Jerry James <loganjerry@gmail.com> - 1.2-1
- Update to latest upstream release (bz 1403093)
- Drop all patches; all have been upstreamed
- Drop ancient obsoletes
- Drop the yap interface since yap has been retired
* Sat Feb 11 2017 Fedora Release Engineering <releng@fedoraproject.org> - 1.1-15
- Rebuilt for https://fedoraproject.org/wiki/Fedora_26_Mass_Rebuild

View File

@ -1 +1 @@
98be3e1a272bd5337fbadabb0d3f3d20 ppl-1.1.tar.bz2
SHA512 (ppl-1.2.tar.bz2) = 9850f4b3ec542f69504e199d5492e156c9eb4521b41ecdd31ea2b3adbc77b90fc1727094377a84632ed9bd9d4ac55eca2728e5e866ac13ab899cc60bedd9db6d