From crazy at frugalware.org Fri Jun 1 01:40:31 2007 From: crazy at frugalware.org (crazy) Date: Fri Jun 1 01:40:33 2007 Subject: [Frugalware-darcs] frugalware-current: openssh-4.6p1-3-i686 Message-ID: <20070531234031.C93DD13A4022@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070531233706-f6986-c5c25d7e52724ed6f2b61fc9931c9212b29c9f06.gz; [openssh-4.6p1-3-i686 crazy **20070531233706 * realbump * fixed broken xauth reported by mwc on IRC * NOTE: do not remove --with-xauth= the default is for old X6 ] { hunk ./source/network/openssh/FrugalBuild 7 -pkgrel=2 +pkgrel=3 hunk ./source/network/openssh/FrugalBuild 30 - --with-mantype=man + --with-mantype=man \ + --with-xauth=/usr/bin/xauth } From vmiklos at frugalware.org Fri Jun 1 02:30:48 2007 From: vmiklos at frugalware.org (VMiklos) Date: Fri Jun 1 02:30:51 2007 Subject: [Frugalware-darcs] frugalware-current: audacity-1.3.3-1-i686 Message-ID: <20070601003048.79DD313A4022@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070601002840-e2957-c2e83b496c6e030590035341d4ac569fb4cf5895.gz; [audacity-1.3.3-1-i686 VMiklos **20070601002840 version bump FIXME: flac is problematic atm ] { move ./source/xapps-extra/audacity/audacity-1.3.2-flac-1.1.3.patch ./source/xapps-extra/audacity/audacity-1.3.3-flac-1.1.3.patch hunk ./source/xapps-extra/audacity/FrugalBuild 5 -pkgver=1.3.2 -pkgrel=3 +pkgver=1.3.3 +pkgrel=1 hunk ./source/xapps-extra/audacity/FrugalBuild 11 - 'libsamplerate' 'libsamplerate' 'flac>=1.1.3' 'soundtouch') + 'libsamplerate' 'flac>=1.1.3' 'soundtouch' 'alsa-lib') hunk ./source/xapps-extra/audacity/FrugalBuild 13 +# FIXME: flac somehow gets disabled hunk ./source/xapps-extra/audacity/FrugalBuild 18 -source=(${source/$pkgname-/$pkgname-src-} audacity-1.3.2-flac-1.1.3.patch \ - soundtouch.patch fix-desktop-file-and-warnings.patch locale-DESTDIR.patch) +source=(${source/$pkgname-/$pkgname-src-} audacity-1.3.3-flac-1.1.3.patch \ + fix-desktop-file-and-warnings.patch locale-DESTDIR.patch) hunk ./source/xapps-extra/audacity/FrugalBuild 32 - --with-lib-preference=system,local \ - --with-portaudio=v19 + --with-portaudio=v19 \ + --with-libsamplerate=system \ + --without-libresample \ + --with-libmad=system \ + --with-id3tag=system \ + --with-flac=system \ + --with-vorbis=system \ + --with-libexpat=system \ + --with-libsndfile=system hunk ./source/xapps-extra/audacity/FrugalBuild 45 -sha1sums=('87690806763b7de26a8e2df1f0d4c3a7e6d1a404'\ - '1e38825cb8ba0a5ffa74cd4086ca3a04aaa1264c'\ - '219cec3343c3be0ab5cd12c3013241327ba9c309'\ - 'a72d8e3b2c30bcc2d72da97e963253bdcbe9a3d7'\ +sha1sums=('1b52f0de736cb5903df3e4776530839bee26f567' \ + 'f845c8337e8287da8df608df42cdbfaf4862980c' \ + 'f28d053b5ce943d55b746c041bf2f7696eaea739' \ hunk ./source/xapps-extra/audacity/audacity-1.3.3-flac-1.1.3.patch 1 -? src/export/2 -? src/export/makefile -? src/import/2 -? src/import/makefile -Index: acinclude.m4 -=================================================================== -RCS file: /cvsroot/audacity/audacity-src/acinclude.m4,v -retrieving revision 1.17 -diff -u -r1.17 acinclude.m4 ---- acinclude.m4 20 Oct 2006 10:31:59 -0000 1.17 -+++ acinclude.m4 20 Oct 2006 22:46:26 -0000 -@@ -463,7 +463,7 @@ +diff -Naur audacity-src-1.3.3-beta.orig/acinclude.m4 audacity-src-1.3.3-beta/acinclude.m4 +--- audacity-src-1.3.3-beta.orig/acinclude.m4 2007-05-18 13:56:02.000000000 +0900 ++++ audacity-src-1.3.3-beta/acinclude.m4 2007-05-19 13:37:01.000000000 +0900 +@@ -479,7 +479,7 @@ hunk ./source/xapps-extra/audacity/audacity-1.3.3-flac-1.1.3.patch 13 -Index: src/export/ExportFLAC.cpp -=================================================================== -RCS file: /cvsroot/audacity/audacity-src/src/export/ExportFLAC.cpp,v -retrieving revision 1.9 -diff -u -r1.9 ExportFLAC.cpp ---- src/export/ExportFLAC.cpp 23 Sep 2006 02:26:41 -0000 1.9 -+++ src/export/ExportFLAC.cpp 20 Oct 2006 22:46:32 -0000 -@@ -41,6 +41,13 @@ +diff -Naur audacity-src-1.3.3-beta.orig/src/export/ExportFLAC.cpp audacity-src-1.3.3-beta/src/export/ExportFLAC.cpp +--- audacity-src-1.3.3-beta.orig/src/export/ExportFLAC.cpp 2007-05-18 13:55:50.000000000 +0900 ++++ audacity-src-1.3.3-beta/src/export/ExportFLAC.cpp 2007-05-19 13:41:16.000000000 +0900 +@@ -145,6 +145,13 @@ hunk ./source/xapps-extra/audacity/audacity-1.3.3-flac-1.1.3.patch 27 - bool ExportFLAC(AudacityProject *project, - int numChannels, wxString fName, - bool selectionOnly, double t0, double t1, MixerSpec *mixerSpec) -@@ -58,7 +65,9 @@ + static struct + { + bool do_exhaustive_model_search; +@@ -229,7 +236,9 @@ hunk ./source/xapps-extra/audacity/audacity-1.3.3-flac-1.1.3.patch 32 - + hunk ./source/xapps-extra/audacity/audacity-1.3.3-flac-1.1.3.patch 40 -@@ -72,7 +81,11 @@ - format=int16Sample; - encoder->set_bits_per_sample(16); - } -- encoder->init(); +@@ -264,7 +273,11 @@ + encoder->set_rice_parameter_search_dist(flacLevels[levelPref].rice_parameter_search_dist); + encoder->set_max_lpc_order(flacLevels[levelPref].max_lpc_order); + hunk ./source/xapps-extra/audacity/audacity-1.3.3-flac-1.1.3.patch 45 -+ encoder->init(); // really should check the return value here... + encoder->init(); hunk ./source/xapps-extra/audacity/audacity-1.3.3-flac-1.1.3.patch 47 -+ encoder->init(OSFILENAME(fName)); // really should check the return value here... ++ encoder->init(OSFILENAME(fName)); hunk ./source/xapps-extra/audacity/audacity-1.3.3-flac-1.1.3.patch 49 - + hunk ./source/xapps-extra/audacity/audacity-1.3.3-flac-1.1.3.patch 52 -@@ -129,7 +142,7 @@ - return !cancelling; +@@ -343,7 +356,7 @@ + return new ExportFLAC(); hunk ./source/xapps-extra/audacity/audacity-1.3.3-flac-1.1.3.patch 59 - hunk ./source/xapps-extra/audacity/audacity-1.3.3-flac-1.1.3.patch 60 -Index: src/import/ImportFLAC.cpp -=================================================================== -RCS file: /cvsroot/audacity/audacity-src/src/import/ImportFLAC.cpp,v -retrieving revision 1.16 -diff -u -r1.16 ImportFLAC.cpp ---- src/import/ImportFLAC.cpp 23 Sep 2006 02:26:55 -0000 1.16 -+++ src/import/ImportFLAC.cpp 20 Oct 2006 22:46:32 -0000 + // version control system. Please do not modify past this point. +diff -Naur audacity-src-1.3.3-beta.orig/src/import/ImportFLAC.cpp audacity-src-1.3.3-beta/src/import/ImportFLAC.cpp +--- audacity-src-1.3.3-beta.orig/src/import/ImportFLAC.cpp 2007-05-18 13:55:53.000000000 +0900 ++++ audacity-src-1.3.3-beta/src/import/ImportFLAC.cpp 2007-05-19 13:37:01.000000000 +0900 hunk ./source/xapps-extra/audacity/audacity-1.3.3-flac-1.1.3.patch 78 -@@ -264,6 +271,7 @@ +@@ -273,6 +280,7 @@ hunk ./source/xapps-extra/audacity/audacity-1.3.3-flac-1.1.3.patch 86 -@@ -272,11 +280,23 @@ +@@ -281,11 +289,23 @@ hunk ./source/xapps-extra/audacity/audacity-1.3.3-flac-1.1.3.patch 110 -@@ -340,7 +360,11 @@ +@@ -349,7 +369,11 @@ hunk ./source/xapps-extra/audacity/fix-desktop-file-and-warnings.patch 27 -diff -Naur audacity-src-1.3.2-beta/src/Audacity.h audacity-src-1.3.2-beta-p/src/Audacity.h ---- audacity-src-1.3.2-beta/src/Audacity.h 2006-10-29 01:05:28.000000000 +0200 -+++ audacity-src-1.3.2-beta-p/src/Audacity.h 2007-02-19 22:04:08.000000000 +0100 -@@ -29,12 +29,12 @@ - - // Version string for visual display - #define AUDACITY_VERSION_STRING "1.3.2-beta" --// Need to figure out how to concatenate for unicode builds --//#define AUDACITY_VERSION_STRING AUDACITY_QUOTE( AUDACITY_VERSION ) "." \ --// AUDACITY_QUOTE( AUDACITY_RELEASE ) "." \ --// AUDACITY_QUOTE( AUDACITY_REVISION ) \ --// AUDACITY_SUFFIX -- -+/* Need to figure out how to concatenate for unicode builds -+ *#define AUDACITY_VERSION_STRING AUDACITY_QUOTE( AUDACITY_VERSION ) "." \ -+ * AUDACITY_QUOTE( AUDACITY_RELEASE ) "." \ -+ * AUDACITY_QUOTE( AUDACITY_REVISION ) \ -+ * AUDACITY_SUFFIX -+ */ - // Version string for file info (under Windows) - #define AUDACITY_FILE_VERSION AUDACITY_QUOTE( AUDACITY_VERSION ) "," \ - AUDACITY_QUOTE( AUDACITY_RELEASE ) "," \ hunk ./source/xapps-extra/audacity/soundtouch.patch 1 -diff -Naur audacity-src-1.3.2-beta/acinclude.m4 audacity-src-1.3.2-beta-st/acinclude.m4 ---- audacity-src-1.3.2-beta/acinclude.m4 2006-10-29 01:06:04.000000000 +0200 -+++ audacity-src-1.3.2-beta-st/acinclude.m4 2007-02-02 19:43:34.000000000 +0100 -@@ -88,12 +88,23 @@ - - dnl see if soundtouch is installed on the system - -- dnl ... TODO: I don't know if stock, unmodified soundtouch is -- dnl suitable for audacity, so I don't allow it -+ PKG_CHECK_MODULES(SOUNDTOUCH, soundtouch-1.0 >= 1.3.1, -+ soundtouch_available_system="yes", -+ soundtouch_available_system="no") - -- LIBSOUNDTOUCH_SYSTEM_AVAILABLE="no" - -- dnl see if libresample is available locally -+ if test "x$soundtouch_available_system" = "xyes" ; then -+ LIBSOUNDTOUCH_SYSTEM_AVAILABLE="yes" -+ LIBSOUNDTOUCH_SYSTEM_LIBS=$SOUNDTOUCH_LIBS -+ LIBSOUNDTOUCH_SYSTEM_CXXFLAGS=$SOUNDTOUCH_CFLAGS -+ LIBSOUNDTOUCH_SYSTEM_CPPSYMBOLS="USE_SOUNDTOUCH" -+ AC_MSG_NOTICE([Libsoundtouch libraries are available as system libraries]) -+ else -+ LIBSOUNDTOUCH_SYSTEM_AVAILABLE="no" -+ AC_MSG_NOTICE([Libsoundtouch libraries are NOT available as system libraries]) -+ fi -+ -+ dnl see if libsoundtouch is available locally - - AC_CHECK_FILE(${srcdir}/lib-src/soundtouch/include/SoundTouch.h, - soundtouch_h_found="yes", -@@ -180,6 +191,7 @@ - LIBSAMPLERATE_SYSTEM_AVAILABLE="yes" - LIBSAMPLERATE_SYSTEM_LIBS=$SAMPLERATE_LIBS - LIBSAMPLERATE_SYSTEM_CXXFLAGS=$SAMPLERATE_CFLAGS -+ LIBSAMPLERATE_SYSTEM_CPPSYMBOLS="USE_LIBSAMPLERATE" - AC_MSG_NOTICE([Libsamplerate libraries are available as system libraries]) - else - LIBSAMPLERATE_SYSTEM_AVAILABLE="no" rmfile ./source/xapps-extra/audacity/soundtouch.patch } From krics at linuxforum.hu Fri Jun 1 14:07:51 2007 From: krics at linuxforum.hu (Christian Hamar alias krix) Date: Fri Jun 1 14:07:54 2007 Subject: [Frugalware-darcs] frugalware-current: fribidi-0.10.8-1-x86_64 Message-ID: <20070601120751.8F14213A4022@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070601120650-d209c-7c699d04b0be189804dee874021037831ae2d859.gz; [fribidi-0.10.8-1-x86_64 Christian Hamar alias krix **20070601120650 * Version bump * Fixed SBU ] { hunk ./source/lib/fribidi/FrugalBuild 1 -# Compiling Time: 0.01 SBU +# Compiling Time: 0.13 SBU hunk ./source/lib/fribidi/FrugalBuild 5 -pkgver=0.10.7 +pkgver=0.10.8 hunk ./source/lib/fribidi/FrugalBuild 15 -sha1sums=('b49568f87d72a1f513e533a99bf0143dc9fc3e64') +sha1sums=('7752d7033e5c8c3498760024f65351d0fc9ae603') hunk ./source/lib/fribidi/FrugalBuild 19 -# vim: ft=sh - } From krics at linuxforum.hu Fri Jun 1 14:17:55 2007 From: krics at linuxforum.hu (Christian Hamar alias krix) Date: Fri Jun 1 14:17:59 2007 Subject: [Frugalware-darcs] frugalware-current: hdparm-7.4-1-x86_64 Message-ID: <20070601121755.DDEA613A4022@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070601121708-d209c-186a2352c93fc3f4c38dd8c77f7f29a7b5cca78e.gz; [hdparm-7.4-1-x86_64 Christian Hamar alias krix **20070601121708 * Version bump ] { hunk ./source/apps/hdparm/FrugalBuild 5 -pkgver=7.3 +pkgver=7.4 hunk ./source/apps/hdparm/FrugalBuild 12 -sha1sums=('3fcd9dd179a9f3ccf1d33a99c6087342e4bb7ff3') +sha1sums=('327479bf1cfad94538f0a249dff066d3c82ef2d5') } From crazy at frugalware.org Fri Jun 1 15:00:50 2007 From: crazy at frugalware.org (crazy) Date: Fri Jun 1 15:00:54 2007 Subject: [Frugalware-darcs] frugalware-current: php-5.2.3-1-i686 Message-ID: <20070601130050.B1ACD13A40F6@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070601125918-f6986-dc804d5cc1cee6b7f8781bc9e29afbb9d63e7225.gz; [php-5.2.3-1-i686 crazy **20070601125918 * Version bump ] { hunk ./source/devel/php/FrugalBuild 6 -pkgver=5.2.2 -pkgrel=4 +pkgver=5.2.3 +pkgrel=1 hunk ./source/devel/php/FrugalBuild 19 - php.ini php.conf README.Frugalware gd_png.c.diff) + php.ini php.conf README.Frugalware) hunk ./source/devel/php/FrugalBuild 129 -sha1sums=('9addca2ae7b6bf2bea78023484212d9f32fd08d7'\ +sha1sums=('c2dfab484ce16ebac8f29544641b4690f4b8f034'\ hunk ./source/devel/php/FrugalBuild 132 - '40ae88f0721e02a2c75de76be342c51c85bf734d'\ - 'b1d4dc8c8819b319e71feef49207d6491efdebcc') + '40ae88f0721e02a2c75de76be342c51c85bf734d') hunk ./source/devel/php/gd_png.c.diff 1 ---- php-5.2.2/ext/gd/libgd/gd_png.c.orig 2007-05-24 17:30:52.000000000 +0200 -+++ php-5.2.2/ext/gd/libgd/gd_png.c 2007-05-24 17:33:32.000000000 +0200 -@@ -71,7 +71,11 @@ - - static void gdPngReadData (png_structp png_ptr, png_bytep data, png_size_t length) - { -- gdGetBuf(data, length, (gdIOCtx *) png_get_io_ptr(png_ptr)); -+ int check; -+ check = gdGetBuf (data, length, (gdIOCtx *) png_get_io_ptr (png_ptr)); -+ if (check != length) { -+ png_error(png_ptr, "Read Error: truncated data"); -+ } - } - - static void gdPngWriteData (png_structp png_ptr, png_bytep data, png_size_t length) rmfile ./source/devel/php/gd_png.c.diff } From crazy at frugalware.org Fri Jun 1 15:15:43 2007 From: crazy at frugalware.org (crazy) Date: Fri Jun 1 15:15:48 2007 Subject: [Frugalware-darcs] frugalware-current: eaccelerator-0.9.5.1-2-i686 Message-ID: <20070601131543.BAD0113A4022@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070601131329-f6986-402e2b40026187ad566cf8b898cae2465ce9e13f.gz; [eaccelerator-0.9.5.1-2-i686 crazy **20070601131329 * rebuild with php ] { hunk ./source/devel-extra/eaccelerator/FrugalBuild 6 -pkgrel=1 +pkgrel=2 hunk ./source/devel-extra/eaccelerator/FrugalBuild 17 -depends=('php>=5.2.2-2') +depends=('php>=5.2.3') } From crazy at frugalware.org Fri Jun 1 16:16:31 2007 From: crazy at frugalware.org (crazy) Date: Fri Jun 1 16:16:34 2007 Subject: [Frugalware-darcs] frugalware-current: ivtv-0.10.3-1-i686 Message-ID: <20070601141631.F20B613A4022@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070601141516-f6986-ba6f072076bae55e8ac71cc9c5b8f0dc80918d64.gz; [ivtv-0.10.3-1-i686 crazy **20070601141516 * Version bump ] { hunk ./source/multimedia-extra/ivtv/FrugalBuild 7 -pkgver=0.10.2 +pkgver=0.10.3 hunk ./source/multimedia-extra/ivtv/FrugalBuild 60 -sha1sums=('65e564ced88bba2425bc4a1df00dde7e5c4ed306'\ +sha1sums=('49d016b779539bb17c08882e230edcfd17d1cba1'\ } From alex at alex-smith.me.uk Fri Jun 1 16:37:55 2007 From: alex at alex-smith.me.uk (AlexExtreme) Date: Fri Jun 1 16:37:58 2007 Subject: [Frugalware-darcs] frugalware-current: firefox-2.0.0.4-1-i686 Message-ID: <20070601143755.CFB72176811E@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070601143515-46e39-67a67b15b6da5abf533e7d88bd88ad08ae4207f2.gz; [firefox-2.0.0.4-1-i686 AlexExtreme **20070601143515 * Version bump * Removed visibility patch, it can be done with a Fsed (and the patch no longer applies ;)) ] { hunk ./source/xapps/firefox/08-firefox-1.1-visibility.patch0 1 -Index: configure -=================================================================== -RCS file: /cvsroot/mozilla/configure,v -retrieving revision 1.1443 -diff -u -p -6 -r1.1443 configure ---- configure 2 Jun 2005 04:00:20 -0000 1.1443 -+++ configure 6 Jun 2005 07:34:06 -0000 -@@ -7303,13 +7303,13 @@ else - int foo_default = 1; - EOF - ac_cv_visibility_pragma=no - if ${CC-cc} -Werror -S conftest.c -o conftest.s >/dev/null 2>&1; then - if grep '\.hidden.*foo_hidden' conftest.s >/dev/null; then - if ! grep '\.hidden.*foo_default' conftest.s > /dev/null; then -- ac_cv_visibility_pragma=yes -+ ac_cv_visibility_pragma=no - fi - fi - fi - rm -f conftest.cs - - fi rmfile ./source/xapps/firefox/08-firefox-1.1-visibility.patch0 hunk ./source/xapps/firefox/FrugalBuild 7 -pkgver=2.0.0.3 -pkgrel=2 +pkgver=2.0.0.4 +pkgrel=1 hunk ./source/xapps/firefox/FrugalBuild 28 - # Visibility is broken in 1.5... Maybe at later version this patch does not needed. (x86_64 specific) - 08-firefox-1.1-visibility.patch0 \ hunk ./source/xapps/firefox/FrugalBuild 31 -signatures=("${source[0]}.asc" '' '' '' '' '' '' '' '' '') +signatures=("${source[0]}.asc" '' '' '' '' '' '' '' '') hunk ./source/xapps/firefox/FrugalBuild 41 - + + Fsed "ac_cv_visibility_pragma=yes" "ac_cv_visibility_pragma=no" configure } From vmiklos at frugalware.org Fri Jun 1 21:54:28 2007 From: vmiklos at frugalware.org (VMiklos) Date: Fri Jun 1 21:54:31 2007 Subject: [Frugalware-darcs] frugalware-current: kernel-2.6.21-2-i686 Message-ID: <20070601195429.02FDF16A8009@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070601195242-e2957-1e3d65544b7dc9ab38a1cdb35c0aa9b953687919.gz; [kernel-2.6.21-2-i686 VMiklos **20070601195242 bump to 2.6.21.3 ] { hunk ./source/include/kernel-version.sh 19 -_F_kernelver_rel=1 -#_F_kernelver_stable=1 +_F_kernelver_rel=2 +_F_kernelver_stable=3 } From crazy at frugalware.org Fri Jun 1 22:23:24 2007 From: crazy at frugalware.org (crazy) Date: Fri Jun 1 22:23:27 2007 Subject: [Frugalware-darcs] frugalware-current: libdrm-2.3.0-2-i686 Message-ID: <20070601202325.124D613A4022@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070601202124-f6986-c043acd8619988222caf4ff1ab29ec0dc2575d2a.gz; [libdrm-2.3.0-2-i686 crazy **20070601202124 * added nouveau header files , I need it for mesa update ] { hunk ./source/x11/libdrm/FrugalBuild 6 -pkgrel=1 +pkgrel=2 hunk ./source/x11/libdrm/FrugalBuild 13 -source=(http://dri.freedesktop.org/libdrm/libdrm-$pkgver.tar.gz) -sha1sums=('fd62459b11c39a58e5b45b8af30a8217d5ce0e1b') +source=(http://dri.freedesktop.org/libdrm/libdrm-$pkgver.tar.gz nouveau.patch) +sha1sums=('fd62459b11c39a58e5b45b8af30a8217d5ce0e1b'\ + '94fde24b9a63b86ee803b6093632848edde2823b') hunk ./source/x11/libdrm/FrugalBuild 17 +build() +{ + Fcd + Fpatchall + Fautoreconf + Fmake + Fmakeinstall +} addfile ./source/x11/libdrm/nouveau.patch hunk ./source/x11/libdrm/nouveau.patch 1 +--- /dev/null 2007-03-29 16:01:53.376400525 -0400 ++++ libdrm-2.3.0/shared-core/nouveau_drm.h 2007-03-29 19:02:49.000000000 -0400 +@@ -0,0 +1,152 @@ ++/* ++ * Copyright 2005 Stephane Marchesin. ++ * All Rights Reserved. ++ * ++ * Permission is hereby granted, free of charge, to any person obtaining a ++ * copy of this software and associated documentation files (the "Software"), ++ * to deal in the Software without restriction, including without limitation ++ * the rights to use, copy, modify, merge, publish, distribute, sublicense, ++ * and/or sell copies of the Software, and to permit persons to whom the ++ * Software is furnished to do so, subject to the following conditions: ++ * ++ * The above copyright notice and this permission notice (including the next ++ * paragraph) shall be included in all copies or substantial portions of the ++ * Software. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR ++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL ++ * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR ++ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ++ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR ++ * OTHER DEALINGS IN THE SOFTWARE. ++ */ ++ ++#ifndef __NOUVEAU_DRM_H__ ++#define __NOUVEAU_DRM_H__ ++ ++#define NOUVEAU_DRM_HEADER_PATCHLEVEL 6 ++ ++typedef struct drm_nouveau_fifo_alloc { ++ int channel; ++ uint32_t put_base; ++ /* FIFO control regs */ ++ drm_handle_t ctrl; ++ int ctrl_size; ++ /* DMA command buffer */ ++ drm_handle_t cmdbuf; ++ int cmdbuf_size; ++} ++drm_nouveau_fifo_alloc_t; ++ ++typedef struct drm_nouveau_object_init { ++ int channel; ++ uint32_t handle; ++ int class; ++} ++drm_nouveau_object_init_t; ++ ++#define NOUVEAU_MEM_ACCESS_RO 1 ++#define NOUVEAU_MEM_ACCESS_WO 2 ++#define NOUVEAU_MEM_ACCESS_RW 3 ++typedef struct drm_nouveau_dma_object_init { ++ int channel; ++ uint32_t handle; ++ int class; ++ int access; ++ int target; ++ uint32_t offset; ++ int size; ++} ++drm_nouveau_dma_object_init_t; ++ ++#define NOUVEAU_MEM_FB 0x00000001 ++#define NOUVEAU_MEM_AGP 0x00000002 ++#define NOUVEAU_MEM_FB_ACCEPTABLE 0x00000004 ++#define NOUVEAU_MEM_AGP_ACCEPTABLE 0x00000008 ++#define NOUVEAU_MEM_PINNED 0x00000010 ++#define NOUVEAU_MEM_USER_BACKED 0x00000020 ++#define NOUVEAU_MEM_MAPPED 0x00000040 ++#define NOUVEAU_MEM_INSTANCE 0x00000080 /* internal */ ++ ++typedef struct drm_nouveau_mem_alloc { ++ int flags; ++ int alignment; ++ uint64_t size; // in bytes ++ uint64_t region_offset; ++} ++drm_nouveau_mem_alloc_t; ++ ++typedef struct drm_nouveau_mem_free { ++ uint64_t region_offset; ++ int flags; ++} ++drm_nouveau_mem_free_t; ++ ++/* FIXME : maybe unify {GET,SET}PARAMs */ ++#define NOUVEAU_GETPARAM_PCI_VENDOR 3 ++#define NOUVEAU_GETPARAM_PCI_DEVICE 4 ++#define NOUVEAU_GETPARAM_BUS_TYPE 5 ++#define NOUVEAU_GETPARAM_FB_PHYSICAL 6 ++#define NOUVEAU_GETPARAM_AGP_PHYSICAL 7 ++#define NOUVEAU_GETPARAM_FB_SIZE 8 ++#define NOUVEAU_GETPARAM_AGP_SIZE 9 ++typedef struct drm_nouveau_getparam { ++ uint64_t param; ++ uint64_t value; ++} ++drm_nouveau_getparam_t; ++ ++#define NOUVEAU_SETPARAM_CMDBUF_LOCATION 1 ++#define NOUVEAU_SETPARAM_CMDBUF_SIZE 2 ++typedef struct drm_nouveau_setparam { ++ uint64_t param; ++ uint64_t value; ++} ++drm_nouveau_setparam_t; ++ ++enum nouveau_card_type { ++ NV_UNKNOWN =0, ++ NV_01 =1, ++ NV_03 =3, ++ NV_04 =4, ++ NV_05 =5, ++ NV_10 =10, ++ NV_11 =10, ++ NV_15 =10, ++ NV_17 =10, ++ NV_20 =20, ++ NV_25 =20, ++ NV_30 =30, ++ NV_34 =30, ++ NV_40 =40, ++ NV_44 =44, ++ NV_50 =50, ++ NV_LAST =0xffff, ++}; ++ ++enum nouveau_bus_type { ++ NV_AGP =0, ++ NV_PCI =1, ++ NV_PCIE =2, ++}; ++ ++#define NOUVEAU_MAX_SAREA_CLIPRECTS 16 ++ ++typedef struct drm_nouveau_sarea { ++ /* the cliprects */ ++ drm_clip_rect_t boxes[NOUVEAU_MAX_SAREA_CLIPRECTS]; ++ unsigned int nbox; ++} ++drm_nouveau_sarea_t; ++ ++#define DRM_NOUVEAU_FIFO_ALLOC 0x00 ++#define DRM_NOUVEAU_OBJECT_INIT 0x01 ++#define DRM_NOUVEAU_DMA_OBJECT_INIT 0x02 ++#define DRM_NOUVEAU_MEM_ALLOC 0x03 ++#define DRM_NOUVEAU_MEM_FREE 0x04 ++#define DRM_NOUVEAU_GETPARAM 0x05 ++#define DRM_NOUVEAU_SETPARAM 0x06 ++ ++#endif /* __NOUVEAU_DRM_H__ */ ++ +--- libdrm-2.3.0/shared-core/Makefile.am.nouveau 2006-11-07 23:03:26.000000000 -0500 ++++ libdrm-2.3.0/shared-core/Makefile.am 2007-03-29 19:00:35.000000000 -0400 +@@ -27,6 +27,7 @@ + drm.h \ + drm_sarea.h \ + i915_drm.h \ ++ nouveau_drm.h \ + mach64_drm.h \ + mga_drm.h \ + r128_drm.h \ } From alex at alex-smith.me.uk Fri Jun 1 22:47:42 2007 From: alex at alex-smith.me.uk (AlexExtreme) Date: Fri Jun 1 22:47:45 2007 Subject: [Frugalware-darcs] homepage-ng: pastelib: some b*stard spammers got past my spam filter Message-ID: <20070601204742.9462213A4022@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=homepage-ng;a=darcs_commitdiff;h=20070601204631-46e39-607ef93235bddbe47c5f4131891dae020245599e.gz; [pastelib: some b*stard spammers got past my spam filter AlexExtreme **20070601204631] { hunk ./pastelib/config/frugalware.org.conf.php 203 -$CONF['spam_regex'] = "/s-e-x|zoofilia|sexyongpin|grusskarte|geburtstagskarten|animalsex|". - "sex-with|dogsex|adultchat|adultlive|camsex|sexcam|livesex|sexchat|". +$CONF['spam_regex'] = "/s-e-x|zoofilia|sexyongpin|grusskarte|geburtstagskarten|animalsex|lrazepam|propecya|". + "sex-with|dogsex|adultchat|adultlive|camsex|sexcam|livesex|sexchat|propecea|cirpo|loarzepam|". hunk ./pastelib/config/frugalware.org.conf.php 207 - "spycam|voyeursex|online-casino|kontaktlinsen|cheapest-phone|". - "laser-eye|eye-laser|fuelcellmarket|lasikclinic|cragrats|parishilton|". - "paris-hilton|paris-tape|2large|fuel-dispenser|fueling-dispenser|huojia|effexor|paxil|lipitor". + "spycam|voyeursex|online-casino|kontaktlinsen|cheapest-phone|popecia|vcodin|". + "laser-eye|eye-laser|fuelcellmarket|lasikclinic|cragrats|parishilton|buy-phetermine|". + "paris-hilton|paris-tape|2large|fuel-dispenser|fueling-dispenser|huojia|effexor|paxil|lipitor|". } From crazy at frugalware.org Sat Jun 2 02:18:58 2007 From: crazy at frugalware.org (crazy) Date: Sat Jun 2 02:19:01 2007 Subject: [Frugalware-darcs] frugalware-current: binutils-2.17.50.0.16-2-i686 Message-ID: <20070602001858.5341C16A8009@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070602001632-f6986-30977625790195d4766bbd9fc98d76d5b623e303.gz; [binutils-2.17.50.0.16-2-i686 crazy **20070602001632 * fixed ld segfault with c++/java apps * see http://sourceware.org/bugzilla/show_bug.cgi?id=4497 ] { hunk ./source/devel/binutils/FrugalBuild 6 -pkgrel=1 +pkgrel=2 hunk ./source/devel/binutils/FrugalBuild 14 -source=(http://www2.kernel.org/pub/linux/devel/$pkgname/$pkgname-$pkgver.tar.bz2) -signatures=($source.sign) +source=(http://www2.kernel.org/pub/linux/devel/$pkgname/$pkgname-$pkgver.tar.bz2 bug-4497.patch) +signatures=($source.sign '') addfile ./source/devel/binutils/bug-4497.patch hunk ./source/devel/binutils/bug-4497.patch 1 +diff -Naur binutils-2.17.50.0.16/bfd/elf-eh-frame.c binutils-2.17.50.0.16-p/bfd/elf-eh-frame.c +--- binutils-2.17.50.0.16/bfd/elf-eh-frame.c 2007-05-11 17:23:19.000000000 +0200 ++++ binutils-2.17.50.0.16-p/bfd/elf-eh-frame.c 2007-06-02 01:35:51.000000000 +0200 +@@ -32,12 +32,16 @@ + unsigned int length; + unsigned int hash; + unsigned char version; ++ unsigned char local_personality; + char augmentation[20]; + bfd_vma code_align; + bfd_signed_vma data_align; + bfd_vma ra_column; + bfd_vma augmentation_size; +- bfd_vma personality; ++ union { ++ struct elf_link_hash_entry *h; ++ bfd_vma val; ++ } personality; + asection *output_sec; + struct eh_cie_fde *cie_inf; + unsigned char per_encoding; +@@ -216,13 +220,15 @@ + if (c1->hash == c2->hash + && c1->length == c2->length + && c1->version == c2->version ++ && c1->local_personality == c2->local_personality + && strcmp (c1->augmentation, c2->augmentation) == 0 + && strcmp (c1->augmentation, "eh") != 0 + && c1->code_align == c2->code_align + && c1->data_align == c2->data_align + && c1->ra_column == c2->ra_column + && c1->augmentation_size == c2->augmentation_size +- && c1->personality == c2->personality ++ && memcmp (&c1->personality, &c2->personality, ++ sizeof (c1->personality)) == 0 + && c1->output_sec == c2->output_sec + && c1->per_encoding == c2->per_encoding + && c1->lsda_encoding == c2->lsda_encoding +@@ -670,12 +676,10 @@ + REQUIRE (skip_bytes (&buf, end, length)); + } + ENSURE_NO_RELOCS (buf); +- /* Ensure we have a reloc here, against +- a global symbol. */ ++ /* Ensure we have a reloc here. */ + if (GET_RELOC (buf) != NULL) + { + unsigned long r_symndx; +- asection *sym_sec = NULL; + + #ifdef BFD64 + if (ptr_size == 8) +@@ -683,7 +687,9 @@ + else + #endif + r_symndx = ELF32_R_SYM (cookie->rel->r_info); +- if (r_symndx >= cookie->locsymcount) ++ if (r_symndx >= cookie->locsymcount ++ || ELF_ST_BIND (cookie->locsyms[r_symndx] ++ .st_info) != STB_LOCAL) + { + struct elf_link_hash_entry *h; + +@@ -695,33 +701,29 @@ + h = (struct elf_link_hash_entry *) + h->root.u.i.link; + +- if (h->root.type == bfd_link_hash_defined +- || h->root.type == bfd_link_hash_defweak) +- { +- cie->personality = h->root.u.def.value; +- sym_sec = h->root.u.def.section; +- } ++ cie->personality.h = h; + } + else + { +- Elf_Internal_Shdr *symtab_hdr; + Elf_Internal_Sym *sym; ++ asection *sym_sec; ++ bfd_vma val; + +- symtab_hdr = &elf_tdata (abfd)->symtab_hdr; +- sym = bfd_elf_get_elf_syms (abfd, symtab_hdr, +- 1, r_symndx, +- NULL, NULL, NULL); +- if (sym != NULL) ++ sym = &cookie->locsyms[r_symndx]; ++ sym_sec = (bfd_section_from_elf_index ++ (abfd, sym->st_shndx)); ++ if (sym_sec->kept_section != NULL) ++ sym_sec = sym_sec->kept_section; ++ if (sym_sec != NULL ++ && sym_sec->output_section != NULL) + { +- cie->personality = sym->st_value; +- sym_sec = (bfd_section_from_elf_index +- (abfd, sym->st_shndx)); +- free (sym); ++ val = (sym->st_value ++ + sym_sec->output_offset ++ + sym_sec->output_section->vma); ++ cie->personality.val = val; ++ cie->local_personality = 1; + } + } +- if (sym_sec != NULL) +- cie->personality += (sym_sec->output_section->vma +- + sym_sec->output_offset); + + /* Cope with MIPS-style composite relocations. */ + do +@@ -729,7 +731,7 @@ + while (GET_RELOC (buf) != NULL); + } + REQUIRE (skip_bytes (&buf, end, per_width)); +- REQUIRE (cie->personality); ++ REQUIRE (cie->local_personality || cie->personality.h); + } + break; + default: } From alex at alex-smith.me.uk Sat Jun 2 09:33:33 2007 From: alex at alex-smith.me.uk (AlexExtreme) Date: Sat Jun 2 09:33:37 2007 Subject: [Frugalware-darcs] homepage-ng: newsletter: issue 6 draft Message-ID: <20070602073334.C601716A8024@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=homepage-ng;a=darcs_commitdiff;h=20070602073251-46e39-4aed37cec9c0c2699a53142a02375c073a888e14.gz; [newsletter: issue 6 draft AlexExtreme **20070602073251] { addfile ./frugalware/weeklynews/issue6.html hunk ./frugalware/weeklynews/issue6.html 1 +

+ Welcome to the sixth issue of the Frugalware Newsletter! This is our fortnightly newsletter for Frugalware users to read to find out about what's going on in Frugalware development. +

+

Table of Contents

+ + + +

News

+

+ Here's what's happened over the last few weeks: +

+
    +
  • +

    0.7pre1 released!

    + We have released the first pre-release of the upcoming 0.7 release! Anyone who would like to help make 0.7 the best and most bug-free release yet, please download the ISOs and test them! There are currently a few known issues: Glibc 2.6-1 causes some apps (mainly firefox and thunderbird) to die sometimes with malloc errors. To resolve this, run pacman-g2 -Syu after installation. +
  • +
  • +

    GCC Java Web Plugin

    + As of gcc-4.2.0-3, there is a usable java browser plugin for systems where the binary is not available, like x86_64. See this page for more information. +
  • +
  • +

    Pacman-Tools improvements

    + Pacman-tools now provides a fwmakepkg man page, which is a good for people who want to learn to build packages. Repoman now also supports nobuild packages (like opera, vmware, etc). This means that these packages now show up on our homepage search. +
  • +
  • +

    New i686 build server

    + Thanks to the generous donations of a lot of people, we now have a new i686 build server! This server now runs a Pentium 4 processor with 768MB RAM, so i686 packages should be built much faster. Thanks everyone! +
  • +
  • +

    Homepage design contest

    + Just a reminder that we are running a homepage design contest. If anyone wants to try making a design for our homepage, look at issue 3 of the newsletter for more info! The contest has been extended to next Friday (8th of June) to wait for some entries that we know are in progress. +
  • +
  • +

    New developer

    + We'd like to take this opportunity to welcome our new developer, detto. He has already contributed several packages to Frugalware, and some tips and tricks for the newsletter. We hope he'll enjoy being a developer! +
  • +
  • +

    Forums to Mailing list gateway

    + We now have a gateway between the forums and the frugalware-forums mailing list. All the messages posted to the frugalware-forums mailing list are posted to the forums and all the posts from the "Mailing list" section of the forum are posted to the mailing list. +
  • +
+ + +

Tips and tricks

+

+ Here are some tips and tricks that have been discovered by our users to help make using your Frugalware system even easier and make your system even faster. Remember that this section relies on your contributions! If you have some tips and tricks that you would like to be shown in the newsletter, please post them on the forums in the Tips and Tricks section! +

+
    +
  • +

    Hiding the Trash icon in XFCE

    + Create a file named 'xfdesktoprc' in /home/your_user_name/.config/xfce4/desktop/ and add the following line(s) to it: +
    
    +		[file-icons]
    +		show-trash=false
    +		
    + Restart Xfce after making the changes and the trash icon will no longer be displayed. +
  • +
+ + +

Developer announcements

+
    +
  • + None this week. +
  • +
+ + +

Bug fixes

+

+ A list of bugs closed in the past 2 weeks is available here +

+ + +

Security announcements

+

+ Here are a list of security issues which have been discovered and fixed in the 0.6 release in the past 2 weeks: +

+
    +
  • FSA191 - freetype2: Victor Stinner has reported a vulnerability in FreeType, which can be exploited by malicious people to cause a DoS (Denial of Service) or potentially compromise an application using the library. Please upgrade to freetype2-2.3.4-1terminus2.
  • +
  • FSA190 - zoo: It's possible to make the ZOO implementation to enter in an infinite loop condition. Please upgrade to zoo-2.10-5terminus1.
  • +
  • FSA189 - vmware: Some vulnerabilities have been reported in various VMware products, which can be exploited by malicious users to cause a DoS (Denial of Service) or bypass certain security restrictions. Please upgrade to vmware-5.5.4_44386-1terminus1.
  • +
  • FSA188 - madwifi: Some vulnerabilities have been reported in MadWifi, which can be exploited by malicious, local users and malicious people to cause a DoS (Denial of Service). Please upgrade to madwifi-0.9.3.1-1terminus1.
  • +
  • FSA187 - php: Xavier Roche has reported a vulnerability in PHP, which can be exploited by malicious people to cause a DoS (Denial of Service). Please upgrade to php-5.2.2-1terminus2.
  • +
  • FSA186 - jasper: A vulnerability has been reported in JasPer, which can be exploited by malicious people to cause a DoS (Denial of Service). Please upgrade to jasper-1.900.1-2terminus1.
  • +
  • FSA185 - samba + samba-client: Some vulnerabilities have been reported in Samba, which can be exploited by malicious users to perform certain actions with escalated privileges and to compromise a vulnerable system, and by malicious people to compromise a vulnerable system. Please upgrade to samba and samba-client-3.0.24-2terminus1.
  • +
  • FSA184 - libpng: A vulnerability has been reported in libpng, which can be exploited by malicious people to cause a DoS (Denial of Service). Please upgrade to libpng-1.2.16-2terminus1.
  • +
} From alex at alex-smith.me.uk Sat Jun 2 09:34:59 2007 From: alex at alex-smith.me.uk (AlexExtreme) Date: Sat Jun 2 09:35:00 2007 Subject: [Frugalware-darcs] homepage-ng: newsletter: XHTML fix Message-ID: <20070602073459.8B1AE16A8024@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=homepage-ng;a=darcs_commitdiff;h=20070602073419-46e39-c56a778c9193123b38d17c9964fe9e22d37e2db9.gz; [newsletter: XHTML fix AlexExtreme **20070602073419] { hunk ./frugalware/weeklynews/issue6.html 61 - + } From alex at alex-smith.me.uk Sat Jun 2 09:36:33 2007 From: alex at alex-smith.me.uk (AlexExtreme) Date: Sat Jun 2 09:36:35 2007 Subject: [Frugalware-darcs] homepage-ng: paypal: validation fixes Message-ID: <20070602073633.9770616A8024@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=homepage-ng;a=darcs_commitdiff;h=20070602073557-46e39-051743f461898ad2eaa4332fb41a028a08ce349b.gz; [paypal: validation fixes AlexExtreme **20070602073557] { hunk ./frugalware/paypal.inc.html 2 - - - + + + hunk ./frugalware/paypal.inc.html 6 -"> +" /> } From alex at alex-smith.me.uk Sat Jun 2 09:37:07 2007 From: alex at alex-smith.me.uk (AlexExtreme) Date: Sat Jun 2 09:37:10 2007 Subject: [Frugalware-darcs] homepage-ng: paypal: validation fixes Message-ID: <20070602073707.902B216A8009@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=homepage-ng;a=darcs_commitdiff;h=20070602073634-46e39-ed5f3b9e75d1faae69ffbd2c2f96dd85afeececa.gz; [paypal: validation fixes AlexExtreme **20070602073634] { hunk ./frugalware/paypal.inc.html 3 - + } From alex at alex-smith.me.uk Sat Jun 2 09:38:24 2007 From: alex at alex-smith.me.uk (AlexExtreme) Date: Sat Jun 2 09:38:26 2007 Subject: [Frugalware-darcs] homepage-ng: paypal: make the link more visible Message-ID: <20070602073824.D24A716A8024@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=homepage-ng;a=darcs_commitdiff;h=20070602073751-46e39-73f9b6607d5cd76fd8e01e0d0f0d67675bf276a5.gz; [paypal: make the link more visible AlexExtreme **20070602073751] { hunk ./frugalware/header.php 53 -fwsidebox(gettext("Recent updates"), $data['packages']); -fwsidebox(gettext("Languages"), $langcontent); hunk ./frugalware/header.php 55 +fwsidebox(gettext("Recent updates"), $data['packages']); +fwsidebox(gettext("Languages"), $langcontent); } From alex at alex-smith.me.uk Sat Jun 2 09:47:03 2007 From: alex at alex-smith.me.uk (AlexExtreme) Date: Sat Jun 2 09:47:05 2007 Subject: [Frugalware-darcs] homepage-ng: homepage: release newsletter issue 6 Message-ID: <20070602074703.0F03116A8026@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=homepage-ng;a=darcs_commitdiff;h=20070602074619-46e39-4abc4942c61134f3a6f726a54dd0f9fd132be2eb.gz; [homepage: release newsletter issue 6 AlexExtreme **20070602074619] { hunk ./frugalware/xml/news.xml 16 + + 66 + Frugalware Newsletter Issue 6 + Tue Jun 2 08:45:13 CET 2007 + AlexExtreme + 0 + here. We hope you like it! + ]]> + + } From krics at linuxforum.hu Sat Jun 2 10:35:16 2007 From: krics at linuxforum.hu (Christian Hamar alias krix) Date: Sat Jun 2 10:35:20 2007 Subject: [Frugalware-darcs] frugalware-current: mldonkey-2.8.6-1-x86_64 Message-ID: <20070602083516.AFCCB16A8024@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070602083359-d209c-1e0b9ed60e0b81452cbf9abb954bc5668e246274.gz; [mldonkey-2.8.6-1-x86_64 Christian Hamar alias krix **20070602083359 * Version bump ] { hunk ./source/gnome-extra/mldonkey/FrugalBuild 5 -pkgver=2.8.5 +pkgver=2.8.6 hunk ./source/gnome-extra/mldonkey/FrugalBuild 30 -sha1sums=('1606999a76a4dad4ccb549b455df44b6f5a779ef') +sha1sums=('f61437d48cb7796353c988e14a2c126bdaf3ac01') } From krics at linuxforum.hu Sat Jun 2 10:45:21 2007 From: krics at linuxforum.hu (Christian Hamar alias krix) Date: Sat Jun 2 10:45:23 2007 Subject: [Frugalware-darcs] frugalware-current: bluez-libs-3.11-1-x86_64 Message-ID: <20070602084521.656531768120@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070602084413-d209c-b727043861f9f25d2b4ebd9d4a5db68a1f017a74.gz; [bluez-libs-3.11-1-x86_64 Christian Hamar alias krix **20070602084413 * Version bump ] { hunk ./source/lib/bluez-libs/FrugalBuild 5 -pkgver=3.10 +pkgver=3.11 hunk ./source/lib/bluez-libs/FrugalBuild 15 -sha1sums=('e0e7dc5d878479b3a367220311df22bc5d4b323d') +sha1sums=('3a581d5563ebc001c4a344790672e7c4b78cb9a9') } From krics at linuxforum.hu Sat Jun 2 10:50:17 2007 From: krics at linuxforum.hu (Christian Hamar alias krix) Date: Sat Jun 2 10:50:20 2007 Subject: [Frugalware-darcs] frugalware-current: openobex-1.3-9-x86_64 Message-ID: <20070602085018.2A7691768120@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070602084907-d209c-9ce2eb79b630921058be935c024bab0399c28752.gz; [openobex-1.3-9-x86_64 Christian Hamar alias krix **20070602084907 * Release bump (depend on bluez-libs-3.11) ] { hunk ./source/lib-extra/openobex/FrugalBuild 7 -pkgrel=8 +pkgrel=9 hunk ./source/lib-extra/openobex/FrugalBuild 10 -depends=('glibc' 'bluez-libs>=3.10' 'libusb') +depends=('glibc' 'bluez-libs>=3.11' 'libusb') } From krics at linuxforum.hu Sat Jun 2 10:54:54 2007 From: krics at linuxforum.hu (Christian Hamar alias krix) Date: Sat Jun 2 10:54:57 2007 Subject: [Frugalware-darcs] frugalware-current: obexftp-0.20-5-x86_64 Message-ID: <20070602085454.61A2016A8024@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070602085344-d209c-1a810308eb010f8929bfa03b2910c7d44d45dc45.gz; [obexftp-0.20-5-x86_64 Christian Hamar alias krix **20070602085344 * Release bump ('cause of bluez-libs-3.11) ] { hunk ./source/apps-extra/obexftp/FrugalBuild 6 -pkgrel=4 +pkgrel=5 hunk ./source/apps-extra/obexftp/FrugalBuild 8 -depends=('openobex>=1.3-8') +depends=('openobex>=1.3-9') } From krics at linuxforum.hu Sat Jun 2 11:04:02 2007 From: krics at linuxforum.hu (Christian Hamar alias krix) Date: Sat Jun 2 11:04:04 2007 Subject: [Frugalware-darcs] frugalware-current: bluez-utils-3.11-1-x86_64 Message-ID: <20070602090402.A34C71768120@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070602090303-d209c-786acb2814f40e7110df4898f46aeb9133886cb9.gz; [bluez-utils-3.11-1-x86_64 Christian Hamar alias krix **20070602090303 * Version bump ] { hunk ./source/apps-extra/bluez-utils/FrugalBuild 5 -pkgver=3.10 +pkgver=3.11 hunk ./source/apps-extra/bluez-utils/FrugalBuild 9 -depends=('dbus-glib>=0.71' 'openobex>=1.3-8' 'bluez-libs>=3.10') +depends=('dbus-glib>=0.71' 'openobex>=1.3-9' 'bluez-libs>=3.11') hunk ./source/apps-extra/bluez-utils/FrugalBuild 24 -sha1sums=('02c1338e7d7bffeab8ef05c6c22c23242c2b3ae7'\ +sha1sums=('08b41ad64aa12b0063ac6b6406612272aa6807c2'\ } From krics at linuxforum.hu Sat Jun 2 11:17:00 2007 From: krics at linuxforum.hu (Christian Hamar alias krix) Date: Sat Jun 2 11:17:03 2007 Subject: [Frugalware-darcs] frugalware-current: libbtctl-0.8.2-4-x86_64 Message-ID: <20070602091701.11D8116A8024@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070602091541-d209c-2d814a386e2664f0cc8a9eeeb7775cda2e797e2d.gz; [libbtctl-0.8.2-4-x86_64 Christian Hamar alias krix **20070602091541 * Release bump (bluez-libs-3.11) ] { hunk ./source/xlib-extra/libbtctl/FrugalBuild 6 -pkgrel=3 +pkgrel=4 hunk ./source/xlib-extra/libbtctl/FrugalBuild 9 -depends=('glib2' 'bluez-utils>=3.10' 'bluez-libs>=3.10' 'openobex>=1.3-8' \ +depends=('glib2' 'bluez-utils>=3.11' 'bluez-libs>=3.11' 'openobex>=1.3-9' \ } From krics at linuxforum.hu Sat Jun 2 11:26:49 2007 From: krics at linuxforum.hu (Christian Hamar alias krix) Date: Sat Jun 2 11:26:53 2007 Subject: [Frugalware-darcs] frugalware-current: gnome-bluetooth-0.8.0-7-x86_64 Message-ID: <20070602092650.1CB2816A8024@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070602092519-d209c-7c59d3416da81d2dbcf14a89bb83f922d29eba8f.gz; [gnome-bluetooth-0.8.0-7-x86_64 Christian Hamar alias krix **20070602092519 * Release bump (bluez-libs-3.11) ] { hunk ./source/gnome-extra/gnome-bluetooth/FrugalBuild 6 -pkgrel=6 +pkgrel=7 hunk ./source/gnome-extra/gnome-bluetooth/FrugalBuild 10 -depends=('bluez-utils>=3.10' 'bluez-libs>=3.10' 'gob2' 'pygtk' \ - 'librsvg>=2.16.0' 'gnome-python>=2.16.0' 'libbtctl>=0.8.2-3' \ +depends=('bluez-utils>=3.11' 'bluez-libs>=3.11' 'gob2' 'pygtk' \ + 'librsvg>=2.16.0' 'gnome-python>=2.16.0' 'libbtctl>=0.8.2-4' \ } From krics at linuxforum.hu Sat Jun 2 11:39:27 2007 From: krics at linuxforum.hu (Christian Hamar alias krix) Date: Sat Jun 2 11:39:31 2007 Subject: [Frugalware-darcs] frugalware-current: kdebluetooth-1.0_beta2-4-x86_64 Message-ID: <20070602093927.C557516A8024@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070602093756-d209c-95c59409889a5294a54da33f253613dd910b4ad9.gz; [kdebluetooth-1.0_beta2-4-x86_64 Christian Hamar alias krix **20070602093756 * Release bump (bluez-libs-3.11) ] { hunk ./source/kde-extra/kdebluetooth/FrugalBuild 6 -pkgrel=3 +pkgrel=4 hunk ./source/kde-extra/kdebluetooth/FrugalBuild 8 -depends=('kdepim>=3.5.6' 'dbus>=1.0.2' 'bluez-libs>=3.10' 'openobex>=1.3-8' \ - 'bluez-utils>=3.10' 'obexftp>=0.20-4' 'libgcc' 'libxfixes') +depends=('kdepim>=3.5.6' 'dbus>=1.0.2' 'bluez-libs>=3.11' 'openobex>=1.3-9' \ + 'bluez-utils>=3.11' 'obexftp>=0.20-5' 'libgcc' 'libxfixes') } From crazy at frugalware.org Sat Jun 2 12:48:11 2007 From: crazy at frugalware.org (crazy) Date: Sat Jun 2 12:48:16 2007 Subject: [Frugalware-darcs] frugalware-current: mesa-6.5.3-1-i686 Message-ID: <20070602104811.91E0516A8024@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070602104611-f6986-fcd8c0ad012bf11afa29baa6d7c5ce987f2a20d2.gz; [mesa-6.5.3-1-i686 crazy **20070602104611 * Version bump ] { hunk ./source/x11/mesa/FrugalBuild 7 -pkgver=6.5.2 -pkgrel=3 +pkgver=6.5.3 +pkgrel=1 hunk ./source/x11/mesa/FrugalBuild 15 -depends=('expat' 'libx11>=1.1.1' 'libxext' 'libxxf86vm' 'libxi>=1.1.0' 'libxmu>=1.0.3' 'libice' 'libdrm>=2.3.0' 'libgl') +depends=('expat' 'libx11>=1.1.1' 'libxext' 'libxxf86vm' 'libxi>=1.1.0' 'libxmu>=1.0.3' \ + 'libice' 'libdrm>=2.3.0-2' 'libgl' 'libxdamage' 'libxfixes') hunk ./source/x11/mesa/FrugalBuild 23 - mesa-build-config.patch \ - i915tex.patch \ - bug-9045.patch \ - bug-9237.patch) + mesa-build-config.patch) hunk ./source/x11/mesa/FrugalBuild 52 - unset MAKEFLAGS + #unset MAKEFLAGS hunk ./source/x11/mesa/FrugalBuild 70 - Fln libGLU.so.1.3.060502 /usr/lib/libGLU.so.1.3 + Fln libGLU.so.1.3.060503 /usr/lib/libGLU.so.1.3 hunk ./source/x11/mesa/FrugalBuild 80 -sha1sums=('bc784eb272b586cf9663920da0d145dc78018ee5'\ +sha1sums=('6c52d14b9bc3e5f1fafe19b81db1b43569589dcd'\ hunk ./source/x11/mesa/FrugalBuild 84 - 'b49bb4f22426fd0dab7551ef8907276214c9a3fa'\ - '067931e73ffd718f0715ddd69040c660821083d8'\ - 'af385a1f28afb4368719c634b4fb5d3991e9e432'\ - '9d0d4102b26962cc453c4d66f5638f0cfb33c4fd') + 'f7f706ec568a80543c6d6096b3d8a833b80399ed') hunk ./source/x11/mesa/bug-9045.patch 1 -From: Xiang, Haihao -Date: Fri, 8 Dec 2006 09:00:59 +0000 (+0800) -Subject: fix bug#9045 -X-Git-Url: http://gitweb.freedesktop.org/?p=mesa/mesa.git;a=commitdiff;h=5449f5a97524cb21194b20d05449d7211faaa51c - -fix bug#9045 ---- - ---- a/src/mesa/drivers/dri/i965/intel_ioctl.c -+++ b/src/mesa/drivers/dri/i965/intel_ioctl.c -@@ -75,7 +75,7 @@ void intelWaitIrq( struct intel_context - { - if (!intel->no_hw) { - drmI830IrqWait iw; -- int ret; -+ int ret, lastdispatch; - - if (0) - fprintf(stderr, "%s %d\n", __FUNCTION__, seq ); -@@ -83,11 +83,12 @@ void intelWaitIrq( struct intel_context - iw.irq_seq = seq; - - do { -+ lastdispatch = intel->sarea->last_dispatch; - ret = drmCommandWrite( intel->driFd, DRM_I830_IRQ_WAIT, &iw, sizeof(iw) ); - - /* This seems quite often to return before it should!?! - */ -- } while (ret == -EAGAIN || ret == -EINTR || (ret == 0 && seq > intel->sarea->last_dispatch)); -+ } while (ret == -EAGAIN || ret == -EINTR || (ret == -EBUSY && lastdispatch != intel->sarea->last_dispatch) || (ret == 0 && seq > intel->sarea->last_dispatch)); - - - if ( ret ) { - rmfile ./source/x11/mesa/bug-9045.patch hunk ./source/x11/mesa/bug-9237.patch 1 -From: Xiang, Haihao -Date: Fri, 8 Dec 2006 09:05:14 +0000 (+0800) -Subject: fix bug#9237 -X-Git-Url: http://gitweb.freedesktop.org/?p=mesa/mesa.git;a=commitdiff;h=f79360858d4c94629ef543a35e4e44a13419ac0e - -fix bug#9237 ---- - ---- a/src/mesa/drivers/dri/i965/brw_misc_state.c -+++ b/src/mesa/drivers/dri/i965/brw_misc_state.c -@@ -88,10 +88,10 @@ static void upload_drawing_rect(struct b - if (brw->intel.numClipRects > 1) - return; - -- x1 = dPriv->x; -- y1 = dPriv->y; -- x2 = dPriv->x + dPriv->w; -- y2 = dPriv->y + dPriv->h; -+ x1 = brw->intel.pClipRects[0].x1; -+ y1 = brw->intel.pClipRects[0].y1; -+ x2 = brw->intel.pClipRects[0].x2; -+ y2 = brw->intel.pClipRects[0].y2; - - if (x1 < 0) x1 = 0; - if (y1 < 0) y1 = 0; - rmfile ./source/x11/mesa/bug-9237.patch hunk ./source/x11/mesa/i915tex.patch 1 -From: Michel DÃ?nzer -Date: Thu, 7 Dec 2006 10:03:48 +0000 (+0100) -Subject: i915tex: Recalculate viewport related hardware state in intelWindowMoved(). -X-Git-Url: http://gitweb.freedesktop.org/?p=mesa/mesa.git;a=commitdiff;h=7a10d66590a4cebd2b453218e75fe82b02a3edcc - -i915tex: Recalculate viewport related hardware state in intelWindowMoved(). - -This fixes vertically displaced rendering with some apps like Google Earth. - -Simplify other parts of the function somewhat. ---- - ---- a/src/mesa/drivers/dri/i915tex/intel_buffers.c -+++ b/src/mesa/drivers/dri/i915tex/intel_buffers.c -@@ -36,6 +36,7 @@ - #include "intel_batchbuffer.h" - #include "context.h" - #include "utils.h" -+#include "drirenderbuffer.h" - #include "framebuffer.h" - #include "swrast/swrast.h" - #include "vblank.h" -@@ -183,6 +184,8 @@ void - intelWindowMoved(struct intel_context *intel) - { - GLcontext *ctx = &intel->ctx; -+ __DRIdrawablePrivate *dPriv = intel->driDrawable; -+ GLframebuffer *drawFb = (GLframebuffer *) dPriv->driverPrivate; - - if (!intel->ctx.DrawBuffer) { - /* when would this happen? -BP */ -@@ -194,7 +197,7 @@ intelWindowMoved(struct intel_context *i - } - else { - /* drawing to a window */ -- switch (intel->ctx.DrawBuffer->_ColorDrawBufferMask[0]) { -+ switch (drawFb->_ColorDrawBufferMask[0]) { - case BUFFER_BIT_FRONT_LEFT: - intelSetFrontClipRects(intel); - break; -@@ -207,14 +210,11 @@ intelWindowMoved(struct intel_context *i - } - } - -- /* this update Mesa's notion of window size */ -- if (ctx->WinSysDrawBuffer) { -- _mesa_resize_framebuffer(ctx, ctx->WinSysDrawBuffer, -- intel->driDrawable->w, intel->driDrawable->h); -- } -+ /* Update Mesa's notion of window size */ -+ driUpdateFramebufferSize(ctx, dPriv); -+ drawFb->Initialized = GL_TRUE; /* XXX remove someday */ - -- if (intel->intelScreen->driScrnPriv->ddxMinor >= 7 && intel->driDrawable) { -- __DRIdrawablePrivate *dPriv = intel->driDrawable; -+ if (intel->intelScreen->driScrnPriv->ddxMinor >= 7) { - drmI830Sarea *sarea = intel->sarea; - drm_clip_rect_t drw_rect = { .x1 = dPriv->x, .x2 = dPriv->x + dPriv->w, - .y1 = dPriv->y, .y2 = dPriv->y + dPriv->h }; -@@ -245,6 +245,9 @@ intelWindowMoved(struct intel_context *i - /* Update hardware scissor */ - ctx->Driver.Scissor(ctx, ctx->Scissor.X, ctx->Scissor.Y, - ctx->Scissor.Width, ctx->Scissor.Height); -+ -+ /* Re-calculate viewport related state */ -+ ctx->Driver.DepthRange( ctx, ctx->Viewport.Near, ctx->Viewport.Far ); - } rmfile ./source/x11/mesa/i915tex.patch hunk ./source/x11/mesa/mesa-build-config.patch 62 -+DRI_DIRS = i915tex i915 i965 mach64 mga r128 r200 radeon tdfx unichrome savage r300 ++DRI_DIRS = i915tex i915 i965 mach64 mga r128 r200 radeon tdfx unichrome savage r300 nouveau } From crazy at frugalware.org Sat Jun 2 13:01:05 2007 From: crazy at frugalware.org (crazy) Date: Sat Jun 2 13:01:10 2007 Subject: [Frugalware-darcs] frugalware-current: mesademos-6.5.3-1-i686 Message-ID: <20070602110106.8226A1768120@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070602105804-f6986-7d03444bd16a4c82e3f6572b57d848d0386218c1.gz; [mesademos-6.5.3-1-i686 crazy **20070602105804 * Version bump ] { hunk ./source/x11/mesademos/FrugalBuild 6 -pkgver=6.5.2 -pkgrel=2 +pkgver=6.5.3 +pkgrel=1 hunk ./source/x11/mesademos/FrugalBuild 14 -depends=('mesa>=6.5.2-3' 'libstdc++' 'freeglut' 'libx11>=1.1.1' 'libxmu' +depends=('mesa>=6.5.3' 'libstdc++' 'freeglut' 'libx11>=1.1.1' 'libxmu' hunk ./source/x11/mesademos/FrugalBuild 20 -sha1sums=('beac8b2fa9c6e25efd44b911d2d7952b2f87534c' \ - '16d41d20137358f09b91d93989b62ae3e01c5993') +sha1sums=('c8385af8ad7df534fade33f8670bbb3dca83b787'\ + '16d41d20137358f09b91d93989b62ae3e01c5993') } From alex at alex-smith.me.uk Sat Jun 2 13:01:12 2007 From: alex at alex-smith.me.uk (AlexExtreme) Date: Sat Jun 2 13:01:19 2007 Subject: [Frugalware-darcs] frugalware-current: ifplugd-0.28-1-i686 Message-ID: <20070602110114.0B7FA176812B@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070602105808-46e39-eb5581a7f1e669fae7926dd4a99d76fe76b02681.gz; [ifplugd-0.28-1-i686 AlexExtreme **20070602105808 * New package ] { adddir ./source/network-extra/ifplugd addfile ./source/network-extra/ifplugd/FrugalBuild hunk ./source/network-extra/ifplugd/FrugalBuild 1 +# Compiling Time: 0.02 SBU +# Maintainer: AlexExtreme + +pkgname=ifplugd +pkgver=0.28 +pkgrel=1 +pkgdesc="ifplugd is a Linux daemon which will automatically configure your ethernet device when a cable is plugged in" +url="http://0pointer.de/lennart/projects/ifplugd/" +depends=('libdaemon' 'bash') +groups=('network-extra') +backup=(etc/ifplugd/ifplugd.conf) +archs=('i686') +up2date="lynx -dump http://0pointer.de/lennart/projects/ifplugd/ | grep -i 'current release' | sed 's/.*[0-9]\]//'" +source=($url/$pkgname-$pkgver.tar.gz iface-fix.patch rc.ifplugd ifplugd.action) +sha1sums=('0f00e6b544c0b7ed6c66fc58cb74f038d3fba77a' \ + 'e1160bd73993b9f3056b6ae7a63842dcfa0db871' \ + '0eb6bc0a8f8aae549b2728cb77139ed87a5e5ddb' \ + '6ffa71577d8f89eb5edc7af2405f622155af322e') +Fconfopts="$Fconfopts --with-initdir=/etc/rc.d" + +build() { + Fcd + Fbuild + Frm /etc/rc.d/ifplugd + Fexe /etc/ifplugd/ifplugd.action + Fsed "-fwI -u0 -d10" "-fwI -u2 -d2" $Fdestdir/etc/ifplugd/ifplugd.conf + Fsed "eth0" "auto" $Fdestdir/etc/ifplugd/ifplugd.conf +} + +# optimization OK addfile ./source/network-extra/ifplugd/iface-fix.patch hunk ./source/network-extra/ifplugd/iface-fix.patch 1 +--- /trunk/src/interface.c 2005/11/28 16:17:38 132 ++++ trunk/src/interface.c 2006/03/07 13:15:11 133 +@@ -22,9 +22,9 @@ + #include + #endif + ++#include + #include + #include +-#include + #include + #include + #include addfile ./source/network-extra/ifplugd/ifplugd.action hunk ./source/network-extra/ifplugd/ifplugd.action 1 +#!/bin/sh +# $Id: ifplugd.action 99 2004-02-08 20:17:59Z lennart $ + +# This file is part of ifplugd. +# +# ifplugd is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free +# Software Foundation; either version 2 of the License, or (at your +# option) any later version. +# +# ifplugd is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# for more details. +# +# You should have received a copy of the GNU General Public License +# along with ifplugd; if not, write to the Free Software Foundation, +# Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +# Ported to Frugalware Linux by Alex Smith + +set -e + +if [ -z "$1" ] || [ -z "$2" ] ; then + logger -s -p local0.err -t ifplugd.action "Wrong arguments" + exit 1 +fi + +# Check whether a different profile was given on the kernel command line +profile=$(grep network /proc/cmdline|sed 's/.*network=\([^ ]*\)\( .*\|$\)/\1/') + +if [ "$2" = "up" ]; then + # Bring up the interface + if [ -z "$profile" ]; then + exec netconfig start $1 + else + exec netconfig $profile $1 + fi +elif [ "$2" = "down" ]; then + exec /sbin/netconfig stop $1 +fi + +exit 1 addfile ./source/network-extra/ifplugd/ifplugd.install hunk ./source/network-extra/ifplugd/ifplugd.install 1 +post_install() { + if [ -e /usr/sbin/chkconfig ] && [ -x /usr/sbin/chkconfig ]; then + /usr/sbin/chkconfig --add rc.ifplugd + fi +} + +post_upgrade() { + post_install $1 +} + +pre_remove() { + if [ -e /usr/sbin/chkconfig ] && [ -x /usr/sbin/chkconfig ]; then + /usr/sbin/chkconfig --del rc.ifplugd + fi +} + +op=$1 +shift + +$op $* addfile ./source/network-extra/ifplugd/rc.ifplugd hunk ./source/network-extra/ifplugd/rc.ifplugd 1 +#!/bin/bash + +# Copyright (C) 2007 Alex Smith +# rc.ifplugd for Frugalware +# Distributed under the GPL license + +# chkconfig: 2345 10 89 +# description: Brings networks interfaces up and down automatically when \ +# the cable is removed / inserted + +source /lib/initscripts/functions +TEXTDOMAINDIR=/lib/initscripts/functions +TEXTDOMAIN=ifplugd + +actions=(restart start stop status) +daemon=$"Interface Plugging daemon" + +CFG=/etc/ifplugd/ifplugd.conf +IFPLUGD=/usr/sbin/ifplugd + +test -x $IFPLUGD || exit 0 + +if [ `id -u` != "0" ] && [ "$1" = "start" -o "$1" = "stop" ] ; then + echo "You must be root to start, stop or restart ifplugd." + exit 1 +fi + +[ -f $CFG ] && . $CFG +[ "x$INTERFACES" = "xauto" ] && INTERFACES="`cat /proc/net/dev | awk '{ print $1 }' | egrep '^(eth|wlan)' | cut -d: -f1`" + +rc_start() { + ret=0 + start_msg + for IF in $INTERFACES; do + A="`eval echo \$\{ARGS_${IF}\}`" + [ -z "$A" ] && A="$ARGS" + $IFPLUGD -i $IF $A + ret=$(($ret + $?)) + done + ok $ret +} + +rc_stop() { + ret=0 + stop_msg + for IF in $INTERFACES; do + $IFPLUGD -k -i $IF + ret=$(($ret + $?)) + done + ok $ret +} + +rc_status() { + for IF in $INTERFACES ; do + $IFPLUGD -c -i $IF + done +} + +rc_exec $1 } From vmiklos at frugalware.org Sat Jun 2 13:17:41 2007 From: vmiklos at frugalware.org (VMiklos) Date: Sat Jun 2 13:17:47 2007 Subject: [Frugalware-darcs] frugalware-current: gcc-4.2.0-4-i686 Message-ID: <20070602111742.286C316A8024@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070602111516-e2957-bf9f0f969c0e17377a455dccb970538427e8e753.gz; [gcc-4.2.0-4-i686 VMiklos **20070602111516 added fix for gcc bug #125227 it's necessary to compile for example xorg-server and qt ] { addfile ./source/devel/gcc/125227.diff hunk ./source/devel/gcc/125227.diff 1 +2007-05-27 Daniel Berlin + + Fix PR/30052 + Backport PTA solver from mainline + + * pointer-set.c: Copy from mainline + * pointer-set.h: Ditto. + * tree-ssa-structalias.c: Copy solver portions from mainline. + * Makefile.in (tree-ssa-structalias.o): Update dependencies + +Index: gcc/pointer-set.c +=================================================================== +--- a/gcc/pointer-set.c (revision 125226) ++++ b/gcc/pointer-set.c (revision 125227) +@@ -22,13 +22,12 @@ + #include "system.h" + #include "pointer-set.h" + +-/* A pointer sets is represented as a simple open-addressing hash ++/* A pointer set is represented as a simple open-addressing hash + table. Simplifications: The hash code is based on the value of the + pointer, not what it points to. The number of buckets is always a + power of 2. Null pointers are a reserved value. Deletion is not +- supported. There is no mechanism for user control of hash +- function, equality comparison, initial size, or resizing policy. +-*/ ++ supported (yet). There is no mechanism for user control of hash ++ function, equality comparison, initial size, or resizing policy. */ + + struct pointer_set_t + { +@@ -114,22 +113,16 @@ + } + } + +-/* Subroutine of pointer_set_insert. Inserts P into an empty +- element of SLOTS, an array of length N_SLOTS. Returns nonzero +- if P was already present in N_SLOTS. */ +-static int ++/* Subroutine of pointer_set_insert. Return the insertion slot for P into ++ an empty element of SLOTS, an array of length N_SLOTS. */ ++static inline size_t + insert_aux (void *p, void **slots, size_t n_slots, size_t log_slots) + { + size_t n = hash1 (p, n_slots, log_slots); + while (true) + { +- if (slots[n] == p) +- return 1; +- else if (slots[n] == 0) +- { +- slots[n] = p; +- return 0; +- } ++ if (slots[n] == p || slots[n] == 0) ++ return n; + else + { + ++n; +@@ -144,12 +137,10 @@ + int + pointer_set_insert (struct pointer_set_t *pset, void *p) + { +- if (insert_aux (p, pset->slots, pset->n_slots, pset->log_slots)) +- return 1; +- +- /* We've inserted a new element. Expand the table if necessary to keep +- the load factor small. */ +- ++pset->n_elements; ++ size_t n; ++ ++ /* For simplicity, expand the set even if P is already there. This can be ++ superfluous but can happen at most once. */ + if (pset->n_elements > pset->n_slots / 4) + { + size_t new_log_slots = pset->log_slots + 1; +@@ -158,9 +149,10 @@ + size_t i; + + for (i = 0; i < pset->n_slots; ++i) +- { +- if (pset->slots[i]) +- insert_aux (pset->slots[i], new_slots, new_n_slots, new_log_slots); ++ { ++ void *value = pset->slots[i]; ++ n = insert_aux (value, new_slots, new_n_slots, new_log_slots); ++ new_slots[n] = value; + } + + XDELETEVEC (pset->slots); +@@ -169,5 +161,144 @@ + pset->slots = new_slots; + } + ++ n = insert_aux (p, pset->slots, pset->n_slots, pset->log_slots); ++ if (pset->slots[n]) ++ return 1; ++ ++ pset->slots[n] = p; ++ ++pset->n_elements; + return 0; + } ++ ++/* Pass each pointer in PSET to the function in FN, together with the fixed ++ parameter DATA. If FN returns false, the iteration stops. */ ++ ++void pointer_set_traverse (struct pointer_set_t *pset, ++ bool (*fn) (void *, void *), void *data) ++{ ++ size_t i; ++ for (i = 0; i < pset->n_slots; ++i) ++ if (pset->slots[i] && !fn (pset->slots[i], data)) ++ break; ++} ++ ++ ++/* A pointer map is represented the same way as a pointer_set, so ++ the hash code is based on the address of the key, rather than ++ its contents. Null keys are a reserved value. Deletion is not ++ supported (yet). There is no mechanism for user control of hash ++ function, equality comparison, initial size, or resizing policy. */ ++ ++struct pointer_map_t ++{ ++ size_t log_slots; ++ size_t n_slots; /* n_slots = 2^log_slots */ ++ size_t n_elements; ++ ++ void **keys; ++ void **values; ++}; ++ ++/* Allocate an empty pointer map. */ ++struct pointer_map_t * ++pointer_map_create (void) ++{ ++ struct pointer_map_t *result = XNEW (struct pointer_map_t); ++ ++ result->n_elements = 0; ++ result->log_slots = 8; ++ result->n_slots = (size_t) 1 << result->log_slots; ++ ++ result->keys = XCNEWVEC (void *, result->n_slots); ++ result->values = XCNEWVEC (void *, result->n_slots); ++ return result; ++} ++ ++/* Reclaims all memory associated with PMAP. */ ++void pointer_map_destroy (struct pointer_map_t *pmap) ++{ ++ XDELETEVEC (pmap->keys); ++ XDELETEVEC (pmap->values); ++ XDELETE (pmap); ++} ++ ++/* Returns a pointer to the value to which P maps, if PMAP contains P. P ++ must be nonnull. Return NULL if PMAP does not contain P. ++ ++ Collisions are resolved by linear probing. */ ++void ** ++pointer_map_contains (struct pointer_map_t *pmap, void *p) ++{ ++ size_t n = hash1 (p, pmap->n_slots, pmap->log_slots); ++ ++ while (true) ++ { ++ if (pmap->keys[n] == p) ++ return &pmap->values[n]; ++ else if (pmap->keys[n] == 0) ++ return NULL; ++ else ++ { ++ ++n; ++ if (n == pmap->n_slots) ++ n = 0; ++ } ++ } ++} ++ ++/* Inserts P into PMAP if it wasn't already there. Returns a pointer ++ to the value. P must be nonnull. */ ++void ** ++pointer_map_insert (struct pointer_map_t *pmap, void *p) ++{ ++ size_t n; ++ ++ /* For simplicity, expand the map even if P is already there. This can be ++ superfluous but can happen at most once. */ ++ if (pmap->n_elements > pmap->n_slots / 4) ++ { ++ size_t new_log_slots = pmap->log_slots + 1; ++ size_t new_n_slots = pmap->n_slots * 2; ++ void **new_keys = XCNEWVEC (void *, new_n_slots); ++ void **new_values = XCNEWVEC (void *, new_n_slots); ++ size_t i; ++ ++ for (i = 0; i < pmap->n_slots; ++i) ++ if (pmap->keys[i]) ++ { ++ void *key = pmap->keys[i]; ++ n = insert_aux (key, new_keys, new_n_slots, new_log_slots); ++ new_keys[n] = key; ++ new_values[n] = pmap->values[i]; ++ } ++ ++ XDELETEVEC (pmap->keys); ++ XDELETEVEC (pmap->values); ++ pmap->n_slots = new_n_slots; ++ pmap->log_slots = new_log_slots; ++ pmap->keys = new_keys; ++ pmap->values = new_values; ++ } ++ ++ n = insert_aux (p, pmap->keys, pmap->n_slots, pmap->log_slots); ++ if (!pmap->keys[n]) ++ { ++ ++pmap->n_elements; ++ pmap->keys[n] = p; ++ } ++ ++ return &pmap->values[n]; ++} ++ ++/* Pass each pointer in PMAP to the function in FN, together with the pointer ++ to the value and the fixed parameter DATA. If FN returns false, the ++ iteration stops. */ ++ ++void pointer_map_traverse (struct pointer_map_t *pmap, ++ bool (*fn) (void *, void **, void *), void *data) ++{ ++ size_t i; ++ for (i = 0; i < pmap->n_slots; ++i) ++ if (pmap->keys[i] && !fn (pmap->keys[i], &pmap->values[i], data)) ++ break; ++} +Index: gcc/pointer-set.h +=================================================================== +--- a/gcc/pointer-set.h (revision 125226) ++++ b/gcc/pointer-set.h (revision 125227) +@@ -22,11 +22,21 @@ + #define POINTER_SET_H + + struct pointer_set_t; +- + struct pointer_set_t *pointer_set_create (void); + void pointer_set_destroy (struct pointer_set_t *pset); + + int pointer_set_contains (struct pointer_set_t *pset, void *p); + int pointer_set_insert (struct pointer_set_t *pset, void *p); ++void pointer_set_traverse (struct pointer_set_t *, bool (*) (void *, void *), ++ void *); + ++struct pointer_map_t; ++struct pointer_map_t *pointer_map_create (void); ++void pointer_map_destroy (struct pointer_map_t *pmap); ++ ++void **pointer_map_contains (struct pointer_map_t *pmap, void *p); ++void **pointer_map_insert (struct pointer_map_t *pmap, void *p); ++void pointer_map_traverse (struct pointer_map_t *, ++ bool (*) (void *, void **, void *), void *); ++ + #endif /* POINTER_SET_H */ +Index: gcc/Makefile.in +=================================================================== +--- a/gcc/Makefile.in (revision 125226) ++++ b/gcc/Makefile.in (revision 125227) +@@ -1839,7 +1839,7 @@ + tree-ssa-structalias.o: tree-ssa-structalias.c tree-ssa-structalias.h \ + $(SYSTEM_H) $(CONFIG_H) $(GGC_H) $(TREE_H) $(TREE_FLOW_H) \ + $(TM_H) coretypes.h $(CGRAPH_H) tree-pass.h $(TIMEVAR_H) \ +- gt-tree-ssa-structalias.h $(PARAMS_H) ++ gt-tree-ssa-structalias.h $(PARAMS_H) pointer-set.h + tree-ssa.o : tree-ssa.c $(TREE_FLOW_H) $(CONFIG_H) $(SYSTEM_H) \ + $(RTL_H) $(TREE_H) $(TM_P_H) $(EXPR_H) output.h $(DIAGNOSTIC_H) \ + toplev.h $(FUNCTION_H) $(TIMEVAR_H) $(TM_H) coretypes.h \ +Index: gcc/tree-ssa-structalias.c +=================================================================== +--- a/gcc/tree-ssa-structalias.c (revision 125226) ++++ b/gcc/tree-ssa-structalias.c (revision 125227) +@@ -51,10 +51,11 @@ + #include "params.h" + #include "tree-ssa-structalias.h" + #include "cgraph.h" ++#include "pointer-set.h" + + /* The idea behind this analyzer is to generate set constraints from the + program, then solve the resulting constraints in order to generate the +- points-to sets. ++ points-to sets. + + Set constraints are a way of modeling program analysis problems that + involve sets. They consist of an inclusion constraint language, +@@ -70,33 +71,33 @@ + + Also see "Ultra-fast Aliasing Analysis using CLA: A Million Lines + of C Code in a Second" by ""Nevin Heintze and Olivier Tardieu" at +- http://citeseer.ist.psu.edu/heintze01ultrafast.html ++ http://citeseer.ist.psu.edu/heintze01ultrafast.html + +- There are three types of constraint expressions, DEREF, ADDRESSOF, and +- SCALAR. Each constraint expression consists of a constraint type, +- a variable, and an offset. +- ++ There are three types of real constraint expressions, DEREF, ++ ADDRESSOF, and SCALAR. Each constraint expression consists ++ of a constraint type, a variable, and an offset. ++ + SCALAR is a constraint expression type used to represent x, whether + it appears on the LHS or the RHS of a statement. + DEREF is a constraint expression type used to represent *x, whether +- it appears on the LHS or the RHS of a statement. ++ it appears on the LHS or the RHS of a statement. + ADDRESSOF is a constraint expression used to represent &x, whether + it appears on the LHS or the RHS of a statement. +- ++ + Each pointer variable in the program is assigned an integer id, and + each field of a structure variable is assigned an integer id as well. +- ++ + Structure variables are linked to their list of fields through a "next + field" in each variable that points to the next field in offset +- order. +- Each variable for a structure field has ++ order. ++ Each variable for a structure field has + + 1. "size", that tells the size in bits of that field. + 2. "fullsize, that tells the size in bits of the entire structure. + 3. "offset", that tells the offset in bits from the beginning of the + structure to this field. + +- Thus, ++ Thus, + struct f + { + int a; +@@ -110,50 +111,51 @@ + foo.b -> id 2, size 32, offset 32, fullsize 64, next NULL + bar -> id 3, size 32, offset 0, fullsize 32, next NULL + +- ++ + In order to solve the system of set constraints, the following is + done: + + 1. Each constraint variable x has a solution set associated with it, + Sol(x). +- ++ + 2. Constraints are separated into direct, copy, and complex. + Direct constraints are ADDRESSOF constraints that require no extra + processing, such as P = &Q + Copy constraints are those of the form P = Q. +- Complex constraints are all the constraints involving dereferences. +- ++ Complex constraints are all the constraints involving dereferences ++ and offsets (including offsetted copies). ++ + 3. All direct constraints of the form P = &Q are processed, such +- that Q is added to Sol(P) ++ that Q is added to Sol(P) + + 4. All complex constraints for a given constraint variable are stored in a +- linked list attached to that variable's node. ++ linked list attached to that variable's node. + + 5. A directed graph is built out of the copy constraints. Each +- constraint variable is a node in the graph, and an edge from ++ constraint variable is a node in the graph, and an edge from + Q to P is added for each copy constraint of the form P = Q +- ++ + 6. The graph is then walked, and solution sets are + propagated along the copy edges, such that an edge from Q to P + causes Sol(P) <- Sol(P) union Sol(Q). +- ++ + 7. As we visit each node, all complex constraints associated with + that node are processed by adding appropriate copy edges to the graph, or the +- appropriate variables to the solution set. ++ appropriate variables to the solution set. + + 8. The process of walking the graph is iterated until no solution + sets change. + + Prior to walking the graph in steps 6 and 7, We perform static +- cycle elimination on the constraint graph, as well ++ cycle elimination on the constraint graph, as well + as off-line variable substitution. +- ++ + TODO: Adding offsets to pointer-to-structures can be handled (IE not punted + on and turned into anything), but isn't. You can just see what offset + inside the pointed-to struct it's going to access. +- ++ + TODO: Constant bounded arrays can be handled as if they were structs of the +- same number of elements. ++ same number of elements. + + TODO: Modeling heap and incoming pointers becomes much better if we + add fields to them as we discover them, which we could do. +@@ -161,20 +163,29 @@ + TODO: We could handle unions, but to be honest, it's probably not + worth the pain or slowdown. */ + +-static GTY ((if_marked ("tree_map_marked_p"), param_is (struct tree_map))) +-htab_t heapvar_for_stmt; ++static GTY ((if_marked ("tree_map_marked_p"), param_is (struct tree_map))) htab_t heapvar_for_stmt; + + /* One variable to represent all non-local accesses. */ + tree nonlocal_all; + + static bool use_field_sensitive = true; + static int in_ipa_mode = 0; ++ ++/* Used for predecessor bitmaps. */ + static bitmap_obstack predbitmap_obstack; +-static bitmap_obstack ptabitmap_obstack; ++ ++/* Used for points-to sets. */ ++static bitmap_obstack pta_obstack; ++ ++/* Used for oldsolution members of variables. */ ++static bitmap_obstack oldpta_obstack; ++ ++/* Used for per-solver-iteration bitmaps. */ + static bitmap_obstack iteration_obstack; + + static unsigned int create_variable_info_for (tree, const char *); +-static void build_constraint_graph (void); ++typedef struct constraint_graph *constraint_graph_t; ++static void unify_nodes (constraint_graph_t, unsigned int, unsigned int, bool); + + DEF_VEC_P(constraint_t); + DEF_VEC_ALLOC_P(constraint_t,heap); +@@ -186,11 +197,13 @@ + static struct constraint_stats + { + unsigned int total_vars; +- unsigned int collapsed_vars; ++ unsigned int nonpointer_vars; + unsigned int unified_vars_static; + unsigned int unified_vars_dynamic; + unsigned int iterations; + unsigned int num_edges; ++ unsigned int num_implicit_edges; ++ unsigned int points_to_sets_created; + } stats; + + struct variable_info +@@ -205,7 +218,7 @@ + tree decl; + + /* Offset of this variable, in bits, from the base variable */ +- unsigned HOST_WIDE_INT offset; ++ unsigned HOST_WIDE_INT offset; + + /* Size of the variable, in bits. */ + unsigned HOST_WIDE_INT size; +@@ -216,34 +229,21 @@ + /* A link to the variable for the next field in this structure. */ + struct variable_info *next; + +- /* Node in the graph that represents the constraints and points-to +- solution for the variable. */ +- unsigned int node; +- +- /* True if the address of this variable is taken. Needed for +- variable substitution. */ +- unsigned int address_taken:1; +- +- /* True if this variable is the target of a dereference. Needed for +- variable substitution. */ +- unsigned int indirect_target:1; +- + /* True if the variable is directly the target of a dereference. + This is used to track which variables are *actually* dereferenced +- so we can prune their points to listed. This is equivalent to the +- indirect_target flag when no merging of variables happens. */ ++ so we can prune their points to listed. */ + unsigned int directly_dereferenced:1; + + /* True if this is a variable created by the constraint analysis, such as + heap variables and constraints we had to break up. */ + unsigned int is_artificial_var:1; +- ++ + /* True if this is a special variable whose solution set should not be + changed. */ + unsigned int is_special_var:1; + + /* True for variables whose size is not known or variable. */ +- unsigned int is_unknown_size_var:1; ++ unsigned int is_unknown_size_var:1; + + /* True for variables that have unions somewhere in them. */ + unsigned int has_union:1; +@@ -254,16 +254,15 @@ + /* Points-to set for this variable. */ + bitmap solution; + ++ /* Old points-to set for this variable. */ ++ bitmap oldsolution; ++ + /* Variable ids represented by this node. */ + bitmap variables; + +- /* Vector of complex constraints for this node. Complex +- constraints are those involving dereferences. */ +- VEC(constraint_t,heap) *complex; +- +- /* Variable id this was collapsed to due to type unsafety. +- This should be unused completely after build_constraint_graph, or +- something is broken. */ ++ /* Variable id this was collapsed to due to type unsafety. This ++ should be unused completely after build_succ_graph, or something ++ is broken. */ + struct variable_info *collapsed_to; + }; + typedef struct variable_info *varinfo_t; +@@ -277,8 +276,8 @@ + + DEF_VEC_ALLOC_P(varinfo_t, heap); + +-/* Table of variable info structures for constraint variables. Indexed directly +- by variable info id. */ ++/* Table of variable info structures for constraint variables. ++ Indexed directly by variable info id. */ + static VEC(varinfo_t,heap) *varmap; + + /* Return the varmap element N */ +@@ -286,7 +285,7 @@ + static inline varinfo_t + get_varinfo (unsigned int n) + { +- return VEC_index(varinfo_t, varmap, n); ++ return VEC_index (varinfo_t, varmap, n); + } + + /* Return the varmap element N, following the collapsed_to link. */ +@@ -294,7 +293,7 @@ + static inline varinfo_t + get_varinfo_fc (unsigned int n) + { +- varinfo_t v = VEC_index(varinfo_t, varmap, n); ++ varinfo_t v = VEC_index (varinfo_t, varmap, n); + + if (v->collapsed_to) + return v->collapsed_to; +@@ -331,10 +330,9 @@ + /* Variable that represents non-local variables before we expand it to + one for each type. */ + static unsigned int nonlocal_vars_id; +- + /* Lookup a heap var for FROM, and return it if we find one. */ + +-static tree ++static tree + heapvar_lookup (tree from) + { + struct tree_map *h, in; +@@ -367,25 +365,21 @@ + named NAME, and using constraint graph node NODE. */ + + static varinfo_t +-new_var_info (tree t, unsigned int id, const char *name, unsigned int node) ++new_var_info (tree t, unsigned int id, const char *name) + { + varinfo_t ret = pool_alloc (variable_info_pool); + + ret->id = id; + ret->name = name; + ret->decl = t; +- ret->node = node; +- ret->address_taken = false; +- ret->indirect_target = false; + ret->directly_dereferenced = false; + ret->is_artificial_var = false; + ret->is_heap_var = false; + ret->is_special_var = false; + ret->is_unknown_size_var = false; + ret->has_union = false; +- ret->solution = BITMAP_ALLOC (&ptabitmap_obstack); +- ret->variables = BITMAP_ALLOC (&ptabitmap_obstack); +- ret->complex = NULL; ++ ret->solution = BITMAP_ALLOC (&pta_obstack); ++ ret->oldsolution = BITMAP_ALLOC (&oldpta_obstack); + ret->next = NULL; + ret->collapsed_to = NULL; + return ret; +@@ -395,7 +389,7 @@ + + /* An expression that appears in a constraint. */ + +-struct constraint_expr ++struct constraint_expr + { + /* Constraint type. */ + constraint_expr_type type; +@@ -418,7 +412,7 @@ + static void do_deref (VEC (ce_s, heap) **); + + /* Our set constraints are made up of two constraint expressions, one +- LHS, and one RHS. ++ LHS, and one RHS. + + As described in the introduction, our set constraints each represent an + operation between set valued variables. +@@ -434,63 +428,98 @@ + static VEC(constraint_t,heap) *constraints; + static alloc_pool constraint_pool; + +-/* An edge in the weighted constraint graph. The edges are weighted, +- with a bit set in weights meaning their is an edge with that +- weight. +- We don't keep the src in the edge, because we always know what it +- is. */ + +-struct constraint_edge ++DEF_VEC_I(int); ++DEF_VEC_ALLOC_I(int, heap); ++ ++/* The constraint graph is represented as an array of bitmaps ++ containing successor nodes. */ ++ ++struct constraint_graph + { +- unsigned int dest; +- bitmap weights; +-}; ++ /* Size of this graph, which may be different than the number of ++ nodes in the variable map. */ ++ unsigned int size; + +-typedef struct constraint_edge *constraint_edge_t; +-static alloc_pool constraint_edge_pool; ++ /* Explicit successors of each node. */ ++ bitmap *succs; + +-/* Return a new constraint edge from SRC to DEST. */ ++ /* Implicit predecessors of each node (Used for variable ++ substitution). */ ++ bitmap *implicit_preds; + +-static constraint_edge_t +-new_constraint_edge (unsigned int dest) +-{ +- constraint_edge_t ret = pool_alloc (constraint_edge_pool); +- ret->dest = dest; +- ret->weights = NULL; +- return ret; +-} ++ /* Explicit predecessors of each node (Used for variable substitution). */ ++ bitmap *preds; + +-DEF_VEC_P(constraint_edge_t); +-DEF_VEC_ALLOC_P(constraint_edge_t,heap); ++ /* Indirect cycle representatives, or -1 if the node has no indirect ++ cycles. */ ++ int *indirect_cycles; + ++ /* Representative node for a node. rep[a] == a unless the node has ++ been unified. */ ++ unsigned int *rep; + +-/* The constraint graph is represented internally in two different +- ways. The overwhelming majority of edges in the constraint graph +- are zero weigh edges, and thus, using a vector of contrainst_edge_t +- is a waste of time and memory, since they have no weights. We +- simply use a bitmap to store the preds and succs for each node. +- The weighted edges are stored as a set of adjacency vectors, one +- per variable. succs[x] is the vector of successors for variable x, +- and preds[x] is the vector of predecessors for variable x. IOW, +- all edges are "forward" edges, which is not like our CFG. So +- remember that preds[x]->src == x, and succs[x]->src == x. */ ++ /* Equivalence class representative for a node. This is used for ++ variable substitution. */ ++ int *eq_rep; + +-struct constraint_graph +-{ +- bitmap *zero_weight_succs; +- bitmap *zero_weight_preds; +- VEC(constraint_edge_t,heap) **succs; +- VEC(constraint_edge_t,heap) **preds; ++ /* Label for each node, used during variable substitution. */ ++ unsigned int *label; ++ ++ /* Bitmap of nodes where the bit is set if the node is a direct ++ node. Used for variable substitution. */ ++ sbitmap direct_nodes; ++ ++ /* Vector of complex constraints for each graph node. Complex ++ constraints are those involving dereferences or offsets that are ++ not 0. */ ++ VEC(constraint_t,heap) **complex; + }; + +-typedef struct constraint_graph *constraint_graph_t; +- + static constraint_graph_t graph; +-static int graph_size; + ++/* During variable substitution and the offline version of indirect ++ cycle finding, we create nodes to represent dereferences and ++ address taken constraints. These represent where these start and ++ end. */ ++#define FIRST_REF_NODE (VEC_length (varinfo_t, varmap)) ++#define LAST_REF_NODE (FIRST_REF_NODE + (FIRST_REF_NODE - 1)) ++#define FIRST_ADDR_NODE (LAST_REF_NODE + 1) ++ ++/* Return the representative node for NODE, if NODE has been unioned ++ with another NODE. ++ This function performs path compression along the way to finding ++ the representative. */ ++ ++static unsigned int ++find (unsigned int node) ++{ ++ gcc_assert (node < graph->size); ++ if (graph->rep[node] != node) ++ return graph->rep[node] = find (graph->rep[node]); ++ return node; ++} ++ ++/* Union the TO and FROM nodes to the TO nodes. ++ Note that at some point in the future, we may want to do ++ union-by-rank, in which case we are going to have to return the ++ node we unified to. */ ++ ++static bool ++unite (unsigned int to, unsigned int from) ++{ ++ gcc_assert (to < graph->size && from < graph->size); ++ if (to != from && graph->rep[from] != to) ++ { ++ graph->rep[from] = to; ++ return true; ++ } ++ return false; ++} ++ + /* Create a new constraint consisting of LHS and RHS expressions. */ + +-static constraint_t ++static constraint_t + new_constraint (const struct constraint_expr lhs, + const struct constraint_expr rhs) + { +@@ -508,7 +537,7 @@ + if (c->lhs.type == ADDRESSOF) + fprintf (file, "&"); + else if (c->lhs.type == DEREF) +- fprintf (file, "*"); ++ fprintf (file, "*"); + fprintf (file, "%s", get_varinfo_fc (c->lhs.var)->name); + if (c->lhs.offset != 0) + fprintf (file, " + " HOST_WIDE_INT_PRINT_DEC, c->lhs.offset); +@@ -550,23 +579,24 @@ + dump_constraints (stderr); + } + +-/* SOLVER FUNCTIONS ++/* SOLVER FUNCTIONS + + The solver is a simple worklist solver, that works on the following + algorithm: +- +- sbitmap changed_nodes = all ones; +- changed_count = number of nodes; +- For each node that was already collapsed: +- changed_count--; + ++ sbitmap changed_nodes = all zeroes; ++ changed_count = 0; ++ For each node that is not already collapsed: ++ changed_count++; ++ set bit in changed nodes ++ + while (changed_count > 0) + { + compute topological ordering for constraint graph +- ++ + find and collapse cycles in the constraint graph (updating + changed if necessary) +- ++ + for each node (n) in the graph in topological order: + changed_count--; + +@@ -619,11 +649,11 @@ + } + + /* Return true if two constraints A and B are equal. */ +- ++ + static bool + constraint_equal (struct constraint a, struct constraint b) + { +- return constraint_expr_equal (a.lhs, b.lhs) ++ return constraint_expr_equal (a.lhs, b.lhs) + && constraint_expr_equal (a.rhs, b.rhs); + } + +@@ -634,7 +664,7 @@ + constraint_vec_find (VEC(constraint_t,heap) *vec, + struct constraint lookfor) + { +- unsigned int place; ++ unsigned int place; + constraint_t found; + + if (vec == NULL) +@@ -684,7 +714,7 @@ + /* If this is a properly sized variable, only add offset if it's + less than end. Otherwise, it is globbed to a single + variable. */ +- ++ + if ((get_varinfo (i)->offset + offset) < get_varinfo (i)->fullsize) + { + unsigned HOST_WIDE_INT fieldoffset = get_varinfo (i)->offset + offset; +@@ -693,15 +723,15 @@ + continue; + bitmap_set_bit (result, v->id); + } +- else if (get_varinfo (i)->is_artificial_var ++ else if (get_varinfo (i)->is_artificial_var + || get_varinfo (i)->has_union + || get_varinfo (i)->is_unknown_size_var) + { + bitmap_set_bit (result, i); + } + } +- +- bitmap_copy (set, result); ++ ++ bitmap_copy (set, result); + BITMAP_FREE (result); + } + +@@ -727,397 +757,149 @@ + } + } + +-/* Insert constraint C into the list of complex constraints for VAR. */ ++/* Insert constraint C into the list of complex constraints for graph ++ node VAR. */ + + static void +-insert_into_complex (unsigned int var, constraint_t c) ++insert_into_complex (constraint_graph_t graph, ++ unsigned int var, constraint_t c) + { +- varinfo_t vi = get_varinfo (var); +- unsigned int place = VEC_lower_bound (constraint_t, vi->complex, c, ++ VEC (constraint_t, heap) *complex = graph->complex[var]; ++ unsigned int place = VEC_lower_bound (constraint_t, complex, c, + constraint_less); +- VEC_safe_insert (constraint_t, heap, vi->complex, place, c); +-} + +- +-/* Compare two constraint edges A and B, return true if they are equal. */ +- +-static bool +-constraint_edge_equal (struct constraint_edge a, struct constraint_edge b) +-{ +- return a.dest == b.dest; ++ /* Only insert constraints that do not already exist. */ ++ if (place >= VEC_length (constraint_t, complex) ++ || !constraint_equal (*c, *VEC_index (constraint_t, complex, place))) ++ VEC_safe_insert (constraint_t, heap, graph->complex[var], place, c); + } + +-/* Compare two constraint edges, return true if A is less than B */ + +-static bool +-constraint_edge_less (const constraint_edge_t a, const constraint_edge_t b) +-{ +- if (a->dest < b->dest) +- return true; +- return false; +-} +- +-/* Find the constraint edge that matches LOOKFOR, in VEC. +- Return the edge, if found, NULL otherwise. */ +- +-static constraint_edge_t +-constraint_edge_vec_find (VEC(constraint_edge_t,heap) *vec, +- struct constraint_edge lookfor) +-{ +- unsigned int place; +- constraint_edge_t edge = NULL; +- +- place = VEC_lower_bound (constraint_edge_t, vec, &lookfor, +- constraint_edge_less); +- if (place >= VEC_length (constraint_edge_t, vec)) +- return NULL; +- edge = VEC_index (constraint_edge_t, vec, place); +- if (!constraint_edge_equal (*edge, lookfor)) +- return NULL; +- return edge; +-} +- + /* Condense two variable nodes into a single variable node, by moving + all associated info from SRC to TO. */ + +-static void +-condense_varmap_nodes (unsigned int to, unsigned int src) ++static void ++merge_node_constraints (constraint_graph_t graph, unsigned int to, ++ unsigned int from) + { +- varinfo_t tovi = get_varinfo (to); +- varinfo_t srcvi = get_varinfo (src); + unsigned int i; + constraint_t c; +- bitmap_iterator bi; +- +- /* the src node, and all its variables, are now the to node. */ +- srcvi->node = to; +- EXECUTE_IF_SET_IN_BITMAP (srcvi->variables, 0, i, bi) +- get_varinfo (i)->node = to; +- +- /* Merge the src node variables and the to node variables. */ +- bitmap_set_bit (tovi->variables, src); +- bitmap_ior_into (tovi->variables, srcvi->variables); +- bitmap_clear (srcvi->variables); +- ++ ++ gcc_assert (find (from) == to); ++ + /* Move all complex constraints from src node into to node */ +- for (i = 0; VEC_iterate (constraint_t, srcvi->complex, i, c); i++) ++ for (i = 0; VEC_iterate (constraint_t, graph->complex[from], i, c); i++) + { + /* In complex constraints for node src, we may have either +- a = *src, and *src = a. */ +- ++ a = *src, and *src = a, or an offseted constraint which are ++ always added to the rhs node's constraints. */ ++ + if (c->rhs.type == DEREF) + c->rhs.var = to; ++ else if (c->lhs.type == DEREF) ++ c->lhs.var = to; + else +- c->lhs.var = to; ++ c->rhs.var = to; + } +- constraint_set_union (&tovi->complex, &srcvi->complex); +- VEC_free (constraint_t, heap, srcvi->complex); +- srcvi->complex = NULL; ++ constraint_set_union (&graph->complex[to], &graph->complex[from]); ++ VEC_free (constraint_t, heap, graph->complex[from]); ++ graph->complex[from] = NULL; + } + +-/* Erase an edge from SRC to SRC from GRAPH. This routine only +- handles self-edges (e.g. an edge from a to a). */ + +-static void +-erase_graph_self_edge (constraint_graph_t graph, unsigned int src) +-{ +- VEC(constraint_edge_t,heap) *predvec = graph->preds[src]; +- VEC(constraint_edge_t,heap) *succvec = graph->succs[src]; +- struct constraint_edge edge; +- unsigned int place; +- +- edge.dest = src; +- +- /* Remove from the successors. */ +- place = VEC_lower_bound (constraint_edge_t, succvec, &edge, +- constraint_edge_less); +- +- /* Make sure we found the edge. */ +-#ifdef ENABLE_CHECKING +- { +- constraint_edge_t tmp = VEC_index (constraint_edge_t, succvec, place); +- gcc_assert (constraint_edge_equal (*tmp, edge)); +- } +-#endif +- VEC_ordered_remove (constraint_edge_t, succvec, place); +- +- /* Remove from the predecessors. */ +- place = VEC_lower_bound (constraint_edge_t, predvec, &edge, +- constraint_edge_less); +- +- /* Make sure we found the edge. */ +-#ifdef ENABLE_CHECKING +- { +- constraint_edge_t tmp = VEC_index (constraint_edge_t, predvec, place); +- gcc_assert (constraint_edge_equal (*tmp, edge)); +- } +-#endif +- VEC_ordered_remove (constraint_edge_t, predvec, place); +-} +- + /* Remove edges involving NODE from GRAPH. */ + + static void + clear_edges_for_node (constraint_graph_t graph, unsigned int node) + { +- VEC(constraint_edge_t,heap) *succvec = graph->succs[node]; +- VEC(constraint_edge_t,heap) *predvec = graph->preds[node]; +- bitmap_iterator bi; +- unsigned int j; +- constraint_edge_t c = NULL; +- int i; +- +- /* Walk the successors, erase the associated preds. */ +- +- EXECUTE_IF_IN_NONNULL_BITMAP (graph->zero_weight_succs[node], 0, j, bi) +- if (j != node) +- bitmap_clear_bit (graph->zero_weight_preds[j], node); +- +- for (i = 0; VEC_iterate (constraint_edge_t, succvec, i, c); i++) +- if (c->dest != node) +- { +- unsigned int place; +- struct constraint_edge lookfor; +- constraint_edge_t result; +- +- lookfor.dest = node; +- place = VEC_lower_bound (constraint_edge_t, graph->preds[c->dest], +- &lookfor, constraint_edge_less); +- result = VEC_ordered_remove (constraint_edge_t, +- graph->preds[c->dest], place); +- pool_free (constraint_edge_pool, result); +- } +- +- /* Walk the preds, erase the associated succs. */ +- +- EXECUTE_IF_IN_NONNULL_BITMAP (graph->zero_weight_preds[node], 0, j, bi) +- if (j != node) +- bitmap_clear_bit (graph->zero_weight_succs[j], node); +- +- for (i =0; VEC_iterate (constraint_edge_t, predvec, i, c); i++) +- if (c->dest != node) +- { +- unsigned int place; +- struct constraint_edge lookfor; +- constraint_edge_t result; +- +- lookfor.dest = node; +- place = VEC_lower_bound (constraint_edge_t, graph->succs[c->dest], +- &lookfor, constraint_edge_less); +- result = VEC_ordered_remove (constraint_edge_t, +- graph->succs[c->dest], place); +- pool_free (constraint_edge_pool, result); +- +- } +- +- if (graph->zero_weight_preds[node]) +- { +- BITMAP_FREE (graph->zero_weight_preds[node]); +- graph->zero_weight_preds[node] = NULL; +- } +- +- if (graph->zero_weight_succs[node]) +- { +- BITMAP_FREE (graph->zero_weight_succs[node]); +- graph->zero_weight_succs[node] = NULL; +- } +- +- VEC_free (constraint_edge_t, heap, graph->preds[node]); +- VEC_free (constraint_edge_t, heap, graph->succs[node]); +- graph->preds[node] = NULL; +- graph->succs[node] = NULL; ++ if (graph->succs[node]) ++ BITMAP_FREE (graph->succs[node]); + } + +-static bool edge_added = false; +- +-/* Add edge (src, dest) to the graph. */ +- +-static bool +-add_graph_edge (constraint_graph_t graph, unsigned int src, unsigned int dest) +-{ +- unsigned int place; +- VEC(constraint_edge_t,heap) *vec; +- struct constraint_edge newe; +- newe.dest = dest; +- +- vec = graph->preds[src]; +- place = VEC_lower_bound (constraint_edge_t, vec, &newe, +- constraint_edge_less); +- if (place == VEC_length (constraint_edge_t, vec) +- || VEC_index (constraint_edge_t, vec, place)->dest != dest) +- { +- constraint_edge_t edge = new_constraint_edge (dest); +- +- VEC_safe_insert (constraint_edge_t, heap, graph->preds[src], +- place, edge); +- edge = new_constraint_edge (src); +- +- place = VEC_lower_bound (constraint_edge_t, graph->succs[dest], +- edge, constraint_edge_less); +- VEC_safe_insert (constraint_edge_t, heap, graph->succs[dest], +- place, edge); +- edge_added = true; +- stats.num_edges++; +- return true; +- } +- else +- return false; +-} +- +- +-/* Return the bitmap representing the weights of edge (SRC, DEST). */ +- +-static bitmap * +-get_graph_weights (constraint_graph_t graph, unsigned int src, +- unsigned int dest) +-{ +- constraint_edge_t edge; +- VEC(constraint_edge_t,heap) *vec; +- struct constraint_edge lookfor; +- +- lookfor.dest = dest; +- +- vec = graph->preds[src]; +- edge = constraint_edge_vec_find (vec, lookfor); +- gcc_assert (edge != NULL); +- return &edge->weights; +-} +- +-/* Allocate graph weight bitmap for the edges associated with SRC and +- DEST in GRAPH. Both the pred and the succ edges share a single +- bitmap, so we need to set both edges to that bitmap. */ +- +-static bitmap +-allocate_graph_weights (constraint_graph_t graph, unsigned int src, +- unsigned int dest) +-{ +- bitmap result; +- constraint_edge_t edge; +- VEC(constraint_edge_t,heap) *vec; +- struct constraint_edge lookfor; +- +- result = BITMAP_ALLOC (&ptabitmap_obstack); +- +- /* Set the pred weight. */ +- lookfor.dest = dest; +- vec = graph->preds[src]; +- edge = constraint_edge_vec_find (vec, lookfor); +- gcc_assert (edge != NULL); +- edge->weights = result; +- +- /* Set the succ weight. */ +- lookfor.dest = src; +- vec = graph->succs[dest]; +- edge = constraint_edge_vec_find (vec, lookfor); +- gcc_assert (edge != NULL); +- edge->weights = result; +- +- return result; +-} +- +- + /* Merge GRAPH nodes FROM and TO into node TO. */ + + static void +-merge_graph_nodes (constraint_graph_t graph, unsigned int to, ++merge_graph_nodes (constraint_graph_t graph, unsigned int to, + unsigned int from) + { +- VEC(constraint_edge_t,heap) *succvec = graph->succs[from]; +- VEC(constraint_edge_t,heap) *predvec = graph->preds[from]; +- int i; +- constraint_edge_t c; +- unsigned int j; +- bitmap_iterator bi; +- +- /* Merge all the zero weighted predecessor edges. */ +- if (graph->zero_weight_preds[from]) ++ if (graph->indirect_cycles[from] != -1) + { +- if (!graph->zero_weight_preds[to]) +- graph->zero_weight_preds[to] = BITMAP_ALLOC (&predbitmap_obstack); +- +- EXECUTE_IF_SET_IN_BITMAP (graph->zero_weight_preds[from], 0, j, bi) ++ /* If we have indirect cycles with the from node, and we have ++ none on the to node, the to node has indirect cycles from the ++ from node now that they are unified. ++ If indirect cycles exist on both, unify the nodes that they ++ are in a cycle with, since we know they are in a cycle with ++ each other. */ ++ if (graph->indirect_cycles[to] == -1) + { +- if (j != to) +- { +- bitmap_clear_bit (graph->zero_weight_succs[j], from); +- bitmap_set_bit (graph->zero_weight_succs[j], to); +- } ++ graph->indirect_cycles[to] = graph->indirect_cycles[from]; + } +- bitmap_ior_into (graph->zero_weight_preds[to], +- graph->zero_weight_preds[from]); +- } ++ else ++ { ++ unsigned int tonode = find (graph->indirect_cycles[to]); ++ unsigned int fromnode = find (graph->indirect_cycles[from]); + +- /* Merge all the zero weighted successor edges. */ +- if (graph->zero_weight_succs[from]) +- { +- if (!graph->zero_weight_succs[to]) +- graph->zero_weight_succs[to] = BITMAP_ALLOC (&ptabitmap_obstack); +- EXECUTE_IF_SET_IN_BITMAP (graph->zero_weight_succs[from], 0, j, bi) +- { +- bitmap_clear_bit (graph->zero_weight_preds[j], from); +- bitmap_set_bit (graph->zero_weight_preds[j], to); ++ if (unite (tonode, fromnode)) ++ unify_nodes (graph, tonode, fromnode, true); + } +- bitmap_ior_into (graph->zero_weight_succs[to], +- graph->zero_weight_succs[from]); + } + +- /* Merge all the nonzero weighted predecessor edges. */ +- for (i = 0; VEC_iterate (constraint_edge_t, predvec, i, c); i++) ++ /* Merge all the successor edges. */ ++ if (graph->succs[from]) + { +- unsigned int d = c->dest; +- bitmap temp; +- bitmap *weights; ++ if (!graph->succs[to]) ++ graph->succs[to] = BITMAP_ALLOC (&pta_obstack); ++ bitmap_ior_into (graph->succs[to], ++ graph->succs[from]); ++ } + +- if (c->dest == from) +- d = to; ++ clear_edges_for_node (graph, from); ++} + +- add_graph_edge (graph, to, d); + +- temp = *(get_graph_weights (graph, from, c->dest)); +- if (temp) +- { +- weights = get_graph_weights (graph, to, d); +- if (!*weights) +- *weights = allocate_graph_weights (graph, to, d); +- +- bitmap_ior_into (*weights, temp); +- } +- +- } +- +- /* Merge all the nonzero weighted successor edges. */ +- for (i = 0; VEC_iterate (constraint_edge_t, succvec, i, c); i++) +- { +- unsigned int d = c->dest; +- bitmap temp; +- bitmap *weights; ++/* Add an indirect graph edge to GRAPH, going from TO to FROM if ++ it doesn't exist in the graph already. */ + +- if (c->dest == from) +- d = to; ++static void ++add_implicit_graph_edge (constraint_graph_t graph, unsigned int to, ++ unsigned int from) ++{ ++ if (to == from) ++ return; + +- add_graph_edge (graph, d, to); ++ if (!graph->implicit_preds[to]) ++ graph->implicit_preds[to] = BITMAP_ALLOC (&predbitmap_obstack); + +- temp = *(get_graph_weights (graph, c->dest, from)); +- if (temp) +- { +- weights = get_graph_weights (graph, d, to); +- if (!*weights) +- *weights = allocate_graph_weights (graph, d, to); +- bitmap_ior_into (*weights, temp); +- } ++ if (!bitmap_bit_p (graph->implicit_preds[to], from)) ++ { ++ stats.num_implicit_edges++; ++ bitmap_set_bit (graph->implicit_preds[to], from); + } +- clear_edges_for_node (graph, from); + } + +-/* Add a graph edge to GRAPH, going from TO to FROM, with WEIGHT, if ++/* Add a predecessor graph edge to GRAPH, going from TO to FROM if + it doesn't exist in the graph already. + Return false if the edge already existed, true otherwise. */ + ++static void ++add_pred_graph_edge (constraint_graph_t graph, unsigned int to, ++ unsigned int from) ++{ ++ if (!graph->preds[to]) ++ graph->preds[to] = BITMAP_ALLOC (&predbitmap_obstack); ++ if (!bitmap_bit_p (graph->preds[to], from)) ++ bitmap_set_bit (graph->preds[to], from); ++} ++ ++/* Add a graph edge to GRAPH, going from FROM to TO if ++ it doesn't exist in the graph already. ++ Return false if the edge already existed, true otherwise. */ ++ + static bool +-int_add_graph_edge (constraint_graph_t graph, unsigned int to, +- unsigned int from, unsigned HOST_WIDE_INT weight) ++add_graph_edge (constraint_graph_t graph, unsigned int to, ++ unsigned int from) + { +- if (to == from && weight == 0) ++ if (to == from) + { + return false; + } +@@ -1125,41 +907,15 @@ + { + bool r = false; + +- if (weight == 0) ++ if (!graph->succs[from]) ++ graph->succs[from] = BITMAP_ALLOC (&pta_obstack); ++ if (!bitmap_bit_p (graph->succs[from], to)) + { +- if (!graph->zero_weight_preds[to]) +- graph->zero_weight_preds[to] = BITMAP_ALLOC (&predbitmap_obstack); +- if (!graph->zero_weight_succs[from]) +- graph->zero_weight_succs[from] = BITMAP_ALLOC (&ptabitmap_obstack); +- if (!bitmap_bit_p (graph->zero_weight_succs[from], to)) +- { +- edge_added = true; +- r = true; +- stats.num_edges++; +- bitmap_set_bit (graph->zero_weight_preds[to], from); +- bitmap_set_bit (graph->zero_weight_succs[from], to); +- } ++ r = true; ++ if (to < FIRST_REF_NODE && from < FIRST_REF_NODE) ++ stats.num_edges++; ++ bitmap_set_bit (graph->succs[from], to); + } +- else +- { +- bitmap *weights; +- +- r = add_graph_edge (graph, to, from); +- weights = get_graph_weights (graph, to, from); +- +- if (!*weights) +- { +- r = true; +- *weights = allocate_graph_weights (graph, to, from); +- bitmap_set_bit (*weights, weight); +- } +- else +- { +- r |= !bitmap_bit_p (*weights, weight); +- bitmap_set_bit (*weights, weight); +- } +- } +- + return r; + } + } +@@ -1168,46 +924,51 @@ + /* Return true if {DEST.SRC} is an existing graph edge in GRAPH. */ + + static bool +-valid_graph_edge (constraint_graph_t graph, unsigned int src, ++valid_graph_edge (constraint_graph_t graph, unsigned int src, + unsigned int dest) + { +- struct constraint_edge lookfor; +- lookfor.dest = src; +- +- return (graph->zero_weight_succs[dest] +- && bitmap_bit_p (graph->zero_weight_succs[dest], src)) +- || constraint_edge_vec_find (graph->succs[dest], lookfor) != NULL; ++ return (graph->succs[dest] ++ && bitmap_bit_p (graph->succs[dest], src)); + } + +-/* Return true if {DEST, SRC} is an existing weighted graph edge (IE has +- a weight other than 0) in GRAPH. */ +-static bool +-valid_weighted_graph_edge (constraint_graph_t graph, unsigned int src, +- unsigned int dest) +-{ +- struct constraint_edge lookfor; +- lookfor.dest = src; +- +- return graph->preds[src] +- && constraint_edge_vec_find (graph->succs[dest], lookfor) != NULL; +-} ++/* Build the constraint graph, adding only predecessor edges right now. */ + +- +-/* Build the constraint graph. */ +- + static void +-build_constraint_graph (void) ++build_pred_graph (void) + { +- int i = 0; ++ int i; + constraint_t c; ++ unsigned int j; + + graph = XNEW (struct constraint_graph); +- graph_size = VEC_length (varinfo_t, varmap) + 1; +- graph->succs = XCNEWVEC (VEC(constraint_edge_t,heap) *, graph_size); +- graph->preds = XCNEWVEC (VEC(constraint_edge_t,heap) *, graph_size); +- graph->zero_weight_succs = XCNEWVEC (bitmap, graph_size); +- graph->zero_weight_preds = XCNEWVEC (bitmap, graph_size); ++ graph->size = (VEC_length (varinfo_t, varmap)) * 3; ++ graph->succs = XCNEWVEC (bitmap, graph->size); ++ graph->implicit_preds = XCNEWVEC (bitmap, graph->size); ++ graph->preds = XCNEWVEC (bitmap, graph->size); ++ graph->indirect_cycles = XNEWVEC (int, VEC_length (varinfo_t, varmap)); ++ graph->label = XCNEWVEC (unsigned int, graph->size); ++ graph->rep = XNEWVEC (unsigned int, graph->size); ++ graph->eq_rep = XNEWVEC (int, graph->size); ++ graph->complex = XCNEWVEC (VEC(constraint_t, heap) *, ++ VEC_length (varinfo_t, varmap)); ++ graph->direct_nodes = sbitmap_alloc (graph->size); ++ sbitmap_zero (graph->direct_nodes); + ++ for (j = 0; j < FIRST_REF_NODE; j++) ++ { ++ if (!get_varinfo (j)->is_special_var) ++ SET_BIT (graph->direct_nodes, j); ++ } ++ ++ for (j = 0; j < graph->size; j++) ++ { ++ graph->rep[j] = j; ++ graph->eq_rep[j] = -1; ++ } ++ ++ for (j = 0; j < VEC_length (varinfo_t, varmap); j++) ++ graph->indirect_cycles[j] = -1; ++ + for (i = 0; VEC_iterate (constraint_t, constraints, i, c); i++) + { + struct constraint_expr lhs = c->lhs; +@@ -1217,31 +978,92 @@ + + if (lhs.type == DEREF) + { +- /* *x = y or *x = &y (complex) */ +- if (rhs.type == ADDRESSOF || rhsvar > anything_id) +- insert_into_complex (lhsvar, c); ++ /* *x = y. */ ++ if (rhs.offset == 0 && lhs.offset == 0 && rhs.type == SCALAR) ++ add_pred_graph_edge (graph, FIRST_REF_NODE + lhsvar, rhsvar); ++ if (rhs.type == ADDRESSOF) ++ RESET_BIT (graph->direct_nodes, rhsvar); + } + else if (rhs.type == DEREF) + { +- /* !special var= *y */ +- if (!(get_varinfo (lhsvar)->is_special_var)) +- insert_into_complex (rhsvar, c); ++ /* x = *y */ ++ if (rhs.offset == 0 && lhs.offset == 0 && lhs.type == SCALAR) ++ add_pred_graph_edge (graph, lhsvar, FIRST_REF_NODE + rhsvar); ++ else ++ RESET_BIT (graph->direct_nodes, lhsvar); + } + else if (rhs.type == ADDRESSOF) + { + /* x = &y */ ++ add_pred_graph_edge (graph, lhsvar, FIRST_ADDR_NODE + rhsvar); ++ /* Implicitly, *x = y */ ++ add_implicit_graph_edge (graph, FIRST_REF_NODE + lhsvar, rhsvar); ++ ++ RESET_BIT (graph->direct_nodes, rhsvar); ++ } ++ else if (lhsvar > anything_id ++ && lhsvar != rhsvar && lhs.offset == 0 && rhs.offset == 0) ++ { ++ /* x = y */ ++ add_pred_graph_edge (graph, lhsvar, rhsvar); ++ /* Implicitly, *x = *y */ ++ add_implicit_graph_edge (graph, FIRST_REF_NODE + lhsvar, ++ FIRST_REF_NODE + rhsvar); ++ } ++ else if (lhs.offset != 0 || rhs.offset != 0) ++ { ++ if (rhs.offset != 0) ++ RESET_BIT (graph->direct_nodes, lhs.var); ++ if (lhs.offset != 0) ++ RESET_BIT (graph->direct_nodes, rhs.var); ++ } ++ } ++} ++ ++/* Build the constraint graph, adding successor edges. */ ++ ++static void ++build_succ_graph (void) ++{ ++ int i; ++ constraint_t c; ++ ++ for (i = 0; VEC_iterate (constraint_t, constraints, i, c); i++) ++ { ++ struct constraint_expr lhs; ++ struct constraint_expr rhs; ++ unsigned int lhsvar; ++ unsigned int rhsvar; ++ ++ if (!c) ++ continue; ++ ++ lhs = c->lhs; ++ rhs = c->rhs; ++ lhsvar = find (get_varinfo_fc (lhs.var)->id); ++ rhsvar = find (get_varinfo_fc (rhs.var)->id); ++ ++ if (lhs.type == DEREF) ++ { ++ if (rhs.offset == 0 && lhs.offset == 0 && rhs.type == SCALAR) ++ add_graph_edge (graph, FIRST_REF_NODE + lhsvar, rhsvar); ++ } ++ else if (rhs.type == DEREF) ++ { ++ if (rhs.offset == 0 && lhs.offset == 0 && lhs.type == SCALAR) ++ add_graph_edge (graph, lhsvar, FIRST_REF_NODE + rhsvar); ++ } ++ else if (rhs.type == ADDRESSOF) ++ { ++ /* x = &y */ ++ gcc_assert (find (get_varinfo_fc (rhs.var)->id) ++ == get_varinfo_fc (rhs.var)->id); + bitmap_set_bit (get_varinfo (lhsvar)->solution, rhsvar); + } +- else if (lhsvar > anything_id) ++ else if (lhsvar > anything_id ++ && lhsvar != rhsvar && lhs.offset == 0 && rhs.offset == 0) + { +- /* Ignore 0 weighted self edges, as they can't possibly contribute +- anything */ +- if (lhsvar != rhsvar || rhs.offset != 0 || lhs.offset != 0) +- { +- /* x = y (simple) */ +- int_add_graph_edge (graph, lhs.var, rhs.var, rhs.offset); +- } +- ++ add_graph_edge (graph, lhsvar, rhsvar); + } + } + } +@@ -1260,20 +1082,20 @@ + struct scc_info + { + sbitmap visited; +- sbitmap in_component; ++ sbitmap roots; ++ unsigned int *dfs; ++ unsigned int *node_mapping; + int current_index; +- unsigned int *visited_index; + VEC(unsigned,heap) *scc_stack; +- VEC(unsigned,heap) *unification_queue; + }; + + + /* Recursive routine to find strongly connected components in GRAPH. + SI is the SCC info to store the information in, and N is the id of current + graph node we are processing. +- ++ + This is Tarjan's strongly connected component finding algorithm, as +- modified by Nuutila to keep only non-root nodes on the stack. ++ modified by Nuutila to keep only non-root nodes on the stack. + The algorithm can be found in "On finding the strongly connected + connected components in a directed graph" by Esko Nuutila and Eljas + Soisalon-Soininen, in Information Processing Letters volume 49, +@@ -1284,188 +1106,144 @@ + { + unsigned int i; + bitmap_iterator bi; ++ unsigned int my_dfs; + +- gcc_assert (get_varinfo (n)->node == n); + SET_BIT (si->visited, n); +- RESET_BIT (si->in_component, n); +- si->visited_index[n] = si->current_index ++; +- ++ si->dfs[n] = si->current_index ++; ++ my_dfs = si->dfs[n]; ++ + /* Visit all the successors. */ +- EXECUTE_IF_IN_NONNULL_BITMAP (graph->zero_weight_succs[n], 0, i, bi) ++ EXECUTE_IF_IN_NONNULL_BITMAP (graph->succs[n], 0, i, bi) + { +- unsigned int w = i; ++ unsigned int w; ++ ++ if (i > LAST_REF_NODE) ++ break; ++ ++ w = find (i); ++ if (TEST_BIT (si->roots, w)) ++ continue; ++ + if (!TEST_BIT (si->visited, w)) + scc_visit (graph, si, w); +- if (!TEST_BIT (si->in_component, w)) +- { +- unsigned int t = get_varinfo (w)->node; +- unsigned int nnode = get_varinfo (n)->node; +- if (si->visited_index[t] < si->visited_index[nnode]) +- get_varinfo (n)->node = t; +- } ++ { ++ unsigned int t = find (w); ++ unsigned int nnode = find (n); ++ gcc_assert (nnode == n); ++ ++ if (si->dfs[t] < si->dfs[nnode]) ++ si->dfs[n] = si->dfs[t]; ++ } + } +- ++ + /* See if any components have been identified. */ +- if (get_varinfo (n)->node == n) ++ if (si->dfs[n] == my_dfs) + { +- unsigned int t = si->visited_index[n]; +- SET_BIT (si->in_component, n); +- while (VEC_length (unsigned, si->scc_stack) != 0 +- && t < si->visited_index[VEC_last (unsigned, si->scc_stack)]) ++ if (VEC_length (unsigned, si->scc_stack) > 0 ++ && si->dfs[VEC_last (unsigned, si->scc_stack)] >= my_dfs) + { +- unsigned int w = VEC_pop (unsigned, si->scc_stack); +- get_varinfo (w)->node = n; +- SET_BIT (si->in_component, w); +- /* Mark this node for collapsing. */ +- VEC_safe_push (unsigned, heap, si->unification_queue, w); +- } +- } +- else +- VEC_safe_push (unsigned, heap, si->scc_stack, n); +-} ++ bitmap scc = BITMAP_ALLOC (NULL); ++ bool have_ref_node = n >= FIRST_REF_NODE; ++ unsigned int lowest_node; ++ bitmap_iterator bi; + ++ bitmap_set_bit (scc, n); + +-/* Collapse two variables into one variable. */ ++ while (VEC_length (unsigned, si->scc_stack) != 0 ++ && si->dfs[VEC_last (unsigned, si->scc_stack)] >= my_dfs) ++ { ++ unsigned int w = VEC_pop (unsigned, si->scc_stack); + +-static void +-collapse_nodes (constraint_graph_t graph, unsigned int to, unsigned int from) +-{ +- bitmap tosol, fromsol; ++ bitmap_set_bit (scc, w); ++ if (w >= FIRST_REF_NODE) ++ have_ref_node = true; ++ } + +- condense_varmap_nodes (to, from); +- tosol = get_varinfo (to)->solution; +- fromsol = get_varinfo (from)->solution; +- bitmap_ior_into (tosol, fromsol); +- merge_graph_nodes (graph, to, from); +- +- if (valid_graph_edge (graph, to, to)) +- { +- if (graph->zero_weight_preds[to]) +- { +- bitmap_clear_bit (graph->zero_weight_preds[to], to); +- bitmap_clear_bit (graph->zero_weight_succs[to], to); ++ lowest_node = bitmap_first_set_bit (scc); ++ gcc_assert (lowest_node < FIRST_REF_NODE); ++ EXECUTE_IF_SET_IN_BITMAP (scc, 0, i, bi) ++ { ++ if (i < FIRST_REF_NODE) ++ { ++ /* Mark this node for collapsing. */ ++ if (unite (lowest_node, i)) ++ unify_nodes (graph, lowest_node, i, false); ++ } ++ else ++ { ++ unite (lowest_node, i); ++ graph->indirect_cycles[i - FIRST_REF_NODE] = lowest_node; ++ } ++ } + } +- if (valid_weighted_graph_edge (graph, to, to)) +- { +- bitmap weights = *(get_graph_weights (graph, to, to)); +- if (!weights || bitmap_empty_p (weights)) +- erase_graph_self_edge (graph, to); +- } ++ SET_BIT (si->roots, n); + } +- BITMAP_FREE (fromsol); +- get_varinfo (to)->address_taken |= get_varinfo (from)->address_taken; +- get_varinfo (to)->indirect_target |= get_varinfo (from)->indirect_target; ++ else ++ VEC_safe_push (unsigned, heap, si->scc_stack, n); + } + ++/* Unify node FROM into node TO, updating the changed count if ++ necessary when UPDATE_CHANGED is true. */ + +-/* Unify nodes in GRAPH that we have found to be part of a cycle. +- SI is the Strongly Connected Components information structure that tells us +- what components to unify. +- UPDATE_CHANGED should be set to true if the changed sbitmap and changed +- count should be updated to reflect the unification. */ +- + static void +-process_unification_queue (constraint_graph_t graph, struct scc_info *si, +- bool update_changed) ++unify_nodes (constraint_graph_t graph, unsigned int to, unsigned int from, ++ bool update_changed) + { +- size_t i = 0; +- bitmap tmp = BITMAP_ALLOC (update_changed ? &iteration_obstack : NULL); +- bitmap_clear (tmp); + +- /* We proceed as follows: ++ gcc_assert (to != from && find (to) == to); ++ if (dump_file && (dump_flags & TDF_DETAILS)) ++ fprintf (dump_file, "Unifying %s to %s\n", ++ get_varinfo (from)->name, ++ get_varinfo (to)->name); + +- For each component in the queue (components are delineated by +- when current_queue_element->node != next_queue_element->node): ++ if (update_changed) ++ stats.unified_vars_dynamic++; ++ else ++ stats.unified_vars_static++; + +- rep = representative node for component ++ merge_graph_nodes (graph, to, from); ++ merge_node_constraints (graph, to, from); + +- For each node (tounify) to be unified in the component, +- merge the solution for tounify into tmp bitmap +- +- clear solution for tounify +- +- merge edges from tounify into rep +- +- merge complex constraints from tounify into rep +- +- update changed count to note that tounify will never change +- again +- +- Merge tmp into solution for rep, marking rep changed if this +- changed rep's solution. +- +- Delete any 0 weighted self-edges we now have for rep. */ +- while (i != VEC_length (unsigned, si->unification_queue)) ++ if (update_changed && TEST_BIT (changed, from)) + { +- unsigned int tounify = VEC_index (unsigned, si->unification_queue, i); +- unsigned int n = get_varinfo (tounify)->node; +- +- if (dump_file && (dump_flags & TDF_DETAILS)) +- fprintf (dump_file, "Unifying %s to %s\n", +- get_varinfo (tounify)->name, +- get_varinfo (n)->name); +- if (update_changed) +- stats.unified_vars_dynamic++; ++ RESET_BIT (changed, from); ++ if (!TEST_BIT (changed, to)) ++ SET_BIT (changed, to); + else +- stats.unified_vars_static++; +- bitmap_ior_into (tmp, get_varinfo (tounify)->solution); +- merge_graph_nodes (graph, n, tounify); +- condense_varmap_nodes (n, tounify); +- +- if (update_changed && TEST_BIT (changed, tounify)) + { +- RESET_BIT (changed, tounify); +- if (!TEST_BIT (changed, n)) +- SET_BIT (changed, n); +- else +- { +- gcc_assert (changed_count > 0); +- changed_count--; +- } ++ gcc_assert (changed_count > 0); ++ changed_count--; + } ++ } + +- bitmap_clear (get_varinfo (tounify)->solution); +- ++i; +- +- /* If we've either finished processing the entire queue, or +- finished processing all nodes for component n, update the solution for +- n. */ +- if (i == VEC_length (unsigned, si->unification_queue) +- || get_varinfo (VEC_index (unsigned, si->unification_queue, i))->node != n) ++ /* If the solution changes because of the merging, we need to mark ++ the variable as changed. */ ++ if (bitmap_ior_into (get_varinfo (to)->solution, ++ get_varinfo (from)->solution)) ++ { ++ if (update_changed && !TEST_BIT (changed, to)) + { +- /* If the solution changes because of the merging, we need to mark +- the variable as changed. */ +- if (bitmap_ior_into (get_varinfo (n)->solution, tmp)) +- { +- if (update_changed && !TEST_BIT (changed, n)) +- { +- SET_BIT (changed, n); +- changed_count++; +- } +- } +- bitmap_clear (tmp); +- +- if (valid_graph_edge (graph, n, n)) +- { +- if (graph->zero_weight_succs[n]) +- { +- if (graph->zero_weight_preds[n]) +- bitmap_clear_bit (graph->zero_weight_preds[n], n); +- bitmap_clear_bit (graph->zero_weight_succs[n], n); +- } +- if (valid_weighted_graph_edge (graph, n, n)) +- { +- bitmap weights = *(get_graph_weights (graph, n, n)); +- if (!weights || bitmap_empty_p (weights)) +- erase_graph_self_edge (graph, n); +- } +- } ++ SET_BIT (changed, to); ++ changed_count++; + } + } +- BITMAP_FREE (tmp); ++ ++ BITMAP_FREE (get_varinfo (from)->solution); ++ BITMAP_FREE (get_varinfo (from)->oldsolution); ++ ++ if (stats.iterations > 0) ++ { ++ BITMAP_FREE (get_varinfo (to)->oldsolution); ++ get_varinfo (to)->oldsolution = BITMAP_ALLOC (&oldpta_obstack); ++ } ++ ++ if (valid_graph_edge (graph, to, to)) ++ { ++ if (graph->succs[to]) ++ bitmap_clear_bit (graph->succs[to], to); ++ } + } + +- + /* Information needed to compute the topological ordering of a graph. */ + + struct topo_info +@@ -1509,37 +1287,24 @@ + topo_visit (constraint_graph_t graph, struct topo_info *ti, + unsigned int n) + { +- VEC(constraint_edge_t,heap) *succs = graph->succs[n]; +- bitmap temp; + bitmap_iterator bi; +- constraint_edge_t c; +- int i; + unsigned int j; + + SET_BIT (ti->visited, n); +- if (VEC_length (constraint_edge_t, succs) != 0) +- { +- temp = BITMAP_ALLOC (&iteration_obstack); +- if (graph->zero_weight_succs[n]) +- bitmap_ior_into (temp, graph->zero_weight_succs[n]); +- for (i = 0; VEC_iterate (constraint_edge_t, succs, i, c); i++) +- bitmap_set_bit (temp, c->dest); +- } +- else +- temp = graph->zero_weight_succs[n]; + +- if (temp) +- EXECUTE_IF_SET_IN_BITMAP (temp, 0, j, bi) ++ if (graph->succs[n]) ++ EXECUTE_IF_SET_IN_BITMAP (graph->succs[n], 0, j, bi) + { + if (!TEST_BIT (ti->visited, j)) + topo_visit (graph, ti, j); + } ++ + VEC_safe_push (unsigned, heap, ti->topo_order, n); + } + + /* Return true if variable N + OFFSET is a legal field of N. */ + +-static bool ++static bool + type_safe (unsigned int n, unsigned HOST_WIDE_INT *offset) + { + varinfo_t ninfo = get_varinfo (n); +@@ -1582,10 +1347,10 @@ + v = first_vi_for_offset (get_varinfo (j), fieldoffset); + if (!v) + continue; +- t = v->node; ++ t = find (v->id); + sol = get_varinfo (t)->solution; + if (!bitmap_bit_p (sol, rhs)) +- { ++ { + bitmap_set_bit (sol, rhs); + if (!TEST_BIT (changed, t)) + { +@@ -1596,7 +1361,7 @@ + } + else if (0 && dump_file && !(get_varinfo (j)->is_special_var)) + fprintf (dump_file, "Untypesafe usage in do_da_constraint.\n"); +- ++ + } + } + +@@ -1607,7 +1372,7 @@ + do_sd_constraint (constraint_graph_t graph, constraint_t c, + bitmap delta) + { +- unsigned int lhs = get_varinfo (c->lhs.var)->node; ++ unsigned int lhs = find (c->lhs.var); + bool flag = false; + bitmap sol = get_varinfo (lhs)->solution; + unsigned int j; +@@ -1620,7 +1385,7 @@ + bitmap_set_bit (sol, anything_id); + goto done; + } +- /* For each variable j in delta (Sol(y)), add ++ /* For each variable j in delta (Sol(y)), add + an edge in the graph from j to x, and union Sol(j) into Sol(x). */ + EXECUTE_IF_SET_IN_BITMAP (delta, 0, j, bi) + { +@@ -1634,18 +1399,18 @@ + v = first_vi_for_offset (get_varinfo (j), fieldoffset); + if (!v) + continue; +- t = v->node; ++ t = find (v->id); + + /* Adding edges from the special vars is pointless. + They don't have sets that can change. */ + if (get_varinfo (t) ->is_special_var) + flag |= bitmap_ior_into (sol, get_varinfo (t)->solution); +- else if (int_add_graph_edge (graph, lhs, t, 0)) ++ else if (add_graph_edge (graph, lhs, t)) + flag |= bitmap_ior_into (sol, get_varinfo (t)->solution); + } + else if (0 && dump_file && !(get_varinfo (j)->is_special_var)) + fprintf (dump_file, "Untypesafe usage in do_sd_constraint\n"); +- ++ + } + + done: +@@ -1658,15 +1423,15 @@ + SET_BIT (changed, lhs); + changed_count++; + } +- } ++ } + } + + /* Process a constraint C that represents *x = y. */ + + static void +-do_ds_constraint (constraint_graph_t graph, constraint_t c, bitmap delta) ++do_ds_constraint (constraint_t c, bitmap delta) + { +- unsigned int rhs = get_varinfo (c->rhs.var)->node; ++ unsigned int rhs = find (c->rhs.var); + unsigned HOST_WIDE_INT roff = c->rhs.offset; + bitmap sol = get_varinfo (rhs)->solution; + unsigned int j; +@@ -1685,8 +1450,8 @@ + v = first_vi_for_offset (get_varinfo (j), fieldoffset); + if (!v) + continue; +- t = v->node; +- ++ t = find (v->id); ++ + if (!bitmap_bit_p (get_varinfo (t)->solution, anything_id)) + { + bitmap_set_bit (get_varinfo (t)->solution, anything_id); +@@ -1705,40 +1470,39 @@ + EXECUTE_IF_SET_IN_BITMAP (delta, 0, j, bi) + { + unsigned HOST_WIDE_INT loff = c->lhs.offset; +- if (type_safe (j, &loff) && !(get_varinfo(j)->is_special_var)) ++ if (type_safe (j, &loff) && !(get_varinfo (j)->is_special_var)) + { + varinfo_t v; + unsigned int t; + unsigned HOST_WIDE_INT fieldoffset = get_varinfo (j)->offset + loff; ++ bitmap tmp; + + v = first_vi_for_offset (get_varinfo (j), fieldoffset); + if (!v) + continue; +- t = v->node; +- if (int_add_graph_edge (graph, t, rhs, roff)) ++ t = find (v->id); ++ tmp = get_varinfo (t)->solution; ++ ++ if (set_union_with_increment (tmp, sol, roff)) + { +- bitmap tmp = get_varinfo (t)->solution; +- if (set_union_with_increment (tmp, sol, roff)) ++ get_varinfo (t)->solution = tmp; ++ if (t == rhs) ++ sol = get_varinfo (rhs)->solution; ++ if (!TEST_BIT (changed, t)) + { +- get_varinfo (t)->solution = tmp; +- if (t == rhs) +- sol = get_varinfo (rhs)->solution; +- if (!TEST_BIT (changed, t)) +- { +- SET_BIT (changed, t); +- changed_count++; +- } ++ SET_BIT (changed, t); ++ changed_count++; + } + } +- } ++ } + else if (0 && dump_file && !(get_varinfo (j)->is_special_var)) + fprintf (dump_file, "Untypesafe usage in do_ds_constraint\n"); + } + } + +-/* Handle a non-simple (simple meaning requires no iteration), non-copy +- constraint (IE *x = &y, x = *y, and *x = y). */ +- ++/* Handle a non-simple (simple meaning requires no iteration), ++ constraint (IE *x = &y, x = *y, *x = y, and x = y with offsets involved). */ ++ + static void + do_complex_constraint (constraint_graph_t graph, constraint_t c, bitmap delta) + { +@@ -1752,33 +1516,62 @@ + else + { + /* *x = y */ +- do_ds_constraint (graph, c, delta); ++ do_ds_constraint (c, delta); + } + } +- else ++ else if (c->rhs.type == DEREF) + { + /* x = *y */ + if (!(get_varinfo (c->lhs.var)->is_special_var)) + do_sd_constraint (graph, c, delta); + } ++ else ++ { ++ bitmap tmp; ++ bitmap solution; ++ bool flag = false; ++ unsigned int t; ++ ++ gcc_assert (c->rhs.type == SCALAR && c->lhs.type == SCALAR); ++ t = find (c->rhs.var); ++ solution = get_varinfo (t)->solution; ++ t = find (c->lhs.var); ++ tmp = get_varinfo (t)->solution; ++ ++ flag = set_union_with_increment (tmp, solution, c->rhs.offset); ++ ++ if (flag) ++ { ++ get_varinfo (t)->solution = tmp; ++ if (!TEST_BIT (changed, t)) ++ { ++ SET_BIT (changed, t); ++ changed_count++; ++ } ++ } ++ } + } + + /* Initialize and return a new SCC info structure. */ + + static struct scc_info * +-init_scc_info (void) ++init_scc_info (size_t size) + { + struct scc_info *si = XNEW (struct scc_info); +- size_t size = VEC_length (varinfo_t, varmap); ++ size_t i; + + si->current_index = 0; + si->visited = sbitmap_alloc (size); + sbitmap_zero (si->visited); +- si->in_component = sbitmap_alloc (size); +- sbitmap_ones (si->in_component); +- si->visited_index = XCNEWVEC (unsigned int, size + 1); ++ si->roots = sbitmap_alloc (size); ++ sbitmap_zero (si->roots); ++ si->node_mapping = XNEWVEC (unsigned int, size); ++ si->dfs = XCNEWVEC (unsigned int, size); ++ ++ for (i = 0; i < size; i++) ++ si->node_mapping[i] = i; ++ + si->scc_stack = VEC_alloc (unsigned, heap, 1); +- si->unification_queue = VEC_alloc (unsigned, heap, 1); + return si; + } + +@@ -1786,209 +1579,430 @@ + + static void + free_scc_info (struct scc_info *si) +-{ ++{ + sbitmap_free (si->visited); +- sbitmap_free (si->in_component); +- free (si->visited_index); ++ sbitmap_free (si->roots); ++ free (si->node_mapping); ++ free (si->dfs); + VEC_free (unsigned, heap, si->scc_stack); +- VEC_free (unsigned, heap, si->unification_queue); +- free(si); ++ free (si); + } + + +-/* Find cycles in GRAPH that occur, using strongly connected components, and +- collapse the cycles into a single representative node. if UPDATE_CHANGED +- is true, then update the changed sbitmap to note those nodes whose +- solutions have changed as a result of collapsing. */ ++/* Find indirect cycles in GRAPH that occur, using strongly connected ++ components, and note them in the indirect cycles map. + ++ This technique comes from Ben Hardekopf and Calvin Lin, ++ "It Pays to be Lazy: Fast and Accurate Pointer Analysis for Millions of ++ Lines of Code", submitted to PLDI 2007. */ ++ + static void +-find_and_collapse_graph_cycles (constraint_graph_t graph, bool update_changed) ++find_indirect_cycles (constraint_graph_t graph) + { + unsigned int i; +- unsigned int size = VEC_length (varinfo_t, varmap); +- struct scc_info *si = init_scc_info (); ++ unsigned int size = graph->size; ++ struct scc_info *si = init_scc_info (size); + +- for (i = 0; i != size; ++i) +- if (!TEST_BIT (si->visited, i) && get_varinfo (i)->node == i) ++ for (i = 0; i < MIN (LAST_REF_NODE, size); i ++ ) ++ if (!TEST_BIT (si->visited, i) && find (i) == i) + scc_visit (graph, si, i); +- +- process_unification_queue (graph, si, update_changed); ++ + free_scc_info (si); + } + + /* Compute a topological ordering for GRAPH, and store the result in the + topo_info structure TI. */ + +-static void ++static void + compute_topo_order (constraint_graph_t graph, + struct topo_info *ti) + { + unsigned int i; + unsigned int size = VEC_length (varinfo_t, varmap); +- ++ + for (i = 0; i != size; ++i) +- if (!TEST_BIT (ti->visited, i) && get_varinfo (i)->node == i) ++ if (!TEST_BIT (ti->visited, i) && find (i) == i) + topo_visit (graph, ti, i); + } + +-/* Return true if bitmap B is empty, or a bitmap other than bit 0 is set. */ ++/* Perform offline variable substitution. + +-static bool +-bitmap_other_than_zero_bit_set (bitmap b) +-{ +- unsigned int i; +- bitmap_iterator bi; +- +- if (bitmap_empty_p (b)) +- return false; +- EXECUTE_IF_SET_IN_BITMAP (b, 1, i, bi) +- return true; +- return false; +-} +- +-/* Perform offline variable substitution. +- + This is a linear time way of identifying variables that must have + equivalent points-to sets, including those caused by static cycles, + and single entry subgraphs, in the constraint graph. + + The technique is described in "Off-line variable substitution for + scaling points-to analysis" by Atanas Rountev and Satish Chandra, +- in "ACM SIGPLAN Notices" volume 35, number 5, pages 47-56. */ ++ in "ACM SIGPLAN Notices" volume 35, number 5, pages 47-56. + ++ There is an optimal way to do this involving hash based value ++ numbering, once the technique is published i will implement it ++ here. ++ ++ The general method of finding equivalence classes is as follows: ++ Add fake nodes (REF nodes) and edges for *a = b and a = *b constraints. ++ Add fake nodes (ADDRESS nodes) and edges for a = &b constraints. ++ Initialize all non-REF/ADDRESS nodes to be direct nodes ++ For each SCC in the predecessor graph: ++ for each member (x) of the SCC ++ if x is not a direct node: ++ set rootnode(SCC) to be not a direct node ++ collapse node x into rootnode(SCC). ++ if rootnode(SCC) is not a direct node: ++ label rootnode(SCC) with a new equivalence class ++ else: ++ if all labeled predecessors of rootnode(SCC) have the same ++ label: ++ label rootnode(SCC) with this label ++ else: ++ label rootnode(SCC) with a new equivalence class ++ ++ All direct nodes with the same equivalence class can be replaced ++ with a single representative node. ++ All unlabeled nodes (label == 0) are not pointers and all edges ++ involving them can be eliminated. ++ We perform these optimizations during move_complex_constraints. ++*/ ++ ++static int equivalence_class; ++ ++/* Recursive routine to find strongly connected components in GRAPH, ++ and label it's nodes with equivalence classes. ++ This is used during variable substitution to find cycles involving ++ the regular or implicit predecessors, and label them as equivalent. ++ The SCC finding algorithm used is the same as that for scc_visit. */ ++ + static void +-perform_var_substitution (constraint_graph_t graph) ++label_visit (constraint_graph_t graph, struct scc_info *si, unsigned int n) + { +- struct topo_info *ti = init_topo_info (); +- +- bitmap_obstack_initialize (&iteration_obstack); +- /* Compute the topological ordering of the graph, then visit each +- node in topological order. */ +- compute_topo_order (graph, ti); +- +- while (VEC_length (unsigned, ti->topo_order) != 0) ++ unsigned int i; ++ bitmap_iterator bi; ++ unsigned int my_dfs; ++ ++ gcc_assert (si->node_mapping[n] == n); ++ SET_BIT (si->visited, n); ++ si->dfs[n] = si->current_index ++; ++ my_dfs = si->dfs[n]; ++ ++ /* Visit all the successors. */ ++ EXECUTE_IF_IN_NONNULL_BITMAP (graph->preds[n], 0, i, bi) + { +- unsigned int i = VEC_pop (unsigned, ti->topo_order); +- unsigned int pred; +- varinfo_t vi = get_varinfo (i); +- bool okay_to_elim = false; +- unsigned int root = VEC_length (varinfo_t, varmap); +- VEC(constraint_edge_t,heap) *predvec = graph->preds[i]; +- constraint_edge_t ce = NULL; +- bitmap tmp; +- unsigned int k; +- bitmap_iterator bi; ++ unsigned int w = si->node_mapping[i]; + +- /* We can't eliminate things whose address is taken, or which is +- the target of a dereference. */ +- if (vi->address_taken || vi->indirect_target) ++ if (TEST_BIT (si->roots, w)) + continue; + +- /* See if all predecessors of I are ripe for elimination */ +- EXECUTE_IF_IN_NONNULL_BITMAP (graph->zero_weight_preds[i], 0, k, bi) +- { +- unsigned int w; +- w = get_varinfo (k)->node; ++ if (!TEST_BIT (si->visited, w)) ++ label_visit (graph, si, w); ++ { ++ unsigned int t = si->node_mapping[w]; ++ unsigned int nnode = si->node_mapping[n]; ++ gcc_assert (nnode == n); + +- /* We can't eliminate the node if one of the predecessors is +- part of a different strongly connected component. */ +- if (!okay_to_elim) +- { +- root = w; +- okay_to_elim = true; +- } +- else if (w != root) +- { +- okay_to_elim = false; +- break; +- } ++ if (si->dfs[t] < si->dfs[nnode]) ++ si->dfs[n] = si->dfs[t]; ++ } ++ } + +- /* Theorem 4 in Rountev and Chandra: If i is a direct node, +- then Solution(i) is a subset of Solution (w), where w is a +- predecessor in the graph. +- Corollary: If all predecessors of i have the same +- points-to set, then i has that same points-to set as +- those predecessors. */ +- tmp = BITMAP_ALLOC (NULL); +- bitmap_and_compl (tmp, get_varinfo (i)->solution, +- get_varinfo (w)->solution); +- if (!bitmap_empty_p (tmp)) +- { +- okay_to_elim = false; +- BITMAP_FREE (tmp); +- break; +- } +- BITMAP_FREE (tmp); +- } ++ /* Visit all the implicit predecessors. */ ++ EXECUTE_IF_IN_NONNULL_BITMAP (graph->implicit_preds[n], 0, i, bi) ++ { ++ unsigned int w = si->node_mapping[i]; + +- if (okay_to_elim) +- for (pred = 0; +- VEC_iterate (constraint_edge_t, predvec, pred, ce); +- pred++) +- { +- bitmap weight; +- unsigned int w; +- weight = *(get_graph_weights (graph, i, ce->dest)); ++ if (TEST_BIT (si->roots, w)) ++ continue; + +- /* We can't eliminate variables that have nonzero weighted +- edges between them. */ +- if (weight && bitmap_other_than_zero_bit_set (weight)) +- { +- okay_to_elim = false; +- break; +- } +- w = get_varinfo (ce->dest)->node; ++ if (!TEST_BIT (si->visited, w)) ++ label_visit (graph, si, w); ++ { ++ unsigned int t = si->node_mapping[w]; ++ unsigned int nnode = si->node_mapping[n]; ++ gcc_assert (nnode == n); + +- /* We can't eliminate the node if one of the predecessors is +- part of a different strongly connected component. */ +- if (!okay_to_elim) +- { +- root = w; +- okay_to_elim = true; +- } +- else if (w != root) +- { +- okay_to_elim = false; +- break; +- } ++ if (si->dfs[t] < si->dfs[nnode]) ++ si->dfs[n] = si->dfs[t]; ++ } ++ } + +- /* Theorem 4 in Rountev and Chandra: If i is a direct node, +- then Solution(i) is a subset of Solution (w), where w is a +- predecessor in the graph. +- Corollary: If all predecessors of i have the same +- points-to set, then i has that same points-to set as +- those predecessors. */ +- tmp = BITMAP_ALLOC (NULL); +- bitmap_and_compl (tmp, get_varinfo (i)->solution, +- get_varinfo (w)->solution); +- if (!bitmap_empty_p (tmp)) +- { +- okay_to_elim = false; +- BITMAP_FREE (tmp); +- break; +- } +- BITMAP_FREE (tmp); +- } ++ /* See if any components have been identified. */ ++ if (si->dfs[n] == my_dfs) ++ { ++ while (VEC_length (unsigned, si->scc_stack) != 0 ++ && si->dfs[VEC_last (unsigned, si->scc_stack)] >= my_dfs) ++ { ++ unsigned int w = VEC_pop (unsigned, si->scc_stack); ++ si->node_mapping[w] = n; + +- /* See if the root is different than the original node. +- If so, we've found an equivalence. */ +- if (root != get_varinfo (i)->node && okay_to_elim) ++ if (!TEST_BIT (graph->direct_nodes, w)) ++ RESET_BIT (graph->direct_nodes, n); ++ } ++ SET_BIT (si->roots, n); ++ ++ if (!TEST_BIT (graph->direct_nodes, n)) + { +- /* Found an equivalence */ +- get_varinfo (i)->node = root; +- collapse_nodes (graph, root, i); ++ graph->label[n] = equivalence_class++; ++ } ++ else ++ { ++ unsigned int size = 0; ++ unsigned int firstlabel = ~0; ++ ++ EXECUTE_IF_IN_NONNULL_BITMAP (graph->preds[n], 0, i, bi) ++ { ++ unsigned int j = si->node_mapping[i]; ++ ++ if (j == n || graph->label[j] == 0) ++ continue; ++ ++ if (firstlabel == (unsigned int)~0) ++ { ++ firstlabel = graph->label[j]; ++ size++; ++ } ++ else if (graph->label[j] != firstlabel) ++ size++; ++ } ++ ++ if (size == 0) ++ graph->label[n] = 0; ++ else if (size == 1) ++ graph->label[n] = firstlabel; ++ else ++ graph->label[n] = equivalence_class++; ++ } ++ } ++ else ++ VEC_safe_push (unsigned, heap, si->scc_stack, n); ++} ++ ++/* Perform offline variable substitution, discovering equivalence ++ classes, and eliminating non-pointer variables. */ ++ ++static struct scc_info * ++perform_var_substitution (constraint_graph_t graph) ++{ ++ unsigned int i; ++ unsigned int size = graph->size; ++ struct scc_info *si = init_scc_info (size); ++ ++ bitmap_obstack_initialize (&iteration_obstack); ++ equivalence_class = 0; ++ ++ /* We only need to visit the non-address nodes for labeling ++ purposes, as the address nodes will never have any predecessors, ++ because &x never appears on the LHS of a constraint. */ ++ for (i = 0; i < LAST_REF_NODE; i++) ++ if (!TEST_BIT (si->visited, si->node_mapping[i])) ++ label_visit (graph, si, si->node_mapping[i]); ++ ++ if (dump_file && (dump_flags & TDF_DETAILS)) ++ for (i = 0; i < FIRST_REF_NODE; i++) ++ { ++ bool direct_node = TEST_BIT (graph->direct_nodes, i); ++ fprintf (dump_file, ++ "Equivalence class for %s node id %d:%s is %d\n", ++ direct_node ? "Direct node" : "Indirect node", i, ++ get_varinfo (i)->name, ++ graph->label[si->node_mapping[i]]); ++ } ++ ++ /* Quickly eliminate our non-pointer variables. */ ++ ++ for (i = 0; i < FIRST_REF_NODE; i++) ++ { ++ unsigned int node = si->node_mapping[i]; ++ ++ if (graph->label[node] == 0 && TEST_BIT (graph->direct_nodes, node)) ++ { + if (dump_file && (dump_flags & TDF_DETAILS)) +- fprintf (dump_file, "Collapsing %s into %s\n", +- get_varinfo (i)->name, +- get_varinfo (root)->name); +- stats.collapsed_vars++; ++ fprintf (dump_file, ++ "%s is a non-pointer variable, eliminating edges.\n", ++ get_varinfo (node)->name); ++ stats.nonpointer_vars++; ++ clear_edges_for_node (graph, node); + } + } ++ return si; ++} + ++/* Free information that was only necessary for variable ++ substitution. */ ++ ++static void ++free_var_substitution_info (struct scc_info *si) ++{ ++ free_scc_info (si); ++ free (graph->label); ++ free (graph->eq_rep); ++ sbitmap_free (graph->direct_nodes); + bitmap_obstack_release (&iteration_obstack); +- free_topo_info (ti); + } + ++/* Return an existing node that is equivalent to NODE, which has ++ equivalence class LABEL, if one exists. Return NODE otherwise. */ ++ ++static unsigned int ++find_equivalent_node (constraint_graph_t graph, ++ unsigned int node, unsigned int label) ++{ ++ /* If the address version of this variable is unused, we can ++ substitute it for anything else with the same label. ++ Otherwise, we know the pointers are equivalent, but not the ++ locations. */ ++ ++ if (graph->label[FIRST_ADDR_NODE + node] == 0) ++ { ++ gcc_assert (label < graph->size); ++ ++ if (graph->eq_rep[label] != -1) ++ { ++ /* Unify the two variables since we know they are equivalent. */ ++ if (unite (graph->eq_rep[label], node)) ++ unify_nodes (graph, graph->eq_rep[label], node, false); ++ return graph->eq_rep[label]; ++ } ++ else ++ { ++ graph->eq_rep[label] = node; ++ } ++ } ++ return node; ++} ++ ++/* Move complex constraints to the appropriate nodes, and collapse ++ variables we've discovered are equivalent during variable ++ substitution. SI is the SCC_INFO that is the result of ++ perform_variable_substitution. */ ++ ++static void ++move_complex_constraints (constraint_graph_t graph, ++ struct scc_info *si) ++{ ++ int i; ++ unsigned int j; ++ constraint_t c; ++ ++ for (j = 0; j < graph->size; j++) ++ gcc_assert (find (j) == j); ++ ++ for (i = 0; VEC_iterate (constraint_t, constraints, i, c); i++) ++ { ++ struct constraint_expr lhs = c->lhs; ++ struct constraint_expr rhs = c->rhs; ++ unsigned int lhsvar = find (get_varinfo_fc (lhs.var)->id); ++ unsigned int rhsvar = find (get_varinfo_fc (rhs.var)->id); ++ unsigned int lhsnode, rhsnode; ++ unsigned int lhslabel, rhslabel; ++ ++ lhsnode = si->node_mapping[lhsvar]; ++ rhsnode = si->node_mapping[rhsvar]; ++ lhslabel = graph->label[lhsnode]; ++ rhslabel = graph->label[rhsnode]; ++ ++ /* See if it is really a non-pointer variable, and if so, ignore ++ the constraint. */ ++ if (lhslabel == 0) ++ { ++ if (!TEST_BIT (graph->direct_nodes, lhsnode)) ++ lhslabel = graph->label[lhsnode] = equivalence_class++; ++ else ++ { ++ if (dump_file && (dump_flags & TDF_DETAILS)) ++ { ++ ++ fprintf (dump_file, "%s is a non-pointer variable," ++ "ignoring constraint:", ++ get_varinfo (lhs.var)->name); ++ dump_constraint (dump_file, c); ++ } ++ VEC_replace (constraint_t, constraints, i, NULL); ++ continue; ++ } ++ } ++ ++ if (rhslabel == 0) ++ { ++ if (!TEST_BIT (graph->direct_nodes, rhsnode)) ++ rhslabel = graph->label[rhsnode] = equivalence_class++; ++ else ++ { ++ if (dump_file && (dump_flags & TDF_DETAILS)) ++ { ++ ++ fprintf (dump_file, "%s is a non-pointer variable," ++ "ignoring constraint:", ++ get_varinfo (rhs.var)->name); ++ dump_constraint (dump_file, c); ++ } ++ VEC_replace (constraint_t, constraints, i, NULL); ++ continue; ++ } ++ } ++ ++ lhsvar = find_equivalent_node (graph, lhsvar, lhslabel); ++ rhsvar = find_equivalent_node (graph, rhsvar, rhslabel); ++ c->lhs.var = lhsvar; ++ c->rhs.var = rhsvar; ++ ++ if (lhs.type == DEREF) ++ { ++ if (rhs.type == ADDRESSOF || rhsvar > anything_id) ++ insert_into_complex (graph, lhsvar, c); ++ } ++ else if (rhs.type == DEREF) ++ { ++ if (!(get_varinfo (lhsvar)->is_special_var)) ++ insert_into_complex (graph, rhsvar, c); ++ } ++ else if (rhs.type != ADDRESSOF && lhsvar > anything_id ++ && (lhs.offset != 0 || rhs.offset != 0)) ++ { ++ insert_into_complex (graph, rhsvar, c); ++ } ++ ++ } ++} ++ ++/* Eliminate indirect cycles involving NODE. Return true if NODE was ++ part of an SCC, false otherwise. */ ++ ++static bool ++eliminate_indirect_cycles (unsigned int node) ++{ ++ if (graph->indirect_cycles[node] != -1 ++ && !bitmap_empty_p (get_varinfo (node)->solution)) ++ { ++ unsigned int i; ++ VEC(unsigned,heap) *queue = NULL; ++ int queuepos; ++ unsigned int to = find (graph->indirect_cycles[node]); ++ bitmap_iterator bi; ++ ++ /* We can't touch the solution set and call unify_nodes ++ at the same time, because unify_nodes is going to do ++ bitmap unions into it. */ ++ ++ EXECUTE_IF_SET_IN_BITMAP (get_varinfo (node)->solution, 0, i, bi) ++ { ++ if (find (i) == i && i != to) ++ { ++ if (unite (to, i)) ++ VEC_safe_push (unsigned, heap, queue, i); ++ } ++ } ++ ++ for (queuepos = 0; ++ VEC_iterate (unsigned, queue, queuepos, i); ++ queuepos++) ++ { ++ unify_nodes (graph, to, i, true); ++ } ++ VEC_free (unsigned, heap, queue); ++ return true; ++ } ++ return false; ++} ++ + /* Solve the constraint graph GRAPH using our worklist solver. + This is based on the PW* family of solvers from the "Efficient Field + Sensitive Pointer Analysis for C" paper. +@@ -2001,17 +2015,28 @@ + { + unsigned int size = VEC_length (varinfo_t, varmap); + unsigned int i; ++ bitmap pts; + +- changed_count = size; ++ changed_count = 0; + changed = sbitmap_alloc (size); +- sbitmap_ones (changed); +- +- /* The already collapsed/unreachable nodes will never change, so we +- need to account for them in changed_count. */ ++ sbitmap_zero (changed); ++ ++ /* Mark all initial non-collapsed nodes as changed. */ + for (i = 0; i < size; i++) +- if (get_varinfo (i)->node != i) +- changed_count--; +- ++ { ++ varinfo_t ivi = get_varinfo (i); ++ if (find (i) == i && !bitmap_empty_p (ivi->solution) ++ && ((graph->succs[i] && !bitmap_empty_p (graph->succs[i])) ++ || VEC_length (constraint_t, graph->complex[i]) > 0)) ++ { ++ SET_BIT (changed, i); ++ changed_count++; ++ } ++ } ++ ++ /* Allocate a bitmap to be used to store the changed bits. */ ++ pts = BITMAP_ALLOC (&pta_obstack); ++ + while (changed_count > 0) + { + unsigned int i; +@@ -2019,41 +2044,45 @@ + stats.iterations++; + + bitmap_obstack_initialize (&iteration_obstack); +- +- if (edge_added) +- { +- /* We already did cycle elimination once, when we did +- variable substitution, so we don't need it again for the +- first iteration. */ +- if (stats.iterations > 1) +- find_and_collapse_graph_cycles (graph, true); + +- edge_added = false; +- } +- + compute_topo_order (graph, ti); + + while (VEC_length (unsigned, ti->topo_order) != 0) + { ++ + i = VEC_pop (unsigned, ti->topo_order); +- gcc_assert (get_varinfo (i)->node == i); + ++ /* If this variable is not a representative, skip it. */ ++ if (find (i) != i) ++ continue; ++ ++ /* In certain indirect cycle cases, we may merge this ++ variable to another. */ ++ if (eliminate_indirect_cycles (i) && find (i) != i) ++ continue; ++ + /* If the node has changed, we need to process the + complex constraints and outgoing edges again. */ + if (TEST_BIT (changed, i)) + { + unsigned int j; + constraint_t c; +- constraint_edge_t e = NULL; + bitmap solution; +- bitmap_iterator bi; +- VEC(constraint_t,heap) *complex = get_varinfo (i)->complex; +- VEC(constraint_edge_t,heap) *succs; ++ VEC(constraint_t,heap) *complex = graph->complex[i]; + bool solution_empty; + + RESET_BIT (changed, i); + changed_count--; + ++ /* Compute the changed set of solution bits. */ ++ bitmap_and_compl (pts, get_varinfo (i)->solution, ++ get_varinfo (i)->oldsolution); ++ ++ if (bitmap_empty_p (pts)) ++ continue; ++ ++ bitmap_ior_into (get_varinfo (i)->oldsolution, pts); ++ + solution = get_varinfo (i)->solution; + solution_empty = bitmap_empty_p (solution); + +@@ -2065,52 +2094,38 @@ + is a constraint where the lhs side is receiving + some set from elsewhere. */ + if (!solution_empty || c->lhs.type != DEREF) +- do_complex_constraint (graph, c, solution); ++ do_complex_constraint (graph, c, pts); + } + + solution_empty = bitmap_empty_p (solution); + + if (!solution_empty) + { ++ bitmap_iterator bi; ++ + /* Propagate solution to all successors. */ +- succs = graph->succs[i]; +- +- EXECUTE_IF_IN_NONNULL_BITMAP (graph->zero_weight_succs[i], ++ EXECUTE_IF_IN_NONNULL_BITMAP (graph->succs[i], + 0, j, bi) + { +- bitmap tmp = get_varinfo (j)->solution; +- bool flag = false; +- +- flag = set_union_with_increment (tmp, solution, 0); +- +- if (flag) +- { +- get_varinfo (j)->solution = tmp; +- if (!TEST_BIT (changed, j)) +- { +- SET_BIT (changed, j); +- changed_count++; +- } +- } +- } +- for (j = 0; VEC_iterate (constraint_edge_t, succs, j, e); j++) +- { +- bitmap tmp = get_varinfo (e->dest)->solution; +- bool flag = false; +- unsigned int k; +- bitmap weights = e->weights; +- bitmap_iterator bi; ++ bitmap tmp; ++ bool flag; + +- gcc_assert (weights && !bitmap_empty_p (weights)); +- EXECUTE_IF_SET_IN_BITMAP (weights, 0, k, bi) +- flag |= set_union_with_increment (tmp, solution, k); ++ unsigned int to = find (j); ++ tmp = get_varinfo (to)->solution; ++ flag = false; + ++ /* Don't try to propagate to ourselves. */ ++ if (to == i) ++ continue; ++ ++ flag = set_union_with_increment (tmp, pts, 0); ++ + if (flag) + { +- get_varinfo (e->dest)->solution = tmp; +- if (!TEST_BIT (changed, e->dest)) ++ get_varinfo (to)->solution = tmp; ++ if (!TEST_BIT (changed, to)) + { +- SET_BIT (changed, e->dest); ++ SET_BIT (changed, to); + changed_count++; + } + } +@@ -2122,74 +2137,37 @@ + bitmap_obstack_release (&iteration_obstack); + } + ++ BITMAP_FREE (pts); + sbitmap_free (changed); ++ bitmap_obstack_release (&oldpta_obstack); + } + ++/* Map from trees to variable infos. */ ++static struct pointer_map_t *vi_for_tree; + +-/* CONSTRAINT AND VARIABLE GENERATION FUNCTIONS */ + +-/* Map from trees to variable ids. */ +-static htab_t id_for_tree; ++/* Insert ID as the variable id for tree T in the vi_for_tree map. */ + +-typedef struct tree_id ++static void ++insert_vi_for_tree (tree t, varinfo_t vi) + { +- tree t; +- unsigned int id; +-} *tree_id_t; +- +-/* Hash a tree id structure. */ +- +-static hashval_t +-tree_id_hash (const void *p) +-{ +- const tree_id_t ta = (tree_id_t) p; +- return htab_hash_pointer (ta->t); +-} +- +-/* Return true if the tree in P1 and the tree in P2 are the same. */ +- +-static int +-tree_id_eq (const void *p1, const void *p2) +-{ +- const tree_id_t ta1 = (tree_id_t) p1; +- const tree_id_t ta2 = (tree_id_t) p2; +- return ta1->t == ta2->t; +-} +- +-/* Insert ID as the variable id for tree T in the hashtable. */ +- +-static void +-insert_id_for_tree (tree t, int id) +-{ +- void **slot; +- struct tree_id finder; +- tree_id_t new_pair; +- +- finder.t = t; +- slot = htab_find_slot (id_for_tree, &finder, INSERT); ++ void **slot = pointer_map_insert (vi_for_tree, t); ++ gcc_assert (vi); + gcc_assert (*slot == NULL); +- new_pair = XNEW (struct tree_id); +- new_pair->t = t; +- new_pair->id = id; +- *slot = (void *)new_pair; ++ *slot = vi; + } + +-/* Find the variable id for tree T in ID_FOR_TREE. If T does not +- exist in the hash table, return false, otherwise, return true and +- set *ID to the id we found. */ ++/* Find the variable info for tree T in VI_FOR_TREE. If T does not ++ exist in the map, return NULL, otherwise, return the varinfo we found. */ + +-static bool +-lookup_id_for_tree (tree t, unsigned int *id) ++static varinfo_t ++lookup_vi_for_tree (tree t) + { +- tree_id_t pair; +- struct tree_id finder; ++ void **slot = pointer_map_contains (vi_for_tree, t); ++ if (slot == NULL) ++ return NULL; + +- finder.t = t; +- pair = htab_find (id_for_tree, &finder); +- if (pair == NULL) +- return false; +- *id = pair->id; +- return true; ++ return (varinfo_t) *slot; + } + + /* Return a printable name for DECL */ +@@ -2210,7 +2188,7 @@ + + if (TREE_CODE (decl) == SSA_NAME) + { +- num_printed = asprintf (&temp, "%s_%u", ++ num_printed = asprintf (&temp, "%s_%u", + alias_get_name (SSA_NAME_VAR (decl)), + SSA_NAME_VERSION (decl)); + } +@@ -2226,21 +2204,17 @@ + return res; + } + +-/* Find the variable id for tree T in the hashtable. +- If T doesn't exist in the hash table, create an entry for it. */ ++/* Find the variable id for tree T in the map. ++ If T doesn't exist in the map, create an entry for it and return it. */ + +-static unsigned int +-get_id_for_tree (tree t) ++static varinfo_t ++get_vi_for_tree (tree t) + { +- tree_id_t pair; +- struct tree_id finder; ++ void **slot = pointer_map_contains (vi_for_tree, t); ++ if (slot == NULL) ++ return get_varinfo (create_variable_info_for (t, alias_get_name (t))); + +- finder.t = t; +- pair = htab_find (id_for_tree, &finder); +- if (pair == NULL) +- return create_variable_info_for (t, alias_get_name (t)); +- +- return pair->id; ++ return (varinfo_t) *slot; + } + + /* Get a constraint expression from an SSA_VAR_P node. */ +@@ -2254,14 +2228,14 @@ + + /* For parameters, get at the points-to set for the actual parm + decl. */ +- if (TREE_CODE (t) == SSA_NAME +- && TREE_CODE (SSA_NAME_VAR (t)) == PARM_DECL ++ if (TREE_CODE (t) == SSA_NAME ++ && TREE_CODE (SSA_NAME_VAR (t)) == PARM_DECL + && default_def (SSA_NAME_VAR (t)) == t) + return get_constraint_exp_from_ssa_var (SSA_NAME_VAR (t)); + + cexpr.type = SCALAR; +- +- cexpr.var = get_id_for_tree (t); ++ ++ cexpr.var = get_vi_for_tree (t)->id; + /* If we determine the result is "anything", and we know this is readonly, + say it points to readonly memory instead. */ + if (cexpr.var == anything_id && TREE_READONLY (t)) +@@ -2269,7 +2243,7 @@ + cexpr.type = ADDRESSOF; + cexpr.var = readonly_id; + } +- ++ + cexpr.offset = 0; + return cexpr; + } +@@ -2290,7 +2264,13 @@ + get_varinfo (lhs.var)->directly_dereferenced = true; + if (rhs.type == DEREF) + get_varinfo (rhs.var)->directly_dereferenced = true; +- ++ ++ if (!use_field_sensitive) ++ { ++ t->rhs.offset = 0; ++ t->lhs.offset = 0; ++ } ++ + /* ANYTHING == ANYTHING is pointless. */ + if (lhs.var == anything_id && rhs.var == anything_id) + return; +@@ -2302,7 +2282,7 @@ + t->lhs = t->rhs; + t->rhs = rhs; + process_constraint (t); +- } ++ } + /* This can happen in our IR with things like n->a = *p */ + else if (rhs.type == DEREF && lhs.type == DEREF && rhs.var != anything_id) + { +@@ -2312,33 +2292,19 @@ + tree pointedtotype = TREE_TYPE (pointertype); + tree tmpvar = create_tmp_var_raw (pointedtotype, "doubledereftmp"); + struct constraint_expr tmplhs = get_constraint_exp_from_ssa_var (tmpvar); +- ++ + /* If this is an aggregate of known size, we should have passed + this off to do_structure_copy, and it should have broken it + up. */ +- gcc_assert (!AGGREGATE_TYPE_P (pointedtotype) ++ gcc_assert (!AGGREGATE_TYPE_P (pointedtotype) + || get_varinfo (rhs.var)->is_unknown_size_var); +- ++ + process_constraint (new_constraint (tmplhs, rhs)); + process_constraint (new_constraint (lhs, tmplhs)); + } +- else if (rhs.type == ADDRESSOF) +- { +- varinfo_t vi; +- gcc_assert (rhs.offset == 0); +- +- /* No need to mark address taken simply because of escaped vars +- constraints. */ +- if (lhs.var != escaped_vars_id) +- for (vi = get_varinfo (rhs.var); vi != NULL; vi = vi->next) +- vi->address_taken = true; +- +- VEC_safe_push (constraint_t, heap, constraints, t); +- } + else + { +- if (lhs.type != DEREF && rhs.type == DEREF) +- get_varinfo (lhs.var)->indirect_target = true; ++ gcc_assert (rhs.type != ADDRESSOF || rhs.offset == 0); + VEC_safe_push (constraint_t, heap, constraints, t); + } + } +@@ -2350,10 +2316,12 @@ + could_have_pointers (tree t) + { + tree type = TREE_TYPE (t); +- +- if (POINTER_TYPE_P (type) || AGGREGATE_TYPE_P (type) ++ ++ if (POINTER_TYPE_P (type) ++ || AGGREGATE_TYPE_P (type) + || TREE_CODE (type) == COMPLEX_TYPE) + return true; ++ + return false; + } + +@@ -2367,9 +2335,9 @@ + if (TREE_CODE (DECL_FIELD_OFFSET (fdecl)) != INTEGER_CST + || TREE_CODE (DECL_FIELD_BIT_OFFSET (fdecl)) != INTEGER_CST) + return -1; +- +- return (tree_low_cst (DECL_FIELD_OFFSET (fdecl), 1) * 8) +- + tree_low_cst (DECL_FIELD_BIT_OFFSET (fdecl), 1); ++ ++ return (tree_low_cst (DECL_FIELD_OFFSET (fdecl), 1) * 8) ++ + tree_low_cst (DECL_FIELD_BIT_OFFSET (fdecl), 1); + } + + +@@ -2388,7 +2356,7 @@ + return true; + if (accesspos < fieldpos && (accesspos + accesssize > fieldpos)) + return true; +- ++ + return false; + } + +@@ -2411,20 +2379,20 @@ + while (!SSA_VAR_P (forzero) && !CONSTANT_CLASS_P (forzero)) + forzero = TREE_OPERAND (forzero, 0); + +- if (CONSTANT_CLASS_P (forzero) && integer_zerop (forzero)) ++ if (CONSTANT_CLASS_P (forzero) && integer_zerop (forzero)) + { + struct constraint_expr temp; +- ++ + temp.offset = 0; + temp.var = integer_id; + temp.type = SCALAR; + VEC_safe_push (ce_s, heap, *results, &temp); + return; + } +- ++ + t = get_ref_base_and_extent (t, &bitpos, &bitsize, &bitmaxsize); + +- /* String constants's are readonly, so there is nothing to really do ++ /* String constants are readonly, so there is nothing to really do + here. */ + if (TREE_CODE (t) == STRING_CST) + return; +@@ -2438,21 +2406,21 @@ + /* This can also happen due to weird offsetof type macros. */ + if (TREE_CODE (t) != ADDR_EXPR && result->type == ADDRESSOF) + result->type = SCALAR; +- ++ + if (result->type == SCALAR) + { + /* In languages like C, you can access one past the end of an + array. You aren't allowed to dereference it, so we can + ignore this constraint. When we handle pointer subtraction, + we may have to do something cute here. */ +- ++ + if (result->offset < get_varinfo (result->var)->fullsize + && bitmaxsize != 0) + { + /* It's also not true that the constraint will actually start at the + right offset, it may start in some padding. We only care about + setting the constraint to the first actual field it touches, so +- walk to find it. */ ++ walk to find it. */ + varinfo_t curr; + for (curr = get_varinfo (result->var); curr; curr = curr->next) + { +@@ -2495,6 +2463,7 @@ + { + struct constraint_expr *c; + unsigned int i = 0; ++ + for (i = 0; VEC_iterate (ce_s, *constraints, i, c); i++) + { + if (c->type == SCALAR) +@@ -2576,6 +2545,7 @@ + tree pttype = TREE_TYPE (TREE_TYPE (t)); + + get_constraint_for (exp, results); ++ + /* Make sure we capture constraints to all elements + of an array. */ + if ((handled_component_p (exp) +@@ -2588,7 +2558,7 @@ + + if (VEC_length (ce_s, *results) == 0) + return; +- ++ + gcc_assert (VEC_length (ce_s, *results) == 1); + origrhs = VEC_last (ce_s, *results); + tmp = *origrhs; +@@ -2619,12 +2589,12 @@ + VEC_safe_push (ce_s, heap, *results, &tmp); + } + } +- ++ + for (i = 0; VEC_iterate (ce_s, *results, i, c); i++) + { + if (c->type == DEREF) + c->type = SCALAR; +- else ++ else + c->type = ADDRESSOF; + } + return; +@@ -2638,9 +2608,9 @@ + { + varinfo_t vi; + tree heapvar = heapvar_lookup (t); +- ++ + if (heapvar == NULL) +- { ++ { + heapvar = create_tmp_var_raw (ptr_type_node, "HEAP"); + DECL_EXTERNAL (heapvar) = 1; + if (referenced_vars) +@@ -2650,7 +2620,7 @@ + + temp.var = create_variable_info_for (heapvar, + alias_get_name (heapvar)); +- ++ + vi = get_varinfo (temp.var); + vi->is_artificial_var = 1; + vi->is_heap_var = 1; +@@ -2712,7 +2682,7 @@ + case NON_LVALUE_EXPR: + { + tree op = TREE_OPERAND (t, 0); +- ++ + /* Cast from non-pointer to pointers are bad news for us. + Anything else, we see through */ + if (!(POINTER_TYPE_P (TREE_TYPE (t)) +@@ -2738,7 +2708,7 @@ + { + switch (TREE_CODE (t)) + { +- case PHI_NODE: ++ case PHI_NODE: + { + get_constraint_for (PHI_RESULT (t), results); + return; +@@ -2782,8 +2752,8 @@ + + + /* Handle the structure copy case where we have a simple structure copy +- between LHS and RHS that is of SIZE (in bits) +- ++ between LHS and RHS that is of SIZE (in bits) ++ + For each field of the lhs variable (lhsfield) + For each field of the rhs variable at lhsfield.offset (rhsfield) + add the constraint lhsfield = rhsfield +@@ -2808,7 +2778,7 @@ + struct constraint_expr temprhs = rhs; + unsigned HOST_WIDE_INT fieldoffset; + +- templhs.var = p->id; ++ templhs.var = p->id; + q = get_varinfo (temprhs.var); + fieldoffset = p->offset - pstart; + q = first_vi_for_offset (q, q->offset + fieldoffset); +@@ -2823,8 +2793,8 @@ + + /* Handle the structure copy case where we have a structure copy between a + aggregate on the LHS and a dereference of a pointer on the RHS +- that is of SIZE (in bits) +- ++ that is of SIZE (in bits) ++ + For each field of the lhs variable (lhsfield) + rhs.offset = lhsfield->offset + add the constraint lhsfield = rhs +@@ -2849,12 +2819,12 @@ + + + if (templhs.type == SCALAR) +- templhs.var = p->id; ++ templhs.var = p->id; + else + templhs.offset = p->offset; +- ++ + q = get_varinfo (temprhs.var); +- fieldoffset = p->offset - pstart; ++ fieldoffset = p->offset - pstart; + temprhs.offset += fieldoffset; + process_constraint (new_constraint (templhs, temprhs)); + } +@@ -2862,7 +2832,7 @@ + + /* Handle the structure copy case where we have a structure copy + between a aggregate on the RHS and a dereference of a pointer on +- the LHS that is of SIZE (in bits) ++ the LHS that is of SIZE (in bits) + + For each field of the rhs variable (rhsfield) + lhs.offset = rhsfield->offset +@@ -2888,12 +2858,12 @@ + + + if (temprhs.type == SCALAR) +- temprhs.var = p->id; ++ temprhs.var = p->id; + else + temprhs.offset = p->offset; +- ++ + q = get_varinfo (templhs.var); +- fieldoffset = p->offset - pstart; ++ fieldoffset = p->offset - pstart; + templhs.offset += fieldoffset; + process_constraint (new_constraint (templhs, temprhs)); + } +@@ -2901,7 +2871,7 @@ + + /* Sometimes, frontends like to give us bad type information. This + function will collapse all the fields from VAR to the end of VAR, +- into VAR, so that we treat those fields as a single variable. ++ into VAR, so that we treat those fields as a single variable. + We return the variable they were collapsed into. */ + + static unsigned int +@@ -2913,16 +2883,16 @@ + for (field = currvar->next; field; field = field->next) + { + if (dump_file) +- fprintf (dump_file, "Type safety: Collapsing var %s into %s\n", ++ fprintf (dump_file, "Type safety: Collapsing var %s into %s\n", + field->name, currvar->name); +- ++ + gcc_assert (!field->collapsed_to); + field->collapsed_to = currvar; + } + + currvar->next = NULL; + currvar->size = currvar->fullsize - currvar->offset; +- ++ + return currvar->id; + } + +@@ -2944,7 +2914,7 @@ + gcc_assert (VEC_length (ce_s, rhsc) == 1); + lhs = *(VEC_last (ce_s, lhsc)); + rhs = *(VEC_last (ce_s, rhsc)); +- ++ + VEC_free (ce_s, heap, lhsc); + VEC_free (ce_s, heap, rhsc); + +@@ -2955,7 +2925,7 @@ + lhs = rhs; + rhs = tmp; + } +- ++ + /* This is fairly conservative for the RHS == ADDRESSOF case, in that it's + possible it's something we could handle. However, most cases falling + into this are dealing with transparent unions, which are slightly +@@ -3021,11 +2991,11 @@ + else + lhssize = TREE_INT_CST_LOW (lhstypesize); + +- +- if (rhs.type == SCALAR && lhs.type == SCALAR) ++ ++ if (rhs.type == SCALAR && lhs.type == SCALAR) + { + if (!do_simple_structure_copy (lhs, rhs, MIN (lhssize, rhssize))) +- { ++ { + lhs.var = collapse_rest_of_var (lhs.var); + rhs.var = collapse_rest_of_var (rhs.var); + lhs.offset = 0; +@@ -3042,7 +3012,7 @@ + else + { + tree pointedtotype = lhstype; +- tree tmpvar; ++ tree tmpvar; + + gcc_assert (rhs.type == DEREF && lhs.type == DEREF); + tmpvar = create_tmp_var_raw (pointedtotype, "structcopydereftmp"); +@@ -3052,6 +3022,7 @@ + } + } + ++ + /* Update related alias information kept in AI. This is used when + building name tags, alias sets and deciding grouping heuristics. + STMT is the statement to process. This function also updates +@@ -3261,7 +3232,6 @@ + } + } + +- + /* Handle pointer arithmetic EXPR when creating aliasing constraints. + Expressions of the type PTR + CST can be handled in two ways: + +@@ -3307,6 +3277,7 @@ + else + return false; + ++ + for (i = 0; VEC_iterate (ce_s, lhsc, i, c); i++) + for (j = 0; VEC_iterate (ce_s, temp, j, c2); j++) + { +@@ -3360,12 +3331,12 @@ + { + int i; + unsigned int j; +- ++ + /* For a phi node, assign all the arguments to + the result. */ + get_constraint_for (PHI_RESULT (t), &lhsc); + for (i = 0; i < PHI_NUM_ARGS (t); i++) +- { ++ { + tree rhstype; + tree strippedrhs = PHI_ARG_DEF (t, i); + +@@ -3401,7 +3372,6 @@ + { + tree lhsop; + tree rhsop; +- unsigned int varid; + tree arglist; + varinfo_t fi; + int i = 1; +@@ -3423,17 +3393,16 @@ + we should still be able to handle. */ + if (decl) + { +- varid = get_id_for_tree (decl); ++ fi = get_vi_for_tree (decl); + } + else + { + decl = TREE_OPERAND (rhsop, 0); +- varid = get_id_for_tree (decl); ++ fi = get_vi_for_tree (decl); + } + + /* Assign all the passed arguments to the appropriate incoming + parameters of the function. */ +- fi = get_varinfo (varid); + arglist = TREE_OPERAND (rhsop, 1); + + for (;arglist; arglist = TREE_CHAIN (arglist)) +@@ -3463,13 +3432,14 @@ + } + i++; + } ++ + /* If we are returning a value, assign it to the result. */ + if (lhsop) + { + struct constraint_expr rhs; + struct constraint_expr *lhsp; + unsigned int j = 0; +- ++ + get_constraint_for (lhsop, &lhsc); + if (TREE_CODE (decl) != FUNCTION_DECL) + { +@@ -3485,7 +3455,7 @@ + } + for (j = 0; VEC_iterate (ce_s, lhsc, j, lhsp); j++) + process_constraint (new_constraint (*lhsp, rhs)); +- } ++ } + } + /* Otherwise, just a regular assignment statement. */ + else if (TREE_CODE (t) == MODIFY_EXPR) +@@ -3494,7 +3464,7 @@ + tree rhsop = TREE_OPERAND (t, 1); + int i; + +- if ((AGGREGATE_TYPE_P (TREE_TYPE (lhsop)) ++ if ((AGGREGATE_TYPE_P (TREE_TYPE (lhsop)) + || TREE_CODE (TREE_TYPE (lhsop)) == COMPLEX_TYPE) + && (AGGREGATE_TYPE_P (TREE_TYPE (rhsop)) + || TREE_CODE (TREE_TYPE (lhsop)) == COMPLEX_TYPE)) +@@ -3513,7 +3483,7 @@ + { + /* RHS that consist of unary operations, + exceptional types, or bare decls/constants, get +- handled directly by get_constraint_for. */ ++ handled directly by get_constraint_for. */ + case tcc_reference: + case tcc_declaration: + case tcc_constant: +@@ -3528,7 +3498,7 @@ + { + struct constraint_expr *c2; + unsigned int k; +- ++ + for (k = 0; VEC_iterate (ce_s, rhsc, k, c2); k++) + process_constraint (new_constraint (*c, *c2)); + } +@@ -3570,7 +3540,7 @@ + } + } + } +- } ++ } + } + } + } +@@ -3578,7 +3548,7 @@ + /* After promoting variables and computing aliasing we will + need to re-scan most statements. FIXME: Try to minimize the + number of statements re-scanned. It's not really necessary to +- re-scan *all* statements. */ ++ re-scan *all* statements. */ + mark_stmt_modified (origt); + VEC_free (ce_s, heap, rhsc); + VEC_free (ce_s, heap, lhsc); +@@ -3591,7 +3561,7 @@ + first field that overlaps with OFFSET. + Return NULL if we can't find one. */ + +-static varinfo_t ++static varinfo_t + first_vi_for_offset (varinfo_t start, unsigned HOST_WIDE_INT offset) + { + varinfo_t curr = start; +@@ -3617,7 +3587,7 @@ + { + varinfo_t prev = base; + varinfo_t curr = base->next; +- ++ + field->next = curr; + prev->next = field; + } +@@ -3630,7 +3600,7 @@ + { + varinfo_t prev = base; + varinfo_t curr = base->next; +- ++ + if (curr == NULL) + { + prev->next = field; +@@ -3652,13 +3622,13 @@ + + /* qsort comparison function for two fieldoff's PA and PB */ + +-static int ++static int + fieldoff_compare (const void *pa, const void *pb) + { + const fieldoff_s *foa = (const fieldoff_s *)pa; + const fieldoff_s *fob = (const fieldoff_s *)pb; + HOST_WIDE_INT foasize, fobsize; +- ++ + if (foa->offset != fob->offset) + return foa->offset - fob->offset; + +@@ -3671,8 +3641,8 @@ + void + sort_fieldstack (VEC(fieldoff_s,heap) *fieldstack) + { +- qsort (VEC_address (fieldoff_s, fieldstack), +- VEC_length (fieldoff_s, fieldstack), ++ qsort (VEC_address (fieldoff_s, fieldstack), ++ VEC_length (fieldoff_s, fieldstack), + sizeof (fieldoff_s), + fieldoff_compare); + } +@@ -3686,12 +3656,12 @@ + TYPE. */ + + int +-push_fields_onto_fieldstack (tree type, VEC(fieldoff_s,heap) **fieldstack, ++push_fields_onto_fieldstack (tree type, VEC(fieldoff_s,heap) **fieldstack, + HOST_WIDE_INT offset, bool *has_union) + { + tree field; + int count = 0; +- ++ + if (TREE_CODE (type) == COMPLEX_TYPE) + { + fieldoff_s *real_part, *img_part; +@@ -3700,13 +3670,13 @@ + real_part->size = TYPE_SIZE (TREE_TYPE (type)); + real_part->offset = offset; + real_part->decl = NULL_TREE; +- ++ + img_part = VEC_safe_push (fieldoff_s, heap, *fieldstack, NULL); + img_part->type = TREE_TYPE (type); + img_part->size = TYPE_SIZE (TREE_TYPE (type)); + img_part->offset = offset + TREE_INT_CST_LOW (TYPE_SIZE (TREE_TYPE (type))); + img_part->decl = NULL_TREE; +- ++ + return 2; + } + +@@ -3733,12 +3703,12 @@ + { + bool push = false; + int pushed = 0; +- +- if (has_union ++ ++ if (has_union + && (TREE_CODE (TREE_TYPE (type)) == QUAL_UNION_TYPE + || TREE_CODE (TREE_TYPE (type)) == UNION_TYPE)) + *has_union = true; +- ++ + if (!AGGREGATE_TYPE_P (TREE_TYPE (type))) /* var_can_have_subvars */ + push = true; + else if (!(pushed = push_fields_onto_fieldstack +@@ -3772,12 +3742,12 @@ + { + bool push = false; + int pushed = 0; +- +- if (has_union ++ ++ if (has_union + && (TREE_CODE (TREE_TYPE (field)) == QUAL_UNION_TYPE + || TREE_CODE (TREE_TYPE (field)) == UNION_TYPE)) + *has_union = true; +- ++ + if (!var_can_have_subvars (field)) + push = true; + else if (!(pushed = push_fields_onto_fieldstack +@@ -3789,7 +3759,7 @@ + see if we didn't push any subfields and the size is + nonzero, push the field onto the stack */ + push = true; +- ++ + if (push) + { + fieldoff_s *pair; +@@ -3848,15 +3818,15 @@ + unsigned int i = 0; + tree t; + +- for (t = TYPE_ARG_TYPES (TREE_TYPE (decl)); ++ for (t = TYPE_ARG_TYPES (TREE_TYPE (decl)); + t; + t = TREE_CHAIN (t)) +- { ++ { + if (TREE_VALUE (t) == void_type_node) + break; + i++; + } +- ++ + if (!t) + *is_varargs = true; + return i; +@@ -3870,19 +3840,19 @@ + { + unsigned int index = VEC_length (varinfo_t, varmap); + varinfo_t vi; +- tree arg; ++ tree arg; + unsigned int i; + bool is_varargs = false; + + /* Create the variable info. */ + +- vi = new_var_info (decl, index, name, index); ++ vi = new_var_info (decl, index, name); + vi->decl = decl; + vi->offset = 0; + vi->has_union = 0; + vi->size = 1; + vi->fullsize = count_num_arguments (decl, &is_varargs) + 1; +- insert_id_for_tree (vi->decl, index); ++ insert_vi_for_tree (vi->decl, vi); + VEC_safe_push (varinfo_t, heap, varmap, vi); + + stats.total_vars++; +@@ -3898,12 +3868,12 @@ + return index; + } + +- ++ + arg = DECL_ARGUMENTS (decl); + + /* Set up variables for each argument. */ + for (i = 1; i < vi->fullsize; i++) +- { ++ { + varinfo_t argvi; + const char *newname; + char *tempname; +@@ -3912,13 +3882,13 @@ + + if (arg) + argdecl = arg; +- ++ + newindex = VEC_length (varinfo_t, varmap); + asprintf (&tempname, "%s.arg%d", name, i-1); + newname = ggc_strdup (tempname); + free (tempname); + +- argvi = new_var_info (argdecl, newindex,newname, newindex); ++ argvi = new_var_info (argdecl, newindex, newname); + argvi->decl = argdecl; + VEC_safe_push (varinfo_t, heap, varmap, argvi); + argvi->offset = i; +@@ -3929,7 +3899,7 @@ + stats.total_vars ++; + if (arg) + { +- insert_id_for_tree (arg, newindex); ++ insert_vi_for_tree (arg, argvi); + arg = TREE_CHAIN (arg); + } + } +@@ -3948,13 +3918,13 @@ + + if (DECL_RESULT (decl)) + resultdecl = DECL_RESULT (decl); +- ++ + newindex = VEC_length (varinfo_t, varmap); + asprintf (&tempname, "%s.result", name); + newname = ggc_strdup (tempname); + free (tempname); + +- resultvi = new_var_info (resultdecl, newindex, newname, newindex); ++ resultvi = new_var_info (resultdecl, newindex, newname); + resultvi->decl = resultdecl; + VEC_safe_push (varinfo_t, heap, varmap, resultvi); + resultvi->offset = i; +@@ -3964,13 +3934,13 @@ + insert_into_field_list_sorted (vi, resultvi); + stats.total_vars ++; + if (DECL_RESULT (decl)) +- insert_id_for_tree (DECL_RESULT (decl), newindex); ++ insert_vi_for_tree (DECL_RESULT (decl), resultvi); + } + return index; +-} ++} + + +-/* Return true if FIELDSTACK contains fields that overlap. ++/* Return true if FIELDSTACK contains fields that overlap. + FIELDSTACK is assumed to be sorted by offset. */ + + static bool +@@ -4057,12 +4027,12 @@ + bool hasunion; + bool is_global = DECL_P (decl) ? is_global_var (decl) : false; + VEC (fieldoff_s,heap) *fieldstack = NULL; +- ++ + if (TREE_CODE (decl) == FUNCTION_DECL && in_ipa_mode) + return create_function_info_for (decl, name); + + hasunion = TREE_CODE (decltype) == UNION_TYPE +- || TREE_CODE (decltype) == QUAL_UNION_TYPE; ++ || TREE_CODE (decltype) == QUAL_UNION_TYPE; + if (var_can_have_subvars (decl) && use_field_sensitive && !hasunion) + { + push_fields_onto_fieldstack (decltype, &fieldstack, 0, &hasunion); +@@ -4072,12 +4042,12 @@ + notokay = true; + } + } +- + ++ + /* If the variable doesn't have subvars, we may end up needing to + sort the field list and create fake variables for all the + fields. */ +- vi = new_var_info (decl, index, name, index); ++ vi = new_var_info (decl, index, name); + vi->decl = decl; + vi->offset = 0; + vi->has_union = hasunion; +@@ -4095,8 +4065,8 @@ + vi->fullsize = TREE_INT_CST_LOW (declsize); + vi->size = vi->fullsize; + } +- +- insert_id_for_tree (vi->decl, index); ++ ++ insert_vi_for_tree (vi->decl, vi); + VEC_safe_push (varinfo_t, heap, varmap, vi); + if (is_global && (!flag_whole_program || !in_ipa_mode)) + { +@@ -4122,9 +4092,9 @@ + } + + stats.total_vars++; +- if (use_field_sensitive +- && !notokay +- && !vi->is_unknown_size_var ++ if (use_field_sensitive ++ && !notokay ++ && !vi->is_unknown_size_var + && var_can_have_subvars (decl) + && VEC_length (fieldoff_s, fieldstack) <= MAX_FIELDS_FOR_FIELD_SENSITIVE) + { +@@ -4148,7 +4118,7 @@ + without creating varinfos for the fields anyway, so sorting them is a + waste to boot. */ + if (!notokay) +- { ++ { + sort_fieldstack (fieldstack); + /* Due to some C++ FE issues, like PR 22488, we might end up + what appear to be overlapping fields even though they, +@@ -4156,8 +4126,8 @@ + we will simply disable field-sensitivity for these cases. */ + notokay = check_for_overlaps (fieldstack); + } +- +- ++ ++ + if (VEC_length (fieldoff_s, fieldstack) != 0) + fo = VEC_index (fieldoff_s, fieldstack, 0); + +@@ -4169,11 +4139,11 @@ + VEC_free (fieldoff_s, heap, fieldstack); + return index; + } +- ++ + vi->size = TREE_INT_CST_LOW (fo->size); + vi->offset = fo->offset; +- for (i = VEC_length (fieldoff_s, fieldstack) - 1; +- i >= 1 && VEC_iterate (fieldoff_s, fieldstack, i, fo); ++ for (i = VEC_length (fieldoff_s, fieldstack) - 1; ++ i >= 1 && VEC_iterate (fieldoff_s, fieldstack, i, fo); + i--) + { + varinfo_t newvi; +@@ -4184,15 +4154,15 @@ + if (dump_file) + { + if (fo->decl) +- asprintf (&tempname, "%s.%s", ++ asprintf (&tempname, "%s.%s", + vi->name, alias_get_name (fo->decl)); + else +- asprintf (&tempname, "%s." HOST_WIDE_INT_PRINT_DEC, ++ asprintf (&tempname, "%s." HOST_WIDE_INT_PRINT_DEC, + vi->name, fo->offset); + newname = ggc_strdup (tempname); + free (tempname); + } +- newvi = new_var_info (decl, newindex, newname, newindex); ++ newvi = new_var_info (decl, newindex, newname); + newvi->offset = fo->offset; + newvi->size = TREE_INT_CST_LOW (fo->size); + newvi->fullsize = vi->fullsize; +@@ -4228,14 +4198,22 @@ + { + varinfo_t vi = get_varinfo (var); + unsigned int i; +- bitmap_iterator bi; +- +- fprintf (file, "%s = { ", vi->name); +- EXECUTE_IF_SET_IN_BITMAP (get_varinfo (vi->node)->solution, 0, i, bi) ++ bitmap_iterator bi; ++ ++ if (find (var) != var) + { +- fprintf (file, "%s ", get_varinfo (i)->name); ++ varinfo_t vipt = get_varinfo (find (var)); ++ fprintf (file, "%s = same as %s\n", vi->name, vipt->name); + } +- fprintf (file, "}\n"); ++ else ++ { ++ fprintf (file, "%s = { ", vi->name); ++ EXECUTE_IF_SET_IN_BITMAP (vi->solution, 0, i, bi) ++ { ++ fprintf (file, "%s ", get_varinfo (i)->name); ++ } ++ fprintf (file, "}\n"); ++ } + } + + /* Print the points-to solution for VAR to stdout. */ +@@ -4266,7 +4244,7 @@ + if (!could_have_pointers (t)) + continue; + +- arg_id = get_id_for_tree (t); ++ arg_id = get_vi_for_tree (t)->id; + + /* With flag_argument_noalias greater than two means that the incoming + argument cannot alias anything except for itself so create a HEAP +@@ -4276,11 +4254,10 @@ + { + varinfo_t vi; + tree heapvar = heapvar_lookup (t); +- unsigned int id; + + lhs.offset = 0; + lhs.type = SCALAR; +- lhs.var = get_id_for_tree (t); ++ lhs.var = get_vi_for_tree (t)->id; + + if (heapvar == NULL_TREE) + { +@@ -4291,11 +4268,11 @@ + add_referenced_var (heapvar); + heapvar_insert (t, heapvar); + } +- id = get_id_for_tree (heapvar); +- vi = get_varinfo (id); ++ ++ vi = get_vi_for_tree (heapvar); + vi->is_artificial_var = 1; + vi->is_heap_var = 1; +- rhs.var = id; ++ rhs.var = vi->id; + rhs.type = ADDRESSOF; + rhs.offset = 0; + for (p = get_varinfo (lhs.var); p; p = p->next) +@@ -4409,8 +4386,8 @@ + bool + find_what_p_points_to (tree p) + { +- unsigned int id = 0; + tree lookup_p = p; ++ varinfo_t vi; + + if (!have_alias_info) + return false; +@@ -4422,10 +4399,10 @@ + && default_def (SSA_NAME_VAR (p)) == p) + lookup_p = SSA_NAME_VAR (p); + +- if (lookup_id_for_tree (lookup_p, &id)) ++ vi = lookup_vi_for_tree (lookup_p); ++ if (vi) + { +- varinfo_t vi = get_varinfo (id); +- ++ + if (vi->is_artificial_var) + return false; + +@@ -4447,7 +4424,7 @@ + + /* This variable may have been collapsed, let's get the real + variable. */ +- vi = get_varinfo (vi->node); ++ vi = get_varinfo (find (vi->id)); + + /* Translate artificial variables into SSA_NAME_PTR_INFO + attributes. */ +@@ -4506,13 +4483,16 @@ + { + fprintf (outfile, "Stats:\n"); + fprintf (outfile, "Total vars: %d\n", stats.total_vars); ++ fprintf (outfile, "Non-pointer vars: %d\n", ++ stats.nonpointer_vars); + fprintf (outfile, "Statically unified vars: %d\n", + stats.unified_vars_static); +- fprintf (outfile, "Collapsed vars: %d\n", stats.collapsed_vars); + fprintf (outfile, "Dynamically unified vars: %d\n", + stats.unified_vars_dynamic); + fprintf (outfile, "Iterations: %d\n", stats.iterations); + fprintf (outfile, "Number of edges: %d\n", stats.num_edges); ++ fprintf (outfile, "Number of implicit edges: %d\n", ++ stats.num_implicit_edges); + } + + for (i = 0; i < VEC_length (varinfo_t, varmap); i++) +@@ -4540,8 +4520,8 @@ + /* Create the NULL variable, used to represent that a variable points + to NULL. */ + nothing_tree = create_tmp_var_raw (void_type_node, "NULL"); +- var_nothing = new_var_info (nothing_tree, 0, "NULL", 0); +- insert_id_for_tree (nothing_tree, 0); ++ var_nothing = new_var_info (nothing_tree, 0, "NULL"); ++ insert_vi_for_tree (nothing_tree, var_nothing); + var_nothing->is_artificial_var = 1; + var_nothing->offset = 0; + var_nothing->size = ~0; +@@ -4553,8 +4533,8 @@ + /* Create the ANYTHING variable, used to represent that a variable + points to some unknown piece of memory. */ + anything_tree = create_tmp_var_raw (void_type_node, "ANYTHING"); +- var_anything = new_var_info (anything_tree, 1, "ANYTHING", 1); +- insert_id_for_tree (anything_tree, 1); ++ var_anything = new_var_info (anything_tree, 1, "ANYTHING"); ++ insert_vi_for_tree (anything_tree, var_anything); + var_anything->is_artificial_var = 1; + var_anything->size = ~0; + var_anything->offset = 0; +@@ -4573,7 +4553,6 @@ + rhs.type = ADDRESSOF; + rhs.var = anything_id; + rhs.offset = 0; +- var_anything->address_taken = true; + + /* This specifically does not use process_constraint because + process_constraint ignores all anything = anything constraints, since all +@@ -4583,14 +4562,14 @@ + /* Create the READONLY variable, used to represent that a variable + points to readonly memory. */ + readonly_tree = create_tmp_var_raw (void_type_node, "READONLY"); +- var_readonly = new_var_info (readonly_tree, 2, "READONLY", 2); ++ var_readonly = new_var_info (readonly_tree, 2, "READONLY"); + var_readonly->is_artificial_var = 1; + var_readonly->offset = 0; + var_readonly->size = ~0; + var_readonly->fullsize = ~0; + var_readonly->next = NULL; + var_readonly->is_special_var = 1; +- insert_id_for_tree (readonly_tree, 2); ++ insert_vi_for_tree (readonly_tree, var_readonly); + readonly_id = 2; + VEC_safe_push (varinfo_t, heap, varmap, var_readonly); + +@@ -4610,8 +4589,8 @@ + /* Create the INTEGER variable, used to represent that a variable points + to an INTEGER. */ + integer_tree = create_tmp_var_raw (void_type_node, "INTEGER"); +- var_integer = new_var_info (integer_tree, 3, "INTEGER", 3); +- insert_id_for_tree (integer_tree, 3); ++ var_integer = new_var_info (integer_tree, 3, "INTEGER"); ++ insert_vi_for_tree (integer_tree, var_integer); + var_integer->is_artificial_var = 1; + var_integer->size = ~0; + var_integer->fullsize = ~0; +@@ -4634,8 +4613,8 @@ + /* Create the ESCAPED_VARS variable used to represent variables that + escape this function. */ + escaped_vars_tree = create_tmp_var_raw (void_type_node, "ESCAPED_VARS"); +- var_escaped_vars = new_var_info (escaped_vars_tree, 4, "ESCAPED_VARS", 4); +- insert_id_for_tree (escaped_vars_tree, 4); ++ var_escaped_vars = new_var_info (escaped_vars_tree, 4, "ESCAPED_VARS"); ++ insert_vi_for_tree (escaped_vars_tree, var_escaped_vars); + var_escaped_vars->is_artificial_var = 1; + var_escaped_vars->size = ~0; + var_escaped_vars->fullsize = ~0; +@@ -4660,21 +4639,19 @@ + static void + init_alias_vars (void) + { +- bitmap_obstack_initialize (&ptabitmap_obstack); ++ bitmap_obstack_initialize (&pta_obstack); ++ bitmap_obstack_initialize (&oldpta_obstack); + bitmap_obstack_initialize (&predbitmap_obstack); + +- constraint_pool = create_alloc_pool ("Constraint pool", ++ constraint_pool = create_alloc_pool ("Constraint pool", + sizeof (struct constraint), 30); + variable_info_pool = create_alloc_pool ("Variable info pool", + sizeof (struct variable_info), 30); +- constraint_edge_pool = create_alloc_pool ("Constraint edges", +- sizeof (struct constraint_edge), 30); +- + constraints = VEC_alloc (constraint_t, heap, 8); + varmap = VEC_alloc (varinfo_t, heap, 8); +- id_for_tree = htab_create (10, tree_id_hash, tree_id_eq, free); ++ vi_for_tree = pointer_map_create (); ++ + memset (&stats, 0, sizeof (stats)); +- + init_base_vars (); + } + +@@ -4777,6 +4754,43 @@ + VEC_free (ce_s, heap, rhsc); + } + ++ ++/* Remove the REF and ADDRESS edges from GRAPH, as well as all the ++ predecessor edges. */ ++ ++static void ++remove_preds_and_fake_succs (constraint_graph_t graph) ++{ ++ unsigned int i; ++ ++ /* Clear the implicit ref and address nodes from the successor ++ lists. */ ++ for (i = 0; i < FIRST_REF_NODE; i++) ++ { ++ if (graph->succs[i]) ++ bitmap_clear_range (graph->succs[i], FIRST_REF_NODE, ++ FIRST_REF_NODE * 2); ++ } ++ ++ /* Free the successor list for the non-ref nodes. */ ++ for (i = FIRST_REF_NODE; i < graph->size; i++) ++ { ++ if (graph->succs[i]) ++ BITMAP_FREE (graph->succs[i]); ++ } ++ ++ /* Now reallocate the size of the successor list as, and blow away ++ the predecessor bitmaps. */ ++ graph->size = VEC_length (varinfo_t, varmap); ++ graph->succs = xrealloc (graph->succs, graph->size * sizeof (bitmap)); ++ ++ free (graph->implicit_preds); ++ graph->implicit_preds = NULL; ++ free (graph->preds); ++ graph->preds = NULL; ++ bitmap_obstack_release (&predbitmap_obstack); ++} ++ + /* Create points-to sets for the current function. See the comments + at the start of the file for an algorithmic overview. */ + +@@ -4784,11 +4798,13 @@ + compute_points_to_sets (struct alias_info *ai) + { + basic_block bb; ++ struct scc_info *si; + + timevar_push (TV_TREE_PTA); + + init_alias_vars (); +- ++ init_alias_heapvars (); ++ + intra_create_variable_infos (); + + /* Now walk all statements and derive aliases. */ +@@ -4824,36 +4840,42 @@ + } + } + +- build_constraint_graph (); + + if (dump_file) + { + fprintf (dump_file, "Points-to analysis\n\nConstraints:\n\n"); + dump_constraints (dump_file); + } +- ++ + if (dump_file) + fprintf (dump_file, + "\nCollapsing static cycles and doing variable " + "substitution:\n"); +- +- find_and_collapse_graph_cycles (graph, false); +- perform_var_substitution (graph); +- ++ ++ build_pred_graph (); ++ si = perform_var_substitution (graph); ++ move_complex_constraints (graph, si); ++ free_var_substitution_info (si); ++ ++ build_succ_graph (); ++ find_indirect_cycles (graph); ++ ++ /* Implicit nodes and predecessors are no longer necessary at this ++ point. */ ++ remove_preds_and_fake_succs (graph); ++ + if (dump_file) + fprintf (dump_file, "\nSolving graph:\n"); +- ++ + solve_graph (graph); +- ++ + if (dump_file) + dump_sa_points_to_info (dump_file); +- + have_alias_info = true; + + timevar_pop (TV_TREE_PTA); + } + +- + /* Delete created points-to sets. */ + + void +@@ -4861,33 +4883,27 @@ + { + varinfo_t v; + int i; +- +- htab_delete (id_for_tree); +- bitmap_obstack_release (&ptabitmap_obstack); +- bitmap_obstack_release (&predbitmap_obstack); ++ ++ if (dump_file && (dump_flags & TDF_STATS)) ++ fprintf (dump_file, "Points to sets created:%d\n", ++ stats.points_to_sets_created); ++ ++ pointer_map_destroy (vi_for_tree); ++ bitmap_obstack_release (&pta_obstack); + VEC_free (constraint_t, heap, constraints); +- ++ + for (i = 0; VEC_iterate (varinfo_t, varmap, i, v); i++) +- { +- /* Nonlocal vars may add more varinfos. */ +- if (i >= graph_size) +- break; ++ VEC_free (constraint_t, heap, graph->complex[i]); ++ free (graph->complex); + +- VEC_free (constraint_edge_t, heap, graph->succs[i]); +- VEC_free (constraint_edge_t, heap, graph->preds[i]); +- VEC_free (constraint_t, heap, v->complex); +- } +- free (graph->zero_weight_preds); +- free (graph->zero_weight_succs); ++ free (graph->rep); + free (graph->succs); +- free (graph->preds); ++ free (graph->indirect_cycles); + free (graph); + + VEC_free (varinfo_t, heap, varmap); + free_alloc_pool (variable_info_pool); +- free_alloc_pool (constraint_pool); +- free_alloc_pool (constraint_edge_pool); +- ++ free_alloc_pool (constraint_pool); + have_alias_info = false; + } + +@@ -4905,6 +4921,7 @@ + static unsigned int + ipa_pta_execute (void) + { ++#if 0 + struct cgraph_node *node; + in_ipa_mode = 1; + init_alias_heapvars (); +@@ -4994,6 +5011,7 @@ + in_ipa_mode = 0; + delete_alias_heapvars (); + delete_points_to_sets (); ++#endif + return 0; + } + +@@ -5018,8 +5036,9 @@ + void + init_alias_heapvars (void) + { +- heapvar_for_stmt = htab_create_ggc (11, tree_map_hash, tree_map_eq, +- NULL); ++ if (!heapvar_for_stmt) ++ heapvar_for_stmt = htab_create_ggc (11, tree_map_hash, tree_map_eq, ++ NULL); + nonlocal_all = NULL_TREE; + } + +@@ -5028,7 +5047,7 @@ + { + nonlocal_all = NULL_TREE; + htab_delete (heapvar_for_stmt); ++ heapvar_for_stmt = NULL; + } +- + + #include "gt-tree-ssa-structalias.h" hunk ./source/devel/gcc/FrugalBuild 6 -pkgrel=3 +pkgrel=4 hunk ./source/devel/gcc/FrugalBuild 18 - README.Frugalware) -signatures=("$source.sig" '' '') + README.Frugalware 125227.diff) +signatures=("$source.sig" '' '' '') } From crazy at frugalware.org Sat Jun 2 13:32:43 2007 From: crazy at frugalware.org (crazy) Date: Sat Jun 2 13:32:46 2007 Subject: [Frugalware-darcs] frugalware-current: xorg-server-1.2.0-3-i686 Message-ID: <20070602113243.C0ECA1768120@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070602112220-f6986-158fd40c1b7198b10c13a2d620f72ab8bdd5feb7.gz; [xorg-server-1.2.0-3-i686 crazy **20070602112220 * rebuild with new mesa * removed patches are in upstream now * added 2 new patches to make it work with new mesa * TEMP gcc 4.2.0 workaround , to be removed in next relbump ] { hunk ./source/x11/xorg-server/FrugalBuild 6 -pkgrel=2 -mesaver=6.5.2 +pkgrel=3 +mesaver=6.5.3 hunk ./source/x11/xorg-server/FrugalBuild 13 - 'libxi>=1.1.0' 'freetype2>=2.3.1' 'mesa>=6.5.2-1' 'font-cursor-misc' 'font-misc-misc' \ + 'libxi>=1.1.0' 'freetype2>=2.3.1' 'mesa>=6.5.3-1' 'font-cursor-misc' 'font-misc-misc' \ hunk ./source/x11/xorg-server/FrugalBuild 21 - 'glproto' 'xf86driproto' 'libdrm>=2.3.0' 'printproto' 'mkfontdir' 'mkfontscale>=1.0.3' \ + 'glproto' 'xf86driproto' 'libdrm>=2.3.0-2' 'printproto' 'mkfontdir' 'mkfontscale>=1.0.3' \ hunk ./source/x11/xorg-server/FrugalBuild 40 - i915tex.patch \ - bug-9045.patch \ - bug-9237.patch \ hunk ./source/x11/xorg-server/FrugalBuild 42 + mesa-6.5.3.patch \ + remove__GLinterface.patch \ hunk ./source/x11/xorg-server/FrugalBuild 57 - Fpatch i915tex.patch - Fpatch bug-9045.patch - Fpatch bug-9237.patch hunk ./source/x11/xorg-server/FrugalBuild 67 - ## this disables AIGLX by default , comment it to enable + ## this disables AIGLX by default , uncomment it to enable hunk ./source/x11/xorg-server/FrugalBuild 74 + ## as always xorg devels -> <-mesa devels mess .. + Fpatch mesa-6.5.3.patch + Fpatch remove__GLinterface.patch + ## GCC 4.2.0 bug do **NOT** remove this hack or it will kill your box!! + ## http://gcc.gnu.org/bugzilla/show_bug.cgi?id=30052 + echo 'CFLAGS = @CFLAGS@ -O0' >> hw/xfree86/scanpci/Makefile.am hunk ./source/x11/xorg-server/FrugalBuild 118 - 'ba860bb6ee57c02202342dfd5927464a068ea18f'\ + '8ab86e54976752028fbffcc21a9e0d2ebefeeff4'\ hunk ./source/x11/xorg-server/FrugalBuild 125 - 'b49bb4f22426fd0dab7551ef8907276214c9a3fa'\ + 'f7f706ec568a80543c6d6096b3d8a833b80399ed'\ hunk ./source/x11/xorg-server/FrugalBuild 129 - '067931e73ffd718f0715ddd69040c660821083d8'\ - 'af385a1f28afb4368719c634b4fb5d3991e9e432'\ - '9d0d4102b26962cc453c4d66f5638f0cfb33c4fd'\ hunk ./source/x11/xorg-server/FrugalBuild 131 + 'f257b56953e9756d38aa01c7f7f5d9a13160576c'\ + '6473a13b65db3e44ba8b369a6a9c667887c41a52'\ hunk ./source/x11/xorg-server/bug-9045.patch 1 -From: Xiang, Haihao -Date: Fri, 8 Dec 2006 09:00:59 +0000 (+0800) -Subject: fix bug#9045 -X-Git-Url: http://gitweb.freedesktop.org/?p=mesa/mesa.git;a=commitdiff;h=5449f5a97524cb21194b20d05449d7211faaa51c - -fix bug#9045 ---- - ---- a/src/mesa/drivers/dri/i965/intel_ioctl.c -+++ b/src/mesa/drivers/dri/i965/intel_ioctl.c -@@ -75,7 +75,7 @@ void intelWaitIrq( struct intel_context - { - if (!intel->no_hw) { - drmI830IrqWait iw; -- int ret; -+ int ret, lastdispatch; - - if (0) - fprintf(stderr, "%s %d\n", __FUNCTION__, seq ); -@@ -83,11 +83,12 @@ void intelWaitIrq( struct intel_context - iw.irq_seq = seq; - - do { -+ lastdispatch = intel->sarea->last_dispatch; - ret = drmCommandWrite( intel->driFd, DRM_I830_IRQ_WAIT, &iw, sizeof(iw) ); - - /* This seems quite often to return before it should!?! - */ -- } while (ret == -EAGAIN || ret == -EINTR || (ret == 0 && seq > intel->sarea->last_dispatch)); -+ } while (ret == -EAGAIN || ret == -EINTR || (ret == -EBUSY && lastdispatch != intel->sarea->last_dispatch) || (ret == 0 && seq > intel->sarea->last_dispatch)); - - - if ( ret ) { - rmfile ./source/x11/xorg-server/bug-9045.patch hunk ./source/x11/xorg-server/bug-9237.patch 1 -From: Xiang, Haihao -Date: Fri, 8 Dec 2006 09:05:14 +0000 (+0800) -Subject: fix bug#9237 -X-Git-Url: http://gitweb.freedesktop.org/?p=mesa/mesa.git;a=commitdiff;h=f79360858d4c94629ef543a35e4e44a13419ac0e - -fix bug#9237 ---- - ---- a/src/mesa/drivers/dri/i965/brw_misc_state.c -+++ b/src/mesa/drivers/dri/i965/brw_misc_state.c -@@ -88,10 +88,10 @@ static void upload_drawing_rect(struct b - if (brw->intel.numClipRects > 1) - return; - -- x1 = dPriv->x; -- y1 = dPriv->y; -- x2 = dPriv->x + dPriv->w; -- y2 = dPriv->y + dPriv->h; -+ x1 = brw->intel.pClipRects[0].x1; -+ y1 = brw->intel.pClipRects[0].y1; -+ x2 = brw->intel.pClipRects[0].x2; -+ y2 = brw->intel.pClipRects[0].y2; - - if (x1 < 0) x1 = 0; - if (y1 < 0) y1 = 0; - rmfile ./source/x11/xorg-server/bug-9237.patch hunk ./source/x11/xorg-server/i915tex.patch 1 -From: Michel DÃ?nzer -Date: Thu, 7 Dec 2006 10:03:48 +0000 (+0100) -Subject: i915tex: Recalculate viewport related hardware state in intelWindowMoved(). -X-Git-Url: http://gitweb.freedesktop.org/?p=mesa/mesa.git;a=commitdiff;h=7a10d66590a4cebd2b453218e75fe82b02a3edcc - -i915tex: Recalculate viewport related hardware state in intelWindowMoved(). - -This fixes vertically displaced rendering with some apps like Google Earth. - -Simplify other parts of the function somewhat. ---- - ---- a/src/mesa/drivers/dri/i915tex/intel_buffers.c -+++ b/src/mesa/drivers/dri/i915tex/intel_buffers.c -@@ -36,6 +36,7 @@ - #include "intel_batchbuffer.h" - #include "context.h" - #include "utils.h" -+#include "drirenderbuffer.h" - #include "framebuffer.h" - #include "swrast/swrast.h" - #include "vblank.h" -@@ -183,6 +184,8 @@ void - intelWindowMoved(struct intel_context *intel) - { - GLcontext *ctx = &intel->ctx; -+ __DRIdrawablePrivate *dPriv = intel->driDrawable; -+ GLframebuffer *drawFb = (GLframebuffer *) dPriv->driverPrivate; - - if (!intel->ctx.DrawBuffer) { - /* when would this happen? -BP */ -@@ -194,7 +197,7 @@ intelWindowMoved(struct intel_context *i - } - else { - /* drawing to a window */ -- switch (intel->ctx.DrawBuffer->_ColorDrawBufferMask[0]) { -+ switch (drawFb->_ColorDrawBufferMask[0]) { - case BUFFER_BIT_FRONT_LEFT: - intelSetFrontClipRects(intel); - break; -@@ -207,14 +210,11 @@ intelWindowMoved(struct intel_context *i - } - } - -- /* this update Mesa's notion of window size */ -- if (ctx->WinSysDrawBuffer) { -- _mesa_resize_framebuffer(ctx, ctx->WinSysDrawBuffer, -- intel->driDrawable->w, intel->driDrawable->h); -- } -+ /* Update Mesa's notion of window size */ -+ driUpdateFramebufferSize(ctx, dPriv); -+ drawFb->Initialized = GL_TRUE; /* XXX remove someday */ - -- if (intel->intelScreen->driScrnPriv->ddxMinor >= 7 && intel->driDrawable) { -- __DRIdrawablePrivate *dPriv = intel->driDrawable; -+ if (intel->intelScreen->driScrnPriv->ddxMinor >= 7) { - drmI830Sarea *sarea = intel->sarea; - drm_clip_rect_t drw_rect = { .x1 = dPriv->x, .x2 = dPriv->x + dPriv->w, - .y1 = dPriv->y, .y2 = dPriv->y + dPriv->h }; -@@ -245,6 +245,9 @@ intelWindowMoved(struct intel_context *i - /* Update hardware scissor */ - ctx->Driver.Scissor(ctx, ctx->Scissor.X, ctx->Scissor.Y, - ctx->Scissor.Width, ctx->Scissor.Height); -+ -+ /* Re-calculate viewport related state */ -+ ctx->Driver.DepthRange( ctx, ctx->Viewport.Near, ctx->Viewport.Far ); - } rmfile ./source/x11/xorg-server/i915tex.patch addfile ./source/x11/xorg-server/mesa-6.5.3.patch hunk ./source/x11/xorg-server/mesa-6.5.3.patch 1 +diff -Naur xorg-server-X11R7.2-1.2.0/configure.ac xorg-server-X11R7.2-1.2.0-p/configure.ac +--- xorg-server-X11R7.2-1.2.0/configure.ac 2007-01-23 05:53:24.000000000 +0100 ++++ xorg-server-X11R7.2-1.2.0-p/configure.ac 2007-06-02 03:23:55.000000000 +0200 +@@ -1690,6 +1690,7 @@ + GL/mesa/swrast/Makefile + GL/mesa/swrast_setup/Makefile + GL/mesa/tnl/Makefile ++GL/mesa/vbo/Makefile + GL/mesa/X/Makefile + include/Makefile + afb/Makefile +diff -Naur xorg-server-X11R7.2-1.2.0/GL/mesa/glapi/Makefile.am xorg-server-X11R7.2-1.2.0-p/GL/mesa/glapi/Makefile.am +--- xorg-server-X11R7.2-1.2.0/GL/mesa/glapi/Makefile.am 2007-01-23 04:13:14.000000000 +0100 ++++ xorg-server-X11R7.2-1.2.0-p/GL/mesa/glapi/Makefile.am 2007-06-02 03:23:55.000000000 +0200 +@@ -7,7 +7,6 @@ + + INCLUDES = -I@MESA_SOURCE@/include \ + -I../X \ +- -I../array_cache \ + -I../glapi \ + -I../main \ + -I../math \ +diff -Naur xorg-server-X11R7.2-1.2.0/GL/mesa/main/Makefile.am xorg-server-X11R7.2-1.2.0-p/GL/mesa/main/Makefile.am +--- xorg-server-X11R7.2-1.2.0/GL/mesa/main/Makefile.am 2007-01-23 04:13:14.000000000 +0100 ++++ xorg-server-X11R7.2-1.2.0-p/GL/mesa/main/Makefile.am 2007-06-02 03:23:55.000000000 +0200 +@@ -7,7 +7,6 @@ + + INCLUDES = -I@MESA_SOURCE@/include \ + -I../X \ +- -I../array_cache \ + -I../glapi \ + -I../main \ + -I../math \ +@@ -62,13 +61,14 @@ + matrix.c \ + mipmap.c \ + mm.c \ +- occlude.c \ + pixel.c \ + points.c \ + polygon.c \ ++ queryobj.c \ + rastpos.c \ + rbadaptors.c \ + renderbuffer.c \ ++ shaders.c \ + state.c \ + stencil.c \ + texcompress.c \ +diff -Naur xorg-server-X11R7.2-1.2.0/GL/mesa/Makefile.am xorg-server-X11R7.2-1.2.0-p/GL/mesa/Makefile.am +--- xorg-server-X11R7.2-1.2.0/GL/mesa/Makefile.am 2007-01-23 04:13:14.000000000 +0100 ++++ xorg-server-X11R7.2-1.2.0-p/GL/mesa/Makefile.am 2007-06-02 03:23:55.000000000 +0200 +@@ -1,15 +1,15 @@ +-SUBDIRS = main math array_cache swrast swrast_setup tnl shader X glapi ++SUBDIRS = main math swrast swrast_setup tnl shader X glapi vbo + + noinst_LTLIBRARIES = libGLcore.la + + libGLcore_la_SOURCES = dummy.c + libGLcore_la_LIBADD = main/libmain.la \ + math/libmath.la \ +- array_cache/libac.la \ + swrast/libswrast.la \ + swrast_setup/libss.la \ + tnl/libtnl.la \ + shader/libshader.la \ + shader/grammar/libgrammar.la \ + shader/slang/libslang.la \ ++ vbo/libvbo.la \ + X/libX.la +diff -Naur xorg-server-X11R7.2-1.2.0/GL/mesa/math/Makefile.am xorg-server-X11R7.2-1.2.0-p/GL/mesa/math/Makefile.am +--- xorg-server-X11R7.2-1.2.0/GL/mesa/math/Makefile.am 2007-01-23 04:13:14.000000000 +0100 ++++ xorg-server-X11R7.2-1.2.0-p/GL/mesa/math/Makefile.am 2007-06-02 03:23:55.000000000 +0200 +@@ -7,7 +7,6 @@ + + INCLUDES = -I@MESA_SOURCE@/include \ + -I../X \ +- -I../array_cache \ + -I../glapi \ + -I../main \ + -I../math \ +diff -Naur xorg-server-X11R7.2-1.2.0/GL/mesa/shader/grammar/Makefile.am xorg-server-X11R7.2-1.2.0-p/GL/mesa/shader/grammar/Makefile.am +--- xorg-server-X11R7.2-1.2.0/GL/mesa/shader/grammar/Makefile.am 2007-01-23 04:13:14.000000000 +0100 ++++ xorg-server-X11R7.2-1.2.0-p/GL/mesa/shader/grammar/Makefile.am 2007-06-02 03:23:55.000000000 +0200 +@@ -7,7 +7,6 @@ + + INCLUDES = -I@MESA_SOURCE@/include \ + -I../../X \ +- -I../../array_cache \ + -I../../glapi \ + -I../../main \ + -I../../math \ +diff -Naur xorg-server-X11R7.2-1.2.0/GL/mesa/shader/Makefile.am xorg-server-X11R7.2-1.2.0-p/GL/mesa/shader/Makefile.am +--- xorg-server-X11R7.2-1.2.0/GL/mesa/shader/Makefile.am 2007-01-23 04:13:14.000000000 +0100 ++++ xorg-server-X11R7.2-1.2.0-p/GL/mesa/shader/Makefile.am 2007-06-02 03:23:55.000000000 +0200 +@@ -9,7 +9,6 @@ + + INCLUDES = -I@MESA_SOURCE@/include \ + -I../X \ +- -I../array_cache \ + -I../glapi \ + -I../main \ + -I../math \ +@@ -28,8 +27,13 @@ + atifragshader.c \ + nvfragparse.c \ + nvprogram.c \ +- nvvertexec.c \ +- nvvertparse.c \ ++ nvvertparse.c \ ++ prog_debug.c \ ++ prog_execute.c \ ++ prog_instruction.c \ ++ prog_parameter.c \ ++ prog_print.c \ + program.c \ +- shaderobjects.c \ +- shaderobjects_3dlabs.c ++ programopt.c \ ++ prog_statevars.c \ ++ shader_api.c +diff -Naur xorg-server-X11R7.2-1.2.0/GL/mesa/shader/slang/Makefile.am xorg-server-X11R7.2-1.2.0-p/GL/mesa/shader/slang/Makefile.am +--- xorg-server-X11R7.2-1.2.0/GL/mesa/shader/slang/Makefile.am 2007-01-23 04:13:14.000000000 +0100 ++++ xorg-server-X11R7.2-1.2.0-p/GL/mesa/shader/slang/Makefile.am 2007-06-02 03:23:55.000000000 +0200 +@@ -8,7 +8,6 @@ + INCLUDES = -I@MESA_SOURCE@/include \ + -I../grammar \ + -I../../X \ +- -I../../array_cache \ + -I../../glapi \ + -I../../main \ + -I../../math \ +@@ -19,23 +18,24 @@ + -I../.. \ + -I$(top_srcdir)/hw/xfree86/os-support + +-nodist_libslang_la_SOURCES = slang_analyse.c \ +- slang_assemble_assignment.c \ +- slang_assemble.c \ +- slang_assemble_conditional.c \ +- slang_assemble_constructor.c \ +- slang_assemble_typeinfo.c \ ++nodist_libslang_la_SOURCES = slang_builtin.c \ ++ slang_codegen.c \ + slang_compile.c \ + slang_compile_function.c \ + slang_compile_operation.c \ + slang_compile_struct.c \ + slang_compile_variable.c \ +- slang_execute.c \ +- slang_execute_x86.c \ +- slang_export.c \ +- slang_library_texsample.c \ ++ slang_emit.c \ ++ slang_ir.c \ ++ slang_label.c \ + slang_library_noise.c \ + slang_link.c \ ++ slang_log.c \ ++ slang_mem.c \ + slang_preprocess.c \ ++ slang_print.c \ ++ slang_simplify.c \ + slang_storage.c \ +- slang_utility.c ++ slang_typeinfo.c \ ++ slang_utility.c \ ++ slang_vartable.c +diff -Naur xorg-server-X11R7.2-1.2.0/GL/mesa/swrast/Makefile.am xorg-server-X11R7.2-1.2.0-p/GL/mesa/swrast/Makefile.am +--- xorg-server-X11R7.2-1.2.0/GL/mesa/swrast/Makefile.am 2007-01-23 04:13:14.000000000 +0100 ++++ xorg-server-X11R7.2-1.2.0-p/GL/mesa/swrast/Makefile.am 2007-06-02 03:23:55.000000000 +0200 +@@ -7,7 +7,6 @@ + + INCLUDES = -I@MESA_SOURCE@/include \ + -I../X \ +- -I../array_cache \ + -I../glapi \ + -I../main \ + -I../math \ +@@ -24,7 +23,6 @@ + s_aatriangle.c \ + s_accum.c \ + s_alpha.c \ +- s_arbshader.c \ + s_atifragshader.c \ + s_bitmap.c \ + s_blend.c \ +@@ -36,11 +34,11 @@ + s_drawpix.c \ + s_feedback.c \ + s_fog.c \ ++ s_fragprog.c \ + s_imaging.c \ + s_lines.c \ + s_logic.c \ + s_masking.c \ +- s_nvfragprog.c \ + s_points.c \ + s_readpix.c \ + s_span.c \ +diff -Naur xorg-server-X11R7.2-1.2.0/GL/mesa/swrast_setup/Makefile.am xorg-server-X11R7.2-1.2.0-p/GL/mesa/swrast_setup/Makefile.am +--- xorg-server-X11R7.2-1.2.0/GL/mesa/swrast_setup/Makefile.am 2007-01-23 04:13:14.000000000 +0100 ++++ xorg-server-X11R7.2-1.2.0-p/GL/mesa/swrast_setup/Makefile.am 2007-06-02 03:23:55.000000000 +0200 +@@ -7,7 +7,6 @@ + + INCLUDES = -I@MESA_SOURCE@/include \ + -I../X \ +- -I../array_cache \ + -I../glapi \ + -I../main \ + -I../math \ +diff -Naur xorg-server-X11R7.2-1.2.0/GL/mesa/tnl/Makefile.am xorg-server-X11R7.2-1.2.0-p/GL/mesa/tnl/Makefile.am +--- xorg-server-X11R7.2-1.2.0/GL/mesa/tnl/Makefile.am 2007-01-23 04:13:14.000000000 +0100 ++++ xorg-server-X11R7.2-1.2.0-p/GL/mesa/tnl/Makefile.am 2007-06-02 03:23:55.000000000 +0200 +@@ -7,7 +7,6 @@ + + INCLUDES = -I@MESA_SOURCE@/include \ + -I../X \ +- -I../array_cache \ + -I../glapi \ + -I../main \ + -I../math \ +@@ -19,16 +18,9 @@ + -I.. \ + -I$(top_srcdir)/hw/xfree86/os-support + +-nodist_libtnl_la_SOURCES = t_array_api.c \ +- t_array_import.c \ +- t_context.c \ ++nodist_libtnl_la_SOURCES = t_context.c \ ++ t_draw.c \ + t_pipeline.c \ +- t_save_api.c \ +- t_save_loopback.c \ +- t_save_playback.c \ +- t_vb_arbprogram.c \ +- t_vb_arbprogram_sse.c \ +- t_vb_arbshader.c \ + t_vb_cull.c \ + t_vb_fog.c \ + t_vb_light.c \ +@@ -42,9 +34,4 @@ + t_vertex.c \ + t_vertex_generic.c \ + t_vertex_sse.c \ +- t_vp_build.c \ +- t_vtx_api.c \ +- t_vtx_eval.c \ +- t_vtx_exec.c \ +- t_vtx_generic.c \ +- t_vtx_x86.c ++ t_vp_build.c +diff -Naur xorg-server-X11R7.2-1.2.0/GL/mesa/vbo/Makefile.am xorg-server-X11R7.2-1.2.0-p/GL/mesa/vbo/Makefile.am +--- xorg-server-X11R7.2-1.2.0/GL/mesa/vbo/Makefile.am 1970-01-01 01:00:00.000000000 +0100 ++++ xorg-server-X11R7.2-1.2.0-p/GL/mesa/vbo/Makefile.am 2007-06-02 03:23:55.000000000 +0200 +@@ -0,0 +1,35 @@ ++noinst_LTLIBRARIES = libvbo.la ++ ++AM_CFLAGS = \ ++ $(DIX_CFLAGS) \ ++ -DXFree86Server \ ++ @GLX_DEFINES@ ++ ++INCLUDES = -I@MESA_SOURCE@/include \ ++ -I../X \ ++ -I../glapi \ ++ -I../main \ ++ -I../math \ ++ -I../shader \ ++ -I../shader/slang \ ++ -I../shader/slang \ ++ -I../swrast \ ++ -I../swrast_setup \ ++ -I../tnl \ ++ -I.. \ ++ -I$(top_srcdir)/hw/xfree86/os-support ++ ++nodist_libvbo_la_SOURCES = vbo_context.c \ ++ vbo_exec_api.c \ ++ vbo_exec_array.c \ ++ vbo_exec.c \ ++ vbo_exec_draw.c \ ++ vbo_exec_eval.c \ ++ vbo_rebase.c \ ++ vbo_save_api.c \ ++ vbo_save.c \ ++ vbo_save_draw.c \ ++ vbo_save_loopback.c \ ++ vbo_split.c \ ++ vbo_split_copy.c \ ++ vbo_split_inplace.c +diff -Naur xorg-server-X11R7.2-1.2.0/GL/mesa/X/Makefile.am xorg-server-X11R7.2-1.2.0-p/GL/mesa/X/Makefile.am +--- xorg-server-X11R7.2-1.2.0/GL/mesa/X/Makefile.am 2007-01-23 04:13:14.000000000 +0100 ++++ xorg-server-X11R7.2-1.2.0-p/GL/mesa/X/Makefile.am 2007-06-02 03:23:55.000000000 +0200 +@@ -2,7 +2,6 @@ + + INCLUDES = -I@MESA_SOURCE@/include \ + -I../X \ +- -I../array_cache \ + -I../glapi \ + -I../main \ + -I../math \ +@@ -21,18 +20,15 @@ + AM_CFLAGS = \ + $(DIX_CFLAGS) \ + -DXFree86Server \ +- @GLX_DEFINES@ \ +- -DXFree86Server ++ @GLX_DEFINES@ + +-libX_la_SOURCES = xf86glx.c \ +- xf86glx_util.c \ +- xf86glx_util.h \ +- xf86glxint.h ++libX_la_SOURCES = xf86glx.c + + nodist_libX_la_SOURCES = \ + xm_api.c \ + xm_buffer.c \ + xm_dd.c \ ++ xm_image.c \ + xm_line.c \ + xm_span.c \ + xm_tri.c \ +diff -Naur xorg-server-X11R7.2-1.2.0/GL/symlink-mesa.sh xorg-server-X11R7.2-1.2.0-p/GL/symlink-mesa.sh +--- xorg-server-X11R7.2-1.2.0/GL/symlink-mesa.sh 2007-01-23 04:13:14.000000000 +0100 ++++ xorg-server-X11R7.2-1.2.0-p/GL/symlink-mesa.sh 2007-06-02 03:23:55.000000000 +0200 +@@ -85,15 +85,6 @@ + done + } + +-symlink_mesa_ac() { +- src_dir src/mesa/array_cache +- dst_dir mesa/array_cache +- +- for src in $REAL_SRC_DIR/*.c $REAL_SRC_DIR/*.h; do +- action `basename $src` +- done +-} +- + symlink_mesa_swrast() { + src_dir src/mesa/swrast + dst_dir mesa/swrast +@@ -157,6 +148,15 @@ + done + } + ++symlink_mesa_vbo() { ++ src_dir src/mesa/vbo ++ dst_dir mesa/vbo ++ ++ for src in $REAL_SRC_DIR/*.c $REAL_SRC_DIR/*.h; do ++ action `basename $src` ++ done ++} ++ + symlink_mesa_x() { + src_dir src/mesa/drivers/x11 + dst_dir mesa/X +@@ -168,6 +168,8 @@ + action xm_api.c + action xm_buffer.c + action xm_dd.c ++ action xm_image.c ++ action xm_image.h + action xm_line.c + action xm_span.c + action xm_tri.c +@@ -203,7 +205,6 @@ + symlink_mesa() { + symlink_mesa_main + symlink_mesa_math +- symlink_mesa_ac + symlink_mesa_swrast + symlink_mesa_ss + symlink_mesa_tnl +@@ -215,6 +216,7 @@ + symlink_mesa_glapi + symlink_mesa_ppc + symlink_mesa_sparc ++ symlink_mesa_vbo + symlink_mesa_x86 + symlink_mesa_x8664 + } +@@ -225,9 +227,6 @@ + dst_dir glx + + action indirect_size.h +- +- src_dir src/mesa/drivers/dri/common +- + action glcontextmodes.c + action glcontextmodes.h + +@@ -289,9 +288,9 @@ + } + + usage() { +- echo symlink.sh src-dir dst-dir +- echo src-dir: the xc directory of the monolithic source tree +- echo dst-dir: the modular source tree containing proto, app, lib, ... ++ echo symlink-mesa.sh src-dir dst-dir ++ echo src-dir: the Mesa source directory ++ echo dst-dir: the GL subdirectory of the Xserver modular tree + } + + # Check commandline args hunk ./source/x11/xorg-server/mesa-build-config.patch 62 -+DRI_DIRS = i915tex i915 i965 mach64 mga r128 r200 radeon tdfx unichrome savage r300 ++DRI_DIRS = i915tex i915 i965 mach64 mga r128 r200 radeon tdfx unichrome savage r300 nouveau addfile ./source/x11/xorg-server/remove__GLinterface.patch hunk ./source/x11/xorg-server/remove__GLinterface.patch 1 +diff -Nur GL.orig/glx/glxext.c GL/glx/glxext.c +--- GL.orig/glx/glxext.c 2006-12-01 03:40:10.000000000 +0200 ++++ GL/glx/glxext.c 2007-04-23 01:23:39.900111785 +0300 +@@ -275,7 +275,7 @@ + /* + ** The GL was will call this routine if an error occurs. + */ +-void __glXErrorCallBack(__GLinterface *gc, GLenum code) ++void __glXErrorCallBack(GLenum code) + { + errorOccured = GL_TRUE; + } +diff -Nur GL.orig/glx/glxext.h GL/glx/glxext.h +--- GL.orig/glx/glxext.h 2006-09-18 09:04:17.000000000 +0300 ++++ GL/glx/glxext.h 2007-04-23 01:23:39.900111785 +0300 +@@ -66,7 +66,7 @@ + extern GLboolean __glXFreeContext(__GLXcontext *glxc); + extern void __glXFlushContextCache(void); + +-extern void __glXErrorCallBack(__GLinterface *gc, GLenum code); ++extern void __glXErrorCallBack(GLenum code); + extern void __glXClearErrorOccured(void); + extern GLboolean __glXErrorOccured(void); + extern void __glXResetLargeCommandStatus(__GLXclientState*); +diff -Nur hw.orig/dmx/glxProxy/glxext.h hw/dmx/glxProxy/glxext.h +--- hw.orig/dmx/glxProxy/glxext.h 2006-09-18 09:04:17.000000000 +0300 ++++ hw/dmx/glxProxy/glxext.h 2006-09-18 09:04:17.000000000 +0300 +@@ -67,7 +67,7 @@ + + extern void __glXNoSuchRenderOpcode(GLbyte*); + extern int __glXNoSuchSingleOpcode(__GLXclientState*, GLbyte*); +-extern void __glXErrorCallBack(__GLinterface *gc, GLenum code); ++extern void __glXErrorCallBack(GLenum code); + extern void __glXClearErrorOccured(void); + extern GLboolean __glXErrorOccured(void); + extern void __glXResetLargeCommandStatus(__GLXclientState*); } From crazy at frugalware.org Sat Jun 2 13:45:26 2007 From: crazy at frugalware.org (crazy) Date: Sat Jun 2 13:45:31 2007 Subject: [Frugalware-darcs] frugalware-current: htop-0.6.6-1-i686 Message-ID: <20070602114527.5AF9C1768120@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070602114039-f6986-26ecc1dd22b317e59ce729cb9d90dc48a02e83e7.gz; [htop-0.6.6-1-i686 crazy **20070602114039 * Version bump ] { hunk ./source/apps-extra/htop/FrugalBuild 5 -pkgver=0.6.5 +pkgver=0.6.6 hunk ./source/apps-extra/htop/FrugalBuild 13 -sha1sums=('c9bbea594d3ae1940f0b53b44396b684e6e87ded' \ +sha1sums=('d0bb46a815a5075777ceb557586f72f622c28919'\ } From crazy at frugalware.org Sat Jun 2 13:49:05 2007 From: crazy at frugalware.org (crazy) Date: Sat Jun 2 13:49:08 2007 Subject: [Frugalware-darcs] frugalware-current: xf86-video-nv-1.2.2.1-3-i686 Message-ID: <20070602114905.C1BBC1768120@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070602114606-f6986-f816831952a0f255b7bca2aa818807abd3be872a.gz; [xf86-video-nv-1.2.2.1-3-i686 crazy **20070602114606 * rebuild ] { hunk ./source/x11/xf86-video-nv/FrugalBuild 6 -pkgrel=2 +pkgrel=3 hunk ./source/x11/xf86-video-nv/FrugalBuild 11 -depends=('xorg-server>=1.2.0') +depends=('xorg-server>=1.2.0-3') } From crazy at frugalware.org Sat Jun 2 13:57:02 2007 From: crazy at frugalware.org (crazy) Date: Sat Jun 2 13:57:06 2007 Subject: [Frugalware-darcs] frugalware-current: xf86-video-i810-1.7.4-2-i686 Message-ID: <20070602115702.B390516A8024@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070602115447-f6986-137507747f059f8c29fa87c7c3ac661e31b1dd7a.gz; [xf86-video-i810-1.7.4-2-i686 crazy **20070602115447 * rebuild ] { hunk ./source/x11/xf86-video-i810/FrugalBuild 6 -pkgrel=1 +pkgrel=2 hunk ./source/x11/xf86-video-i810/FrugalBuild 10 -depends=('xorg-server' 'libxvmc') +depends=('xorg-server>=1.2.0-3' 'libxvmc') } From crazy at frugalware.org Sat Jun 2 14:02:03 2007 From: crazy at frugalware.org (crazy) Date: Sat Jun 2 14:02:09 2007 Subject: [Frugalware-darcs] frugalware-current: xf86-video-vga-4.1.0-2-i686 Message-ID: <20070602120204.601CE16A8024@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070602120008-f6986-74948341109187e4b870ff5b19fb7914519ab265.gz; [xf86-video-vga-4.1.0-2-i686 crazy **20070602120008 * rebuild * sha1sums fix ] { hunk ./source/x11/xf86-video-vga/FrugalBuild 6 -pkgrel=1 +pkgrel=2 hunk ./source/x11/xf86-video-vga/FrugalBuild 11 -depends=('xorg-server') +depends=('xorg-server>=1.2.0-3') hunk ./source/x11/xf86-video-vga/FrugalBuild 15 -sha1sums=('a3b5562e5714d956647389cc8c089fac85d7177e') +sha1sums=('6ef9f7f9b5ef2364430b29f6ac6e2e628d4ec1be') } From crazy at frugalware.org Sat Jun 2 14:03:35 2007 From: crazy at frugalware.org (crazy) Date: Sat Jun 2 14:03:38 2007 Subject: [Frugalware-darcs] frugalware-current: xf86-video-vesa-1.3.0-2-i686 Message-ID: <20070602120336.0DCA216A8024@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070602120219-f6986-47fe2b9368d7e3059ae30ca894fc5ff76f03daa1.gz; [xf86-video-vesa-1.3.0-2-i686 crazy **20070602120219 * rebuild * sha1sums fix ] { hunk ./source/x11/xf86-video-vesa/FrugalBuild 6 -pkgrel=1 +pkgrel=2 hunk ./source/x11/xf86-video-vesa/FrugalBuild 11 -depends=('xorg-server') +depends=('xorg-server>=1.2.0-3') hunk ./source/x11/xf86-video-vesa/FrugalBuild 15 -sha1sums=('09d74f838c07c58b6eba3600f3afa5fb74420ff4') +sha1sums=('52facbc52b50f55bea5237d12e2b7b85819666b9') } From vmiklos at frugalware.org Sat Jun 2 14:11:13 2007 From: vmiklos at frugalware.org (VMiklos) Date: Sat Jun 2 14:11:16 2007 Subject: [Frugalware-darcs] pacman-tools: bumppkg: no longer use rf Message-ID: <20070602121113.EAF4916A8024@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=pacman-tools;a=darcs_commitdiff;h=20070602120954-e2957-1197b94bab20592a10ee3f05120defdcd7185dd2.gz; [bumppkg: no longer use rf VMiklos **20070602120954] { hunk ./bumppkg 141 - rf -k -f *-$CARCH.fpm + repoman -k push hunk ./bumppkg 158 - rf -k -c -f *-$CARCH.fpm + repoman -k push } From vmiklos at frugalware.org Sat Jun 2 14:15:29 2007 From: vmiklos at frugalware.org (VMiklos) Date: Sat Jun 2 14:15:42 2007 Subject: [Frugalware-darcs] frugalware-current: acx100-0.3.36-9-i686 Message-ID: <20070602121529.313A316A8024@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070602141217-e2957-f17d0d3b86a48c7ad638bdb0f2ed66cff8c57377.gz; [acx100-0.3.36-9-i686 VMiklos **20070602141217 rebuilt with kernel-2.6.21-2 ] { hunk ./source/apps-extra/acerhk/FrugalBuild 7 -pkgrel=1 +pkgrel=2 hunk ./source/apps-extra/cdemu/FrugalBuild 6 -pkgrel=18 +pkgrel=19 hunk ./source/network-extra/acx100/FrugalBuild 7 -pkgrel=8 +pkgrel=9 } From crazy at frugalware.org Sat Jun 2 14:15:52 2007 From: crazy at frugalware.org (crazy) Date: Sat Jun 2 14:15:55 2007 Subject: [Frugalware-darcs] frugalware-current: xf86-video-via-0.2.2-2-i686 Message-ID: <20070602121553.1F60116A8024@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070602121131-f6986-9c292777cdc0bf4a459c91f931602b3a9fa9e894.gz; [xf86-video-via-0.2.2-2-i686 crazy **20070602121131 * rebuild ] { hunk ./source/x11/xf86-video-via/FrugalBuild 6 -pkgrel=1 +pkgrel=2 hunk ./source/x11/xf86-video-via/FrugalBuild 11 -depends=('xorg-server>=1.1.99.901') +depends=('xorg-server>=1.2.0-3') hunk ./source/x11/xf86-video-via/FrugalBuild 15 -sha1sums=('34297439a05d054b343df407e86b6bd7d1cece97') +sha1sums=('65210c0481f58fd7033b1d2d78390e58b338fd8f') } From vmiklos at frugalware.org Sat Jun 2 14:20:32 2007 From: vmiklos at frugalware.org (VMiklos) Date: Sat Jun 2 14:20:36 2007 Subject: [Frugalware-darcs] pacman-tools: bumppkg, repoman: record only in the current directory on non-interactive records Message-ID: <20070602122033.4BE1A16A8024@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=pacman-tools;a=darcs_commitdiff;h=20070602121846-e2957-800c1599e9a05a2983d439b866ef2238cad911b0.gz; [bumppkg, repoman: record only in the current directory on non-interactive records VMiklos **20070602121846] { hunk ./bumppkg 119 -$@" | darcs rec -a --pipe +$@" | darcs rec -a --pipe . hunk ./repoman 217 -$@" | darcs rec -a --pipe +$@" | darcs rec -a --pipe . } From crazy at frugalware.org Sat Jun 2 14:22:45 2007 From: crazy at frugalware.org (crazy) Date: Sat Jun 2 14:22:48 2007 Subject: [Frugalware-darcs] frugalware-current: xf86-video-ati-6.6.3-2-i686 Message-ID: <20070602122246.3BD8316A8024@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070602121324-f6986-81b62fe3f265a0db92270804989daea264c71e29.gz; [xf86-video-ati-6.6.3-2-i686 crazy **20070602121324 * rebuild ] { hunk ./source/x11/xf86-video-ati/FrugalBuild 6 -pkgrel=1 +pkgrel=2 hunk ./source/x11/xf86-video-ati/FrugalBuild 11 -depends=('xorg-server>=1.1.0') +depends=('xorg-server>=1.2.0-3') hunk ./source/x11/xf86-video-ati/FrugalBuild 15 -sha1sums=('b911df1f4b41ad37028c708e2c95e5a729a32ede') +sha1sums=('481c13bc1637f960bc4998777bfc14b435208021') } From alex at alex-smith.me.uk Sat Jun 2 14:27:40 2007 From: alex at alex-smith.me.uk (AlexExtreme) Date: Sat Jun 2 14:27:45 2007 Subject: [Frugalware-darcs] homepage-ng: rss: set content:encoded to a copy of the news article without tags stripped Message-ID: <20070602122741.4D77B1768120@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=homepage-ng;a=darcs_commitdiff;h=20070602122546-46e39-1922b59b84d6b891da9f9e9de113f5529edc3d52.gz; [rss: set content:encoded to a copy of the news article without tags stripped AlexExtreme **20070602122546] { hunk ./frugalware/rss.php 32 +$encoded = ""; hunk ./frugalware/rss.php 48 - $handle['title']="Frugalware Linux "; + $handle['title']="Frugalware Linux Releases"; hunk ./frugalware/rss.php 115 - "title" => $news[$i]->title[0]->tagData, - "link" => "http://www.frugalware.org/news/".$news[$i]->id[0]->tagData, + "title" => $news[$i]->title[0]->tagData, + "link" => "http://www.frugalware.org/news/".$news[$i]->id[0]->tagData, hunk ./frugalware/rss.php 118 - "desc" => preg_replace('/(|<\/a>)/', '', $news[$i]->content[0]->tagData), + "desc" => strip_tags(stripslashes($news[$i]->content[0]->tagData)), + "encoded" => stripslashes($news[$i]->content[0]->tagData), hunk ./frugalware/rss.php 132 + $encoded = " xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:admin=\"http://webns.net/mvcb/\" xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\" xmlns:content=\"http://purl.org/rss/1.0/modules/content/\""; hunk ./frugalware/rss.php 178 +i + hunk ./frugalware/rss.php 182 - + hunk ./frugalware/rss.php 194 + if(isset($i['encoded'])) + { + print "\n"; + } } From vmiklos at frugalware.org Sat Jun 2 14:31:01 2007 From: vmiklos at frugalware.org (VMiklos) Date: Sat Jun 2 14:31:03 2007 Subject: [Frugalware-darcs] frugalware-current: madwifi-0.9.3.1-2-i686 Message-ID: <20070602123101.BDCFE16A8024@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070602142954-e2957-baf26e4d0fc05bd14312a87ed0dedad83020649a.gz; [madwifi-0.9.3.1-2-i686 VMiklos **20070602142954 rebuilt with kernel-2.6.21-2 ] { hunk ./source/network/madwifi/FrugalBuild 6 -pkgrel=1 +pkgrel=2 } From alex at alex-smith.me.uk Sat Jun 2 14:31:44 2007 From: alex at alex-smith.me.uk (AlexExtreme) Date: Sat Jun 2 14:31:49 2007 Subject: [Frugalware-darcs] homepage-ng: rss: i'm stupid. Message-ID: <20070602123145.55CF016A8024@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=homepage-ng;a=darcs_commitdiff;h=20070602123052-46e39-6469b104033b53081f75ff31960d9f0ad2deda8b.gz; [rss: i'm stupid. AlexExtreme **20070602123052] { hunk ./frugalware/rss.php 106 + $encoded = " xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:admin=\"http://webns.net/mvcb/\" xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\" xmlns:content=\"http://purl.org/rss/1.0/modules/content/\""; hunk ./frugalware/rss.php 133 - $encoded = " xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:admin=\"http://webns.net/mvcb/\" xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\" xmlns:content=\"http://purl.org/rss/1.0/modules/content/\""; hunk ./frugalware/rss.php 178 -i - } From alex at alex-smith.me.uk Sat Jun 2 14:33:11 2007 From: alex at alex-smith.me.uk (AlexExtreme) Date: Sat Jun 2 14:33:15 2007 Subject: [Frugalware-darcs] homepage-ng: rss: oh come on, that's just idiotic Message-ID: <20070602123311.CF66616A8009@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=homepage-ng;a=darcs_commitdiff;h=20070602123229-46e39-b7d00ae2f4dd95662de4e72934691f2e02479a8c.gz; [rss: oh come on, that's just idiotic AlexExtreme **20070602123229] { hunk ./frugalware/rss.php 194 - print "\n"; + print "\n"; } From vmiklos at frugalware.org Sat Jun 2 14:39:18 2007 From: vmiklos at frugalware.org (VMiklos) Date: Sat Jun 2 14:39:21 2007 Subject: [Frugalware-darcs] frugalware-current: adm8211-20060111-21-i686 Message-ID: <20070602123918.B1C6716A8024@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070602143837-e2957-6ea41250f24cb47dd2e4d3638176f1d2ca75f291.gz; [adm8211-20060111-21-i686 VMiklos **20070602143837 rebuilt with kernel-2.6.21-2 ] { hunk ./source/network-extra/adm8211/FrugalBuild 6 -pkgrel=20 +pkgrel=21 } From crazy at frugalware.org Sat Jun 2 14:45:26 2007 From: crazy at frugalware.org (crazy) Date: Sat Jun 2 14:45:29 2007 Subject: [Frugalware-darcs] frugalware-current: openchrome-r336-1-i686 Message-ID: <20070602124526.C4E1516A8024@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070602124345-f6986-a7c773da5aadafe43a09048fd3d8a79d13cb1ed5.gz; [openchrome-r336-1-i686 crazy **20070602124345 * Version bump ] { hunk ./source/x11-extra/openchrome/FrugalBuild 5 -pkgver=r283 +pkgver=r336 hunk ./source/x11-extra/openchrome/FrugalBuild 11 - 'xorg-server' 'xf86driproto' 'glproto') -rodepends=('xorg-server') + 'xorg-server>=1.2.0-3' 'xf86driproto' 'glproto') +rodepends=('xorg-server>=1.2.0-3') hunk ./source/x11-extra/openchrome/FrugalBuild 22 -sha1sums=('5f62da78b9ca06885eb99e12fd441242758e97e6') +sha1sums=('30d2ad12504d5b7abdbc213e93b8d9cf2e560926') } From alex at alex-smith.me.uk Sat Jun 2 14:46:17 2007 From: alex at alex-smith.me.uk (AlexExtreme) Date: Sat Jun 2 14:46:21 2007 Subject: [Frugalware-darcs] homepage-ng: news.xml: fixed dates Message-ID: <20070602124618.27F1416A8024@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=homepage-ng;a=darcs_commitdiff;h=20070602124532-46e39-6b73bac1bc4bbd96abb1d6f37eeadb33d2d5a95a.gz; [news.xml: fixed dates AlexExtreme **20070602124532] { hunk ./frugalware/xml/news.xml 19 - Tue Jun 2 08:45:13 CET 2007 + Sat Jun 2 08:45:13 CET 2007 hunk ./frugalware/xml/news.xml 134 - Tue May 14 17:37:15 CET 2007 + Tue May 14 17:37:15 CET 2007 } From vmiklos at frugalware.org Sat Jun 2 14:47:04 2007 From: vmiklos at frugalware.org (VMiklos) Date: Sat Jun 2 14:47:07 2007 Subject: [Frugalware-darcs] frugalware-current: rt2400-1.2.2_b3-2-i686 Message-ID: <20070602124704.EC1CC1768120@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070602144626-e2957-ee672dd402bb83a99d3c8ba8da35781172608c22.gz; [rt2400-1.2.2_b3-2-i686 VMiklos **20070602144626 rebuilt with kernel-2.6.21-2 ] { hunk ./source/network-extra/rt2400/FrugalBuild 6 -pkgrel=1 +pkgrel=2 } From alex at alex-smith.me.uk Sat Jun 2 14:49:57 2007 From: alex at alex-smith.me.uk (AlexExtreme) Date: Sat Jun 2 14:49:59 2007 Subject: [Frugalware-darcs] homepage-ng: rss: should fix absolute URL references Message-ID: <20070602124957.3957816A8024@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=homepage-ng;a=darcs_commitdiff;h=20070602124914-46e39-24c69b274b5c8a13a75d10b62a6799e0d6f9137d.gz; [rss: should fix absolute URL references AlexExtreme **20070602124914] { hunk ./frugalware/rss.php 120 - "encoded" => stripslashes($news[$i]->content[0]->tagData), + "encoded" => preg_replace("href=\"\/", "href=\"http://frugalware.org\/", stripslashes($news[$i]->content[0]->tagData)), } From alex at alex-smith.me.uk Sat Jun 2 14:51:18 2007 From: alex at alex-smith.me.uk (AlexExtreme) Date: Sat Jun 2 14:51:19 2007 Subject: [Frugalware-darcs] homepage-ng: rss: somebody *please* slap me Message-ID: <20070602125118.B0FB716A8024@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=homepage-ng;a=darcs_commitdiff;h=20070602125032-46e39-7b8d77e706ce6f7ac418f6f19838ed32c7355651.gz; [rss: somebody *please* slap me AlexExtreme **20070602125032] { hunk ./frugalware/rss.php 120 - "encoded" => preg_replace("href=\"\/", "href=\"http://frugalware.org\/", stripslashes($news[$i]->content[0]->tagData)), + "encoded" => str_replace("href=\"\/", "href=\"http://frugalware.org\/", stripslashes($news[$i]->content[0]->tagData)), } From vmiklos at frugalware.org Sat Jun 2 14:53:57 2007 From: vmiklos at frugalware.org (VMiklos) Date: Sat Jun 2 14:53:59 2007 Subject: [Frugalware-darcs] frugalware-current: rt2500-1.1.0_b4-20-i686 Message-ID: <20070602125357.CC9881768124@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070602145241-e2957-24cffb6beb4009fdefbf35905de3cad188119de2.gz; [rt2500-1.1.0_b4-20-i686 VMiklos **20070602145241 rebuilt with kernel-2.6.21-2 ] { hunk ./source/network-extra/rt2500/FrugalBuild 6 -pkgrel=19 +pkgrel=20 } From alex at alex-smith.me.uk Sat Jun 2 14:54:16 2007 From: alex at alex-smith.me.uk (AlexExtreme) Date: Sat Jun 2 14:54:17 2007 Subject: [Frugalware-darcs] homepage-ng: rss: ... and again Message-ID: <20070602125416.203F416A8024@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=homepage-ng;a=darcs_commitdiff;h=20070602125329-46e39-6629cd519aa74e2fb31899e755e20d54bf5b201d.gz; [rss: ... and again AlexExtreme **20070602125329] { hunk ./frugalware/rss.php 120 - "encoded" => str_replace("href=\"\/", "href=\"http://frugalware.org\/", stripslashes($news[$i]->content[0]->tagData)), + "encoded" => str_replace("href=\"/", "href=\"http://frugalware.org/", stripslashes($news[$i]->content[0]->tagData)), } From vmiklos at frugalware.org Sat Jun 2 15:01:33 2007 From: vmiklos at frugalware.org (VMiklos) Date: Sat Jun 2 15:01:35 2007 Subject: [Frugalware-darcs] frugalware-current: qc-usb-0.6.6-15-i686 Message-ID: <20070602130133.6E36E16A8024@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070602150035-e2957-b68af4189506300c11949eef1a8bc8fac38ef767.gz; [qc-usb-0.6.6-15-i686 VMiklos **20070602150035 rebuilt with kernel-2.6.21-2 ] { hunk ./source/multimedia-extra/qc-usb/FrugalBuild 6 -pkgrel=14 +pkgrel=15 } From vmiklos at frugalware.org Sat Jun 2 15:11:53 2007 From: vmiklos at frugalware.org (VMiklos) Date: Sat Jun 2 15:12:00 2007 Subject: [Frugalware-darcs] frugalware-current: rlocate-0.5.5-10-i686 Message-ID: <20070602131154.546871768120@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070602151040-e2957-fb69328f804324930624adcb049c7f8a2ddc6169.gz; [rlocate-0.5.5-10-i686 VMiklos **20070602151040 rebuilt with kernel-2.6.21-2 ] { hunk ./source/apps-extra/rlocate/FrugalBuild 6 -pkgrel=9 +pkgrel=10 } From detto_o at freenet.de Sat Jun 2 15:11:59 2007 From: detto_o at freenet.de (detto) Date: Sat Jun 2 15:12:05 2007 Subject: [Frugalware-darcs] frugalware-current: ffmpegthumbnailer-1.1.2-1-i686 Message-ID: <20070602131159.D03501768124@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070602131114-5249c-291e957b74871a71ece21540a4fe33fdd81023cc.gz; [ffmpegthumbnailer-1.1.2-1-i686 detto **20070602131114 version bump ] { hunk ./source/xapps-extra/ffmpegthumbnailer/FrugalBuild 1 -# Compiling Time: 0.02 SBU +# Compiling Time: 0.04 SBU hunk ./source/xapps-extra/ffmpegthumbnailer/FrugalBuild 5 -pkgver=1.1.1 +pkgver=1.1.2 hunk ./source/xapps-extra/ffmpegthumbnailer/FrugalBuild 14 -sha1sums=('2e14078f27faf595821315dcdb7f98b8021ddd3d') +sha1sums=('53f2464df719605bd9ae7afca868592b98ebded1') } From alex at alex-smith.me.uk Sat Jun 2 15:17:30 2007 From: alex at alex-smith.me.uk (AlexExtreme) Date: Sat Jun 2 15:17:34 2007 Subject: [Frugalware-darcs] frugalware-current: liferea-1.2.15b-2-i686 Message-ID: <20070602131730.8BE5C16A8024@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070602131507-46e39-a8520036dd7a575511f1cb043cb27d79f5f40c9f.gz; [liferea-1.2.15b-2-i686 AlexExtreme **20070602131507 * Fix for wrapper script + XULRunner ] { hunk ./source/gnome-extra/liferea/FrugalBuild 6 -pkgrel=1 +pkgrel=2 hunk ./source/gnome-extra/liferea/FrugalBuild 25 + Fsed "LD_LIBRARY_PATH=:" "LD_LIBRARY_PATH=/usr/lib/xulrunner:" $Fdestdir/usr/bin/$pkgname } From vmiklos at frugalware.org Sat Jun 2 15:19:07 2007 From: vmiklos at frugalware.org (VMiklos) Date: Sat Jun 2 15:19:08 2007 Subject: [Frugalware-darcs] frugalware-current: ipw3945-1.2.1-2-i686 Message-ID: <20070602131907.533FE16A8024@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070602151840-e2957-83203766427019edf75f3377b853e411a6acc720.gz; [ipw3945-1.2.1-2-i686 VMiklos **20070602151840 rebuilt with kernel-2.6.21-2 ] { hunk ./source/network-extra/ipw3945/FrugalBuild 6 -pkgrel=1 +pkgrel=2 } From krics at linuxforum.hu Sat Jun 2 15:24:35 2007 From: krics at linuxforum.hu (Christian Hamar alias krix) Date: Sat Jun 2 15:24:38 2007 Subject: [Frugalware-darcs] frugalware-current: pan-0.131-1-x86_64 Message-ID: <20070602132436.5123F1768120@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070602132306-d209c-face18ad78f4ca82d03dbff7dd38e47478b699c7.gz; [pan-0.131-1-x86_64 Christian Hamar alias krix **20070602132306 * Version bump * Fixed up2date ] { hunk ./source/gnome-extra/pan/FrugalBuild 7 -pkgver=0.129 +pkgver=0.131 hunk ./source/gnome-extra/pan/FrugalBuild 12 -up2date="lynx -dump http://pan.rebelbase.com/download/|grep -m1 'beta'|sed 's/.*pan \(.*\) .*/\1/'" +up2date="lynx -dump http://pan.rebelbase.com/download/|grep -m1 'beta'|sed 's/.*pan \(.*\)(beta)*/\1/'" hunk ./source/gnome-extra/pan/FrugalBuild 26 -sha1sums=('58b3f31e2cabd380164496d9480271d72bd500c3') +sha1sums=('d5669c979841c3c0873530f430a70d980257a561') } From vmiklos at frugalware.org Sat Jun 2 15:28:04 2007 From: vmiklos at frugalware.org (VMiklos) Date: Sat Jun 2 15:28:07 2007 Subject: [Frugalware-darcs] frugalware-current: dazuko-2.3.3-4-i686 Message-ID: <20070602132804.79CDA16A8024@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070602152552-e2957-91044793585ea73372c01778130f500137cce555.gz; [dazuko-2.3.3-4-i686 VMiklos **20070602152552 rebuilt with kernel-2.6.21-2 ] { hunk ./source/apps-extra/dazuko/FrugalBuild 6 -pkgrel=3 +pkgrel=4 } From vmiklos at frugalware.org Sat Jun 2 15:39:30 2007 From: vmiklos at frugalware.org (VMiklos) Date: Sat Jun 2 15:39:33 2007 Subject: [Frugalware-darcs] frugalware-current: nvidia-1.0_9755-4-i686 Message-ID: <20070602133931.5D15816A8024@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070602153804-e2957-8b3de999764ad2ab64d255aba52d06565e6c2d5b.gz; [nvidia-1.0_9755-4-i686 VMiklos **20070602153804 rebuilt with kernel-2.6.21-2 ] { hunk ./source/x11-extra/nvidia/FrugalBuild 7 -pkgrel=3 +pkgrel=4 } From vmiklos at frugalware.org Sat Jun 2 15:49:33 2007 From: vmiklos at frugalware.org (VMiklos) Date: Sat Jun 2 15:49:35 2007 Subject: [Frugalware-darcs] frugalware-current: gspcav1-1.00.18-3-i686 Message-ID: <20070602134933.7C0D716A8024@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070602154812-e2957-d57d8d1df600e20d77388bf2427a697699614693.gz; [gspcav1-1.00.18-3-i686 VMiklos **20070602154812 rebuilt with kernel-2.6.21-2 ] { hunk ./source/multimedia-extra/gspcav1/FrugalBuild 6 -pkgrel=2 +pkgrel=3 } From vmiklos at frugalware.org Sat Jun 2 15:59:50 2007 From: vmiklos at frugalware.org (VMiklos) Date: Sat Jun 2 15:59:51 2007 Subject: [Frugalware-darcs] frugalware-current: ndiswrapper-1.45-2-i686 Message-ID: <20070602135950.42EAC16A8024@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070602155824-e2957-2eb0fcfe5e9bf86f28ecbed599a75ff7e052c9ea.gz; [ndiswrapper-1.45-2-i686 VMiklos **20070602155824 rebuilt with kernel-2.6.21-2 ] { hunk ./source/network-extra/ndiswrapper/FrugalBuild 6 -pkgrel=1 +pkgrel=2 } From vmiklos at frugalware.org Sat Jun 2 16:11:49 2007 From: vmiklos at frugalware.org (VMiklos) Date: Sat Jun 2 16:11:52 2007 Subject: [Frugalware-darcs] frugalware-current: wlan-ng-0.2.8-2-i686 Message-ID: <20070602141149.9D5D41768120@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070602160946-e2957-c9dbaab2930f1312a0716ef586b41d1ed80bc90d.gz; [wlan-ng-0.2.8-2-i686 VMiklos **20070602160946 rebuilt with kernel-2.6.21-2 ] { hunk ./source/network-extra/wlan-ng/FrugalBuild 6 -pkgrel=1 +pkgrel=2 } From vmiklos at frugalware.org Sat Jun 2 16:23:07 2007 From: vmiklos at frugalware.org (VMiklos) Date: Sat Jun 2 16:23:08 2007 Subject: [Frugalware-darcs] frugalware-current: ivtv-0.10.3-2-i686 Message-ID: <20070602142307.B8C6816A8024@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070602162217-e2957-68ec83c3ade4180afd41e019189b2cf1eaff55fb.gz; [ivtv-0.10.3-2-i686 VMiklos **20070602162217 rebuilt with kernel-2.6.21-2 ] { hunk ./source/multimedia-extra/ivtv/FrugalBuild 8 -pkgrel=1 +pkgrel=2 } From krics at linuxforum.hu Sat Jun 2 16:38:05 2007 From: krics at linuxforum.hu (Christian Hamar alias krix) Date: Sat Jun 2 16:38:08 2007 Subject: [Frugalware-darcs] frugalware-current: gammu-1.11.91-1-x86_64 Message-ID: <20070602143805.E8F4B16A8024@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070602143533-d209c-97451dc65e85034da391eb95e5e7e7c845efb582.gz; [gammu-1.11.91-1-x86_64 Christian Hamar alias krix **20070602143533 * Version bump * Thx for crazy to rework FB to cmake one :) * Added cmake as makedepends ] { hunk ./source/apps-extra/gammu/FrugalBuild 5 -pkgver=1.10.6 -pkgrel=2 +pkgver=1.11.91 +pkgrel=1 hunk ./source/apps-extra/gammu/FrugalBuild 10 -depends=('libmysqlclient' 'bluez-libs>=3.10' 'openssl') # depends on openssl, dont remove it -makedepends=('mysql') +depends=('libmysqlclient' 'bluez-libs>=3.11' 'openssl') # depends on openssl, dont remove it +makedepends=('mysql' 'cmake') hunk ./source/apps-extra/gammu/FrugalBuild 17 -build() { - Fsed "-O2 -fPIC -Wall -Wno-format-y2k -pthread" "$CFLAGS -fPIC -Wno-format-y2k -pthread" cfg/Makefile.cfg - Fsed "-lbluetooth -lsdp" "-lbluetooth" cfg/Makefile.cfg - Fsed "/etc/gammurc" "/etc/gammu/gammurc" common/gsmstate.c - Fconf --sysconfdir=/etc/gammu --enable-cb \ - --enable-7110incoming --enable-6210calendar \ - --with-bluedir=/usr/lib --with-docdir=/usr/share/doc/$pkgname-$pkgver \ - --with-localedir=/usr/share/gammu --prefix=/usr - Fsed "-lz -pthread" "-lz -lpthread -lssl" cfg/Makefile.cfg +build() +{ + if [ "$CARCH" == "x86_64" ] ; then + CFLAGS="$CFLAGS -fPIC" + CXXFLAGS="$CXXFLAGS -fPIC" + fi + Fcd + mkdir build || Fdie + cd build || Fdie + cmake .. \ + -DCMAKE_INSTALL_PREFIX="$Fdestdir/usr" \ + -DENABLE_SHARED=ON \ + -DWITH_NOKIA_SUPPORT=ON \ + -DWITH_Bluez=ON \ + -DWITH_IrDA=ON \ + -DINSTALL_DOC_DIR="share/doc/$pkgname-$pkgver" \ + -DINSTALL_LIB_DIR="lib" \ + -DINSTALL_BIN_DIR="bin" \ + -DCMAKE_C_FLAGS="$CFLAGS" \ + -DCMAKE_CXX_FLAGS="$CXXFLAGS" \ + -DCMAKE_EXE_LINKER_FLAGS="$LDFLAGS" hunk ./source/apps-extra/gammu/FrugalBuild 39 - make DESTDIR=$Fdestdir installshared || Fdie - Ffilerel docs/examples/config/gammurc /etc/gammu/gammurc - chmod +x $Fdestdir/usr/lib/libGammu.so.* || Fdie + make install || Fdie + # Fixup for .so :P + chmod +x $Fdestdir/usr/lib/*.so || Fdie hunk ./source/apps-extra/gammu/FrugalBuild 43 + +sha1sums=('554436b09369d72f82b9a6f69210850da0fdeb4f') hunk ./source/apps-extra/gammu/FrugalBuild 46 -sha1sums=('d257df3b945dfd692e957c5fb18f16b775c38fdd') +# optimization OK } From vmiklos at frugalware.org Sat Jun 2 16:47:47 2007 From: vmiklos at frugalware.org (VMiklos) Date: Sat Jun 2 16:47:50 2007 Subject: [Frugalware-darcs] frugalware-current: truecrypt-4.3-5-i686 Message-ID: <20070602144747.A2EE716A8024@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070602164647-e2957-70c9e4747a670a8913b1ad068e6b9d4e8842673f.gz; [truecrypt-4.3-5-i686 VMiklos **20070602164647 rebuilt with kernel-2.6.21-2 ] { hunk ./source/apps-extra/truecrypt/FrugalBuild 7 -pkgrel=4 +pkgrel=5 } From vmiklos at frugalware.org Sat Jun 2 16:57:13 2007 From: vmiklos at frugalware.org (VMiklos) Date: Sat Jun 2 16:57:16 2007 Subject: [Frugalware-darcs] frugalware-current: kqemu-1.3.0pre11-8-i686 Message-ID: <20070602145713.764F616A8024@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070602165625-e2957-8c54541210787ba310f8436ea620997be94d15d1.gz; [kqemu-1.3.0pre11-8-i686 VMiklos **20070602165625 rebuilt with kernel-2.6.21-2 ] { hunk ./source/xapps-extra/kqemu/FrugalBuild 6 -pkgrel=7 +pkgrel=8 } From crazy at frugalware.org Sat Jun 2 17:38:23 2007 From: crazy at frugalware.org (crazy) Date: Sat Jun 2 17:38:26 2007 Subject: [Frugalware-darcs] frugalware-current: gtk-qt-engine-0.7-5-i686 Message-ID: <20070602153823.AACC416A8024@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070602153207-f6986-3eeea8032fb3bd8b30a24ff6540b5a0bf5f6ed6e.gz; [gtk-qt-engine-0.7-5-i686 crazy **20070602153207 * rebuild ] { hunk ./source/kde/gtk-qt-engine/FrugalBuild 7 -pkgrel=4 +pkgrel=5 hunk ./source/kde/gtk-qt-engine/FrugalBuild 9 -depends=('gtk+2' 'kdebase>=3.5.6') +depends=('gtk+2' 'kdebase>=3.5.7') } From crazy at frugalware.org Sat Jun 2 18:09:51 2007 From: crazy at frugalware.org (crazy) Date: Sat Jun 2 18:09:56 2007 Subject: [Frugalware-darcs] frugalware-current: wine-0.9.38-1-i686 Message-ID: <20070602160951.4EE491E68F1B@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070602160213-f6986-e1bf72e06b0433ab2162d964ca38d2fbc07d4bcf.gz; [wine-0.9.38-1-i686 crazy **20070602160213 * Version bump ] { hunk ./source/xapps/wine/FrugalBuild 6 -pkgver=0.9.37 -pkgrel=2 +pkgver=0.9.38 +pkgrel=1 hunk ./source/xapps/wine/FrugalBuild 32 -sha1sums=('e1f420c1554d4e05e7846e7053d512b702373890'\ +sha1sums=('2a9ca694170c6a5ca95c0300c51566b1d8de09e0'\ } From vmiklos at frugalware.org Sat Jun 2 18:30:39 2007 From: vmiklos at frugalware.org (VMiklos) Date: Sat Jun 2 18:30:42 2007 Subject: [Frugalware-darcs] frugalware-current: virtualbox-1.3.8-5-i686 Message-ID: <20070602163039.AF11516A8024@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070602182918-e2957-7856ab7564ec486c25805c29eb4a6b51ac7f0cd3.gz; [virtualbox-1.3.8-5-i686 VMiklos **20070602182918 rebuilt with kernel-2.6.21-2 ] { hunk ./source/xapps-extra/virtualbox/FrugalBuild 7 -pkgrel=4 +pkgrel=5 } From vmiklos at frugalware.org Sat Jun 2 18:39:40 2007 From: vmiklos at frugalware.org (VMiklos) Date: Sat Jun 2 18:39:44 2007 Subject: [Frugalware-darcs] frugalware-current: rtl8110-1.06-2-i686 Message-ID: <20070602163940.96E4016A8024@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070602183847-e2957-c07f254b30a8aecacf2a377cab6aecb63d9b8546.gz; [rtl8110-1.06-2-i686 VMiklos **20070602183847 rebuilt with kernel-2.6.21-2 ] { hunk ./source/network-extra/rtl8110/FrugalBuild 6 -pkgrel=1 +pkgrel=2 } From vmiklos at frugalware.org Sat Jun 2 18:52:13 2007 From: vmiklos at frugalware.org (VMiklos) Date: Sat Jun 2 18:52:16 2007 Subject: [Frugalware-darcs] frugalware-current: fglrx-8.36.5-4-i686 Message-ID: <20070602165213.D710C1768120@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070602165004-e2957-482ec58cdaa7cad5862cb088bd884d6a4302426f.gz; [fglrx-8.36.5-4-i686 VMiklos **20070602165004 rebuilt with kernel-2.6.21-2 ] { hunk ./source/x11-extra/fglrx/FrugalBuild 7 -pkgrel=3 +pkgrel=4 } From krics at linuxforum.hu Sat Jun 2 19:33:29 2007 From: krics at linuxforum.hu (Christian Hamar alias krix) Date: Sat Jun 2 19:33:32 2007 Subject: [Frugalware-darcs] frugalware-current: gammu-1.11.91-2-x86_64 Message-ID: <20070602173329.3F7BC1768132@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070602173106-d209c-817699f5860f0fa61f307386d045ea50669e1b18.gz; [gammu-1.11.91-2-x86_64 Christian Hamar alias krix **20070602173106 * Release bump * Fixed make install thingy (now .pc files got correct values) * Added /etc/gammu/gammurc (and a patch that gammu search the config at there) ] { hunk ./source/apps-extra/gammu/FrugalBuild 6 -pkgrel=1 +pkgrel=2 hunk ./source/apps-extra/gammu/FrugalBuild 15 -source=(http://dl.cihar.com/gammu/releases/$pkgname-$pkgver.tar.bz2) +source=(http://dl.cihar.com/gammu/releases/$pkgname-$pkgver.tar.bz2 \ + gammurc-path-fix.patch) + +# NOTE: check new releases about cmake bug in gammu. +# dont use make install DESTDIR=** things. Use the right cmake way if they fixed +# it. -krix- hunk ./source/apps-extra/gammu/FrugalBuild 29 + # Fix for config file. Put that config file into /etc/gammu/ + Fpatch gammurc-path-fix.patch hunk ./source/apps-extra/gammu/FrugalBuild 34 - -DCMAKE_INSTALL_PREFIX="$Fdestdir/usr" \ + -DCMAKE_INSTALL_PREFIX="/usr" \ hunk ./source/apps-extra/gammu/FrugalBuild 36 + -DENABLE_STATIC=ON \ hunk ./source/apps-extra/gammu/FrugalBuild 47 - make install || Fdie + make install DESTDIR=$Fdestdir || Fdie hunk ./source/apps-extra/gammu/FrugalBuild 50 + # Install sample config file under /etc/gammu/gammurc + Fmkdir etc/gammu + cp -a $Fdestdir/usr/share/doc/$pkgname-$pkgver/examples/config/gammurc \ + $Fdestdir/etc/gammu/ hunk ./source/apps-extra/gammu/FrugalBuild 56 -sha1sums=('554436b09369d72f82b9a6f69210850da0fdeb4f') +sha1sums=('554436b09369d72f82b9a6f69210850da0fdeb4f'\ + '68632cf0b015118b7a9c97d9b905fe47bcd927d4') addfile ./source/apps-extra/gammu/gammurc-path-fix.patch hunk ./source/apps-extra/gammu/gammurc-path-fix.patch 1 +diff -Naur gammu-1.11.91.orig/common/gsmstate.c gammu-1.11.91/common/gsmstate.c +--- gammu-1.11.91.orig/common/gsmstate.c 2007-06-02 19:18:14.000000000 +0200 ++++ gammu-1.11.91/common/gsmstate.c 2007-06-02 19:22:17.000000000 +0200 +@@ -18,7 +18,7 @@ + + #define FALLBACK_GAMMURC "gammurc" + #else +-#define FALLBACK_GAMMURC "/etc/gammurc" ++#define FALLBACK_GAMMURC "/etc/gammu/gammurc" + #endif + + static void GSM_RegisterConnection(GSM_StateMachine *s, unsigned int connection, } From vmiklos at frugalware.org Sat Jun 2 19:46:16 2007 From: vmiklos at frugalware.org (VMiklos) Date: Sat Jun 2 19:46:19 2007 Subject: [Frugalware-darcs] frugalware-current: lirc-0.8.1-10-i686 Message-ID: <20070602174616.5917A1768132@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070602174006-e2957-c31ceccfc07a049b636007136f54c7c434cd7dc4.gz; [lirc-0.8.1-10-i686 VMiklos **20070602174006 rebuilt with kernel-2.6.21-2 ] { hunk ./source/apps-extra/lirc/FrugalBuild 6 -pkgrel=9 +pkgrel=10 } From krics at linuxforum.hu Sat Jun 2 19:47:44 2007 From: krics at linuxforum.hu (Christian Hamar alias krix) Date: Sat Jun 2 19:47:48 2007 Subject: [Frugalware-darcs] frugalware-current: python-gammu-0.20-2-x86_64 Message-ID: <20070602174744.46B141768133@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070602174601-d209c-91f623b16da5f5292486f98b5f6594d0a175f2a1.gz; [python-gammu-0.20-2-x86_64 Christian Hamar alias krix **20070602174601 * Release bump (Well actually this is a version bump :P ) * Backported 0.21 changes from SVN, because of new gammu API :) ] { hunk ./source/devel-extra/python-gammu/FrugalBuild 5 -pkgver=0.19 -pkgrel=1 +pkgver=0.20 +pkgrel=2 hunk ./source/devel-extra/python-gammu/FrugalBuild 9 -depends=('python>=2.5' 'gammu>=1.10.2') +depends=('python>=2.5' 'gammu>=1.11.91-2') hunk ./source/devel-extra/python-gammu/FrugalBuild 13 -source=(http://dl.cihar.com/python-gammu/latest/$pkgname-$pkgver.tar.bz2 destdir.patch) +source=(http://dl.cihar.com/python-gammu/latest/$pkgname-$pkgver.tar.bz2 \ + destdir.patch \ + http://ftp.frugalware.org/pub/other/sources/$pkgname/python-gammu-0.21svn_backport.patch) hunk ./source/devel-extra/python-gammu/FrugalBuild 19 -sha1sums=('15f29831b385f33768e83cf0f487771f1d5217c3'\ - '73fabac20c406edb945eb54965b83922b3dd22f3') +sha1sums=('120a00e3b2adbd7188e2aa91e3da622a2214d757'\ + '73fabac20c406edb945eb54965b83922b3dd22f3'\ + '50162ba7acbecb32c352d09b4afc2676ab234b12') + } From crazy at frugalware.org Sat Jun 2 20:34:22 2007 From: crazy at frugalware.org (crazy) Date: Sat Jun 2 20:34:24 2007 Subject: [Frugalware-darcs] frugalware-current: qt4-4.3.0-1-i686 Message-ID: <20070602183422.B04951768132@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070602182957-f6986-1cfc810af37bdb319f0fb2a40f1a9ab4cde8dd32.gz; [qt4-4.3.0-1-i686 crazy **20070602182957 * Version bump * bye glib2 depend * build() fixes * compiled for now with -Os because this gcc bug ( see comment about in FB ) * this is an debug build but stripped ] { hunk ./source/kde-extra/qt4/FrugalBuild 6 -pkgver=4.2.3 -pkgrel=2 +pkgver=4.3.0 +pkgrel=1 hunk ./source/kde-extra/qt4/FrugalBuild 11 -depends=('libxrandr' 'mesa' 'libxft' 'libmng' 'libjpeg' 'libxcursor' 'libxinerama' 'freetype2' \ - 'libsm' 'libpng' 'libxtst' 'fontconfig' 'dbus>=0.93' 'glib2') -## glib2 only for some tests for now will be removed for kde4. +depends=('libxrandr' 'mesa>=6.5.3' 'libxft' 'libmng' 'libjpeg' 'libxcursor' 'libxinerama' 'freetype2' \ + 'libsm' 'libpng' 'libxtst' 'fontconfig' 'dbus>=0.93') hunk ./source/kde-extra/qt4/FrugalBuild 21 - qt4config.desktop dummy.patch qt4.sh.off Trolltech.conf \ - Qt-$pkgver-UTF-8-fix.patch) - #http://ftp.frugalware.org/pub/other/sources/kde/$pkgname/remove-crap2.patch) + qt4config.desktop dummy.patch qt4.sh.off Trolltech.conf) hunk ./source/kde-extra/qt4/FrugalBuild 36 - unset MAKEFLAGS + #unset MAKEFLAGS hunk ./source/kde-extra/qt4/FrugalBuild 39 + ## !WARNING DO NOT CHANGE THIS *FLAGS TILL WE FIX THIS GCC BUG! + ## -O1,-O2,-O3 is still broken do not use or it will eat your box + ## -Os does not eat that much ( ohh well ) RAM but is *slow* as *hell* + export CFLAGS="$(echo $CFLAGS|sed 's/-O2/-Os/')" + export CXXFLAGS="$(echo $CXXFLAGS|sed 's/-O2/-Os/')" hunk ./source/kde-extra/qt4/FrugalBuild 54 - -release -shared -nis -qt-gif -stl -pch -sm \ + -debug -shared -nis -qt-gif -stl -pch -sm \ hunk ./source/kde-extra/qt4/FrugalBuild 60 - -plugin-sql-sqlite -plugin-sql-sqlite2 -plugin-sql-odbc -qdbus -glib -no-separate-debug-info \ - || return 1 - Fsed "-L$startdir/src/$origname-$pkgmore-$pkgver/lib" "" lib/* - ## for some reason without the extra -I/*'s we have some weird compile errors - ## some missing folder :) + -plugin-sql-sqlite -plugin-sql-sqlite2 -plugin-sql-odbc -qdbus -no-glib -no-separate-debug-info \ + -optimized-qmake -fast || return 1 hunk ./source/kde-extra/qt4/FrugalBuild 71 - ## fix *.pc file location - Fmv /usr/lib/*.pc usr/lib/pkgconfig/ hunk ./source/kde-extra/qt4/FrugalBuild 91 -sha1sums=('b988aab4fa1dcce8532c36bb63947a556076e8c8'\ +sha1sums=('e433cf5482f24e81fa0b83bd1ed9a9c0abeb6ea4'\ hunk ./source/kde-extra/qt4/FrugalBuild 98 - '2468fea7b127253832148115d5aa9e85b2e0aea6'\ - '8f9843991d4773f10986069ee996eb1668196a49') + '2468fea7b127253832148115d5aa9e85b2e0aea6') hunk ./source/kde-extra/qt4/Qt-4.2.3-UTF-8-fix.patch 1 -diff -Naur qt-x11-opensource-src-4.2.3/src/corelib/codecs/qutfcodec.cpp qt-x11-opensource-src-4.2.3-p/src/corelib/codecs/qutfcodec.cpp ---- qt-x11-opensource-src-4.2.3/src/corelib/codecs/qutfcodec.cpp 2007-02-21 10:58:41.000000000 +0100 -+++ qt-x11-opensource-src-4.2.3-p/src/corelib/codecs/qutfcodec.cpp 2007-04-05 11:53:31.000000000 +0200 -@@ -127,15 +127,19 @@ - bool headerdone = false; - QChar replacement = QChar::ReplacementCharacter; - int need = 0; -+ int error = -1; - uint uc = 0; -+ uint min_uc = 0; - if (state) { - if (state->flags & IgnoreHeader) - headerdone = true; - if (state->flags & ConvertInvalidToNull) - replacement = QChar::Null; - need = state->remainingChars; -- if (need) -+ if (need) { - uc = state->state_data[0]; -+ min_uc = state->state_data[1]; -+ } - } - if (!headerdone && len > 3 - && (uchar)chars[0] == 0xef && (uchar)chars[1] == 0xbb && (uchar)chars[2] == 0xbf) { -@@ -152,7 +156,7 @@ - int invalid = 0; - - for (int i=0; i= result.size()) { -+ result.resize(where + 2); -+ qch = result.data() + where; -+ } -+ - *qch++ = QChar(high); - *qch++ = QChar(low); -+ } else if ((uc < min_uc) || (uc >= 0xd800 && uc <= 0xdfff) || (uc >= 0xfffe)) { -+ // error -+ *qch++ = QChar::ReplacementCharacter; -+ ++invalid; - } else { - *qch++ = uc; - } - } - } else { - // error -+ i = error; - *qch++ = QChar::ReplacementCharacter; - ++invalid; - need = 0; -@@ -181,12 +198,22 @@ - } else if ((ch & 0xe0) == 0xc0) { - uc = ch & 0x1f; - need = 1; -+ error = i; -+ min_uc = 0x80; - } else if ((ch & 0xf0) == 0xe0) { - uc = ch & 0x0f; - need = 2; -+ error = i; -+ min_uc = 0x800; - } else if ((ch&0xf8) == 0xf0) { - uc = ch & 0x07; - need = 3; -+ error = i; -+ min_uc = 0x10000; -+ } else { -+ // error -+ *qch++ = QChar::ReplacementCharacter; -+ ++invalid; - } - } - } -@@ -197,6 +224,7 @@ - if (headerdone) - state->flags |= IgnoreHeader; - state->state_data[0] = need ? uc : 0; -+ state->state_data[1] = need ? min_uc : 0; - } - return result; - } -diff -Naur qt-x11-opensource-src-4.2.3/src/corelib/tools/qstring.cpp qt-x11-opensource-src-4.2.3-p/src/corelib/tools/qstring.cpp ---- qt-x11-opensource-src-4.2.3/src/corelib/tools/qstring.cpp 2007-02-21 10:58:43.000000000 +0100 -+++ qt-x11-opensource-src-4.2.3-p/src/corelib/tools/qstring.cpp 2007-04-05 11:53:31.000000000 +0200 -@@ -3352,6 +3352,7 @@ - result.resize(size); // worst case - ushort *qch = result.d->data; - uint uc = 0; -+ uint min_uc = 0; - int need = 0; - int error = -1; - uchar ch; -@@ -3369,6 +3370,12 @@ - ushort low = uc%0x400 + 0xdc00; - *qch++ = high; - *qch++ = low; -+ } else if ((uc < min_uc) || (uc >= 0xd800 && uc <= 0xdfff) || (uc >= 0xfffe)) { -+ // overlong seqence, UTF16 surrogate or BOM -+ i = error; -+ qch = addOne(qch, result); -+ *qch++ = 0xdbff; -+ *qch++ = 0xde00 + ((uchar)str[i]); - } else { - *qch++ = uc; - } -@@ -3391,14 +3398,17 @@ - uc = ch & 0x1f; - need = 1; - error = i; -+ min_uc = 0x80; - } else if ((ch & 0xf0) == 0xe0) { - uc = ch & 0x0f; - need = 2; - error = i; -+ min_uc = 0x800; - } else if ((ch&0xf8) == 0xf0) { - uc = ch & 0x07; - need = 3; - error = i; -+ min_uc = 0x10000; - } else { - // Error - qch = addOne(qch, result); rmfile ./source/kde-extra/qt4/Qt-4.2.3-UTF-8-fix.patch } From vmiklos at frugalware.org Sat Jun 2 21:20:01 2007 From: vmiklos at frugalware.org (VMiklos) Date: Sat Jun 2 21:20:17 2007 Subject: [Frugalware-darcs] frugalwareutils: fwnet_writeconfig(): we no longer use the options = prefix in fwnet_interface_t->options Message-ID: <20070602192003.E2D091768132@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalwareutils;a=darcs_commitdiff;h=20070602191425-e2957-32aa386b900348d7d846067edb88ae0afd05b53b.gz; [fwnet_writeconfig(): we no longer use the options = prefix in fwnet_interface_t->options VMiklos **20070602191425 and we expected so when determining the primary ip address (when using static ip address) ] { hunk ./libfwnetconfig/libfwnetconfig.c 692 - sscanf(option, "options = %s netmask %s", ipaddr, netmask); + sscanf(option, "%s netmask %s", ipaddr, netmask); } From vmiklos at frugalware.org Sat Jun 2 22:52:59 2007 From: vmiklos at frugalware.org (VMiklos) Date: Sat Jun 2 22:53:02 2007 Subject: [Frugalware-darcs] frugalware-current: setuptools-0.6c6-1-i686 Message-ID: <20070602205259.E16E21768132@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070602205114-e2957-515015a5b187582dd02a36384f812cae891509b5.gz; [setuptools-0.6c6-1-i686 VMiklos **20070602205114 version bump ] { hunk ./source/devel-extra/setuptools/FrugalBuild 5 -pkgver=0.6c5 +pkgver=0.6c6 hunk ./source/devel-extra/setuptools/FrugalBuild 14 -sha1sums=('cb9623d0eedca8fbbd5aa0732d5385067b4f1a5d') +sha1sums=('b6e05360db28b752949d98a7f508f0db51e0fdc1') } From vmiklos at frugalware.org Sun Jun 3 00:24:47 2007 From: vmiklos at frugalware.org (VMiklos) Date: Sun Jun 3 00:24:56 2007 Subject: [Frugalware-darcs] pacman-g2: fix for remove031 Message-ID: <20070602222449.BC17D1768133@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=pacman-g2;a=darcs_commitdiff;h=20070602222408-e2957-6d63d50672f63fce76483056f307adaa06cde549.gz; [fix for remove031 VMiklos **20070602222408] { hunk ./lib/libpacman/remove.c 328 - depinfo->requiredby = _pacman_list_remove(depinfo->requiredby, info->name, str_cmp, (void **)&data); + depinfo->requiredby = _pacman_list_remove(_pacman_pkg_getinfo(depinfo, PM_PKG_REQUIREDBY), info->name, str_cmp, (void **)&data); } From vmiklos at frugalware.org Sun Jun 3 00:24:49 2007 From: vmiklos at frugalware.org (VMiklos) Date: Sun Jun 3 00:24:59 2007 Subject: [Frugalware-darcs] pacman-g2: fix for add005 Message-ID: <20070602222449.5DEE51768132@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=pacman-g2;a=darcs_commitdiff;h=20070602222313-e2957-5e63a4f673a49a6577e82e108c2137c1b3a54140.gz; [fix for add005 VMiklos **20070602222313] { hunk ./lib/libpacman/add.c 793 - depinfo->requiredby = _pacman_list_add(depinfo->requiredby, strdup(info->name)); + depinfo->requiredby = _pacman_list_add(_pacman_pkg_getinfo(depinfo, PM_PKG_REQUIREDBY), strdup(info->name)); } From vmiklos at frugalware.org Sun Jun 3 00:24:49 2007 From: vmiklos at frugalware.org (VMiklos) Date: Sun Jun 3 00:24:59 2007 Subject: [Frugalware-darcs] pacman-g2: pactest/tests: new testcases for #2093 Message-ID: <20070602222450.3168F1768135@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=pacman-g2;a=darcs_commitdiff;h=20070602222224-e2957-90dc07107d3187ffc62242a87bd09466017ca109.gz; [pactest/tests: new testcases for #2093 VMiklos **20070602222224] { addfile ./pactest/tests/add005.py hunk ./pactest/tests/add005.py 1 +self.description = "Install a package without depcheck" + +p1 = pmpkg("kdelibs", "1.0-1") +p1.requiredby = ['foo'] +self.addpkg2db("local", p1) + +p2 = pmpkg("kfoo") +p2.depends = ["kdelibs"] +self.addpkg(p2) + +self.args = "-Ud %s" % p2.filename() + +self.addrule("PKG_REQUIREDBY=kdelibs|foo") addfile ./pactest/tests/remove031.py hunk ./pactest/tests/remove031.py 1 +self.description = "Remove a package without depcheck" + +p1 = pmpkg("kdelibs", "1.0-1") +p1.requiredby = ['foo'] +self.addpkg2db("local", p1) + +p2 = pmpkg("kfoo") +p2.depends = ["kdelibs"] +self.addpkg2db("local", p2) + +self.args = "-Rd %s" % p2.name + +self.addrule("PKG_REQUIREDBY=kdelibs|foo") } From vmiklos at frugalware.org Sun Jun 3 01:51:22 2007 From: vmiklos at frugalware.org (VMiklos) Date: Sun Jun 3 01:51:29 2007 Subject: [Frugalware-darcs] frugalware-current: netbeans-5.5.1-1-i686 Message-ID: <20070602235123.074811768132@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070602234542-e2957-d99597c07b9fccf8fb9775231d03cee6b7c65f1e.gz; [netbeans-5.5.1-1-i686 VMiklos **20070602234542 version bump ] { hunk ./source/devel-extra/netbeans/FrugalBuild 5 -pkgver=5.5 -pkgdate=200610171010 +pkgver=5.5.1 +pkgdate=200704122300 hunk ./source/devel-extra/netbeans/FrugalBuild 15 -source=(http://us2-mirror.netbeans.info/download/${pkgver/./_}/fcs/$pkgdate/netbeans-${pkgver/./_}-ide_sources.tar.bz2 \ +source=(http://us2-mirror.netbeans.info/download/${pkgver//./_}/fcs/$pkgdate/netbeans-${pkgver//./_}-ide_sources.tar.bz2 \ hunk ./source/devel-extra/netbeans/FrugalBuild 18 +sha1sums=('b4235a16b0edb8048bfd4173803d65712c618ac9' \ + 'd8c652541c8b91c3dcb27f507ac75311bf37b965' \ + '35ce58650d87267fb1ca1bfe9d4168c80859efdb') hunk ./source/devel-extra/netbeans/FrugalBuild 43 -sha1sums=('255b863e41c23abc00678a228f881c697160bd2a' \ - 'd8c652541c8b91c3dcb27f507ac75311bf37b965' \ - '35ce58650d87267fb1ca1bfe9d4168c80859efdb') - } From vmiklos at frugalware.org Sun Jun 3 03:58:13 2007 From: vmiklos at frugalware.org (VMiklos) Date: Sun Jun 3 03:58:16 2007 Subject: [Frugalware-darcs] frugalware-current: perl-tk-804.027-4-i686 Message-ID: <20070603015813.74C2D1768132@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070603015634-e2957-e89b0fe57f83a5ca73d5f94e5f2eaad95f8fd45f.gz; [perl-tk-804.027-4-i686 VMiklos **20070603015634 added tk to depends() ] { hunk ./source/xapps-extra/perl-tk/FrugalBuild 8 -depends=('libjpeg' 'libpng' 'libx11') +depends=('libjpeg' 'libpng' 'libx11' 'tk') } From detto_o at freenet.de Sun Jun 3 04:05:27 2007 From: detto_o at freenet.de (detto) Date: Sun Jun 3 04:05:32 2007 Subject: [Frugalware-darcs] frugalware-current: remoot-0.3.1-1-i686 Message-ID: <20070603020528.0E56E1768132@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070603020124-5249c-4b66a154669cee535531b1a30591b8ef12d31412.gz; [remoot-0.3.1-1-i686 detto **20070603020124 new package thx to Andreas Wallberg for providing thx to vmiklos for fixing perl-tk's depends closes #2003 ] { adddir ./source/xapps-extra/remoot addfile ./source/xapps-extra/remoot/FrugalBuild hunk ./source/xapps-extra/remoot/FrugalBuild 1 +# Compiling Time: 0 SBU +# Maintainer: detto + +pkgname=remoot +pkgver=0.3.1 +pkgrel=1 +pkgdesc="Perl script to control diverse multimedia programs in a uniform way." +url="http://ftp.frugalware.org/pub/other/sources/remoot" +archs=('i686') +groups=('xapps-extra') +rodepends=('perl-tk') +up2date="lynx -dump $url | Flasttar" +source=(http://ftp.frugalware.org/pub/other/sources/$pkgname/ReMoot-$pkgver.tar.gz) +sha1sums=('396e1cb57ff8fea3ae72edc40e8f288bbf8fc67d') + +build () { + Fmkdir usr/bin + Fexe remoot usr/bin + Fexe remoot-remote usr/bin + Fdoc README +} } From alex at alex-smith.me.uk Sun Jun 3 08:46:19 2007 From: alex at alex-smith.me.uk (AlexExtreme) Date: Sun Jun 3 08:46:23 2007 Subject: [Frugalware-darcs] frugalware-current: monodevelop-0.13.1-3-i686 Message-ID: <20070603064620.682BB1768138@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070603063646-46e39-85b4e85f167ca28de64242500c13358891c362a4.gz; [monodevelop-0.13.1-3-i686 AlexExtreme **20070603063646 * Rebuild with new Firefox ] { hunk ./source/gnome-extra/monodevelop/FrugalBuild 6 -pkgrel=2 +pkgrel=3 hunk ./source/gnome-extra/monodevelop/FrugalBuild 9 -depends=('gecko-sharp' 'gtksourceview-sharp' 'shared-mime-info' 'mono-tools' 'firefox=2.0.0.3' 'ikvm' 'boo' 'gnome-sharp') +depends=('gecko-sharp' 'gtksourceview-sharp' 'shared-mime-info' 'mono-tools' 'firefox=2.0.0.4' 'ikvm' 'boo' 'gnome-sharp') } From alex at alex-smith.me.uk Sun Jun 3 08:51:32 2007 From: alex at alex-smith.me.uk (AlexExtreme) Date: Sun Jun 3 08:51:42 2007 Subject: [Frugalware-darcs] planet: planet: include the news on the homepage Message-ID: <20070603065132.ABF121768137@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=planet;a=darcs_commitdiff;h=20070603065040-46e39-0c895c77c582aee0dcbd74168543982070770ce7.gz; [planet: include the news on the homepage AlexExtreme **20070603065040] { hunk ./frugalware/fancy/config.ini 88 + +[http://www.frugalware.org/rss/news] +name = Frugalware News +face = news.png addfile ./frugalware/output/images/news.png binary ./frugalware/output/images/news.png oldhex * newhex *89504e470d0a1a0a0000000d494844520000007e000000800806000000cdbbdde1000000097048 *597300000b1200000b1201d2dd7efc0000000774494d4507d7020b0f1132fe7c67fb0000200049 *44415478daecbd59ac755b76dff51b63ceb9d6da7b9fee6beebd756f35b643e438240595c68ac1 *08410c7622a1483cd10821c0e4051e79410224043c841009048a7872c243148240382421c61d6e *30494420c449ec5495abeaba6ed5edbef6b47befb5d69c63f030e7da677f5fd5bd58a0bcf95e1d *9def9cb39bb5e7987334ffff7f8c25fcd6ff134081f0da97b6bfc97779fc6ffff7ffff3fff2e3f *3b604079edcbbecbe33fd198bf95c72c464e40dfbe06a06bbfd3f6f5db86ff076f786b5f333001 *7b606c5ff3d126f0ffaf865f4e716c065e011be014386bdfd76d03a4a393ffdb86ff0767783f32 *fa1ed80237c075fb7e07ecda86c847dee1b76c78393ae14333f203e011f038a5eeedb3070fff71 *11fd5d1af4ed52fc2c0419524a58294c73c171d484e213e291e2134820a5481757984208011545 *15540322c2384de45c201440e850ccac7e6a77e63c1342e2b39f7b9b870f1e935224a8f2fce68a *a7ef7fc493a74feab170276875426686b67fab2aa20aee98195d4a841098c5e95c2911d43b3416 *7041b5bebfb91f16cb0155414488d2e36d6d45849233a2ca34cdb8cca8eae1bd6388a42ee1eee4 *3ce3398038c162fbbc0569ef62661405b3f63b01a54355f6cce3f5388e1f6ee7f12bb797977f2d *4fe387c033e039f0b26d82fd9107f0df8ae117a3f7ed845f006f02ef9c9c9efffef3476ffd91ff *f04ffc892ffe2bffc23faf3733a45477466c5fcbc2c86f712b5f1fc591aefd2e1ebdc671305b9e *5380ec50269805828028acc27d2262471f26b7ef76f4fa66905b7072afbf4f06b31e2d93b7cf21 *f5f1d29eb75c982accf9fee102c8f2d8d716c0ac6e463f728dd9eb15a9d79533a99b5d04ac1821 *447236220a02d90b88d40ddb05864e389762ffc17ff227ffee9ffe2ffed4ff727d7df9b730fb00 *78025c360f307e37e3cb27187d39e58f817754f50b3ff2a33ff66ffcf9ffee2ffdd0ecce8beb6b *f6e31e1525f51d5103aaf553ab2a6e8e95009a1184604e09f0f2f286eded0dd7db89972f2ed98d *23d96035f4a4941886c49006d6eb35a7fd40dcace9fb40a78e88e2086613411473c71c04276b5d *b8e8053343241d4e8d500d7c6f40235abdd6e5f7d1da066b8f5fb65ed65c8d5d423db5da5edf23 *396742f4ea41b210549998707794eeded3043dbcae6b355a6c5eac7a3da54c105431cd98554f65 *6620f573a9810665b2ba9e396772ceec6f6fe85691ef79e7333c3cddf097fee2fff837feb57fe9 *5ffc3322f65e29e583e60596d3ff8af1e5134efa19f026217c61b3defcf0fff43ffffcbffe7dbf *f3fbdf7cf6fc2963314e4e36a418893162969b51bc7a2b60163fb82c44c08dddddc4e5cd2d5777 *373c7bff0937fb1d2281f5fa14e97a628cccf3cc34efe824d0af1391c0b0eab8383b63b5de9092 *9286404740a4b97f33dc03ee8e37bf50c2626069c696d776b81cbe999566e8ea1be4d89f4bc4cd *8e9e57da478a949cb158d73158a87f1510a4bd2607f77f7feaed952b30add7e5c5dacfbce2ea97 *0b11afbfcfd4c785d0e16de3179ba0c0c9aa2724e5c377df7df29fffa7fff19ffdc5fff567fff7 *a2fa1ef3fca439d6574efef17a2cdef614782b84f0bde70f1ffdd8affefdaffcf8f5ed34dc5cdd *d09dac38dd9c1ce25efd4c4e312334172840d140c9738bdb202abc7c76cd761c79f75beff3e4bd *6fd39dac38bf788be1645317120511c671444a663f8ee479cf9c33bd2afd3ab14e89476f3d62d3 *6fe88748ea03314434048239aa01b799d115673e32bc7ed71c476431526abfc9477fab27df5e33 *bcbb01b17dcefaf8681104a683c7b8377408e1b5d7a079452353e3875a7d96ebbdc1970da04121 *d7c575bddfa84b8e61563f974b4115921b574f9fedffdc9ff9af7fe2cffec49ff96955ffcd799e *3f6e277f5a76ef1296f5c8c53f0821bc336c363ffcb77ffd6b3ffef19317c3dd3472329cd1a540 *ceb99eae961c012409e4a38444c835264de0389d0857d757a0ca3c4d580a74dd0afa1e0f3d8444 *17147743db42c9b0a28c99ddfe0ecb1337377b3edc5df2e1f34b7a8d7830de7efc986133b0d99c *d0c58eae53243a3d3d604c56af934f486d55959c3322d3d139f483c145f64759c17db660565059 *7e1226c6e69ae53b6267ceb9bd961caea57a014748ed79f595960d615613c2ccd43c48db3812b1 *5208a1504a397893bac122a54c8c73268ff3f04ffcd13ff6e3ef7ff0e1edcffcd45f99a09b603a *4ef42cbce6e22f628c9f75f77fe857fee6affe3bbb5d3edfcd136767a7acd7c32bbb5744883182 *08c19b478f72f85b4d74022106f6d3c47ebfe36ebbe3ebdf78973e0c9c9e5fd06d2ed0a1a38b43 *f51a9ab0a824898410895dc730ace8ba9e7e7542b7e9310b6433eeb633d737773c7dfe92ddcdc8 *d5ed15fbed0ef7482919093d12144240424790eaa184e5a4d8911b969654d5c44a24b48d2135c1 *136dcf7544403556c31443450f860caaed35daf3da6b6afbbdaa92526a31bfa6a1a2f53dddbd66 *996dddea2bdae179aa824a2084808812821242fd5935803b1223aa11c3e8ba93f8f667dffefe9f *fecb3ff97fa9facecc764727de17e42d02272d7bffde7ff58fffdbffd68ffcb37ff477ddecb63c *b878c0b05a1d76f3529a8854f7a92298082e8220e8d185862004898cfb3ddb69e6e6f28ee7972f *59adcf3879f880d0ad19ba152928daaf08312121a2b11add55e8428784483f6ce852c7b03ea11f *06562727040d1415b6773b3e7e76c58bcb6b6eb613cf9f3e671cf79819ee35ed0f218246ba7e80 *08920243ea10a12d606c8b2ca8c6b6a04e088182d6cf1b81a0a86b356a7234d4ec3e04508987f2 *4d44201aa24290705837f79a10c694703524401025868007458322c1912084188e0cafc42888d4 *90a6aacd83083093ba4808892e455413c526ccd3e607ffd00fbef1733ff3537f2f867067664b89 *67b1193e019b10c2a37ebdfafd7ff24ffd973ff4ebbff165d6ab15eec69cf7e45250d3c369594e *8aaa03a1b9ccef74a7665b2e6fb7e479e2e5cb17e04eea62dd735e98bc306785bcafe556ab9b44 *049b9ca2827b75992e8aa9a0fd866e1e89673d699ef1cdc46a9e99771357b777ccfb910f3f7a49 *b78a9c9eae597581f38b53ce3767a421d1f7031a606f23a25a33699f1bdad15cbbd7985e14c463 *5bdeb9c293168840d6a5eeae759f98bdb2361eaa9bd79603bc52cab6ac7ec9da4128d86bf987bd *56fcca2b05efe281cd66e6396384e63584712a140a26dd0ffde17ffa9ff9fdbff0f33ff30cfa2b *187740590cdf03a7eefef8477eec9ffb234faf9eb35aaf393f3d2344c14c08140886c8f266af82 *222128227e481904c18391a782ca8e2eacb819b71570e95768ea183603c5a5ba781c358310168f *475871a86bdd9c526682860aa6f45d0d0f39232274b9c0c948b1874ce3c4ddf68632ee7979bbe3 *c39b2dc3939735318dc23b6f3ee2f46cc3d9a6e62d312a29f488e821769a396826013e2b1620b5 *90e0564f5c60aef6b488b9e129136ad50d029e530da2c27764f682b42cfebb259cf6da6fe321f9 *ac212abcf6f7a1febe257c00294504e1d11f7ccc8b674ffec82ffdc2cffd2d557b3acf35c98bf7 *f13d9ec518defe6fffc29ffbe297bff111c330d4042d9743e6088e88616ee0895c465416644dea *dfccaae145703776db1d2567befdf113b6777774ab0d5dbf86182913106b55b09440720496a806 *729e0f39838540b6cc2af44cd384881263a29442d775cca2a81786ae27ae37c83c31e7cc747ec7 *6eb7e7663b71b7bbe1d9d34bba3e72b219586f06de7af406eb4dc79006fa55474a1d88e1cd321e *bc823c25e0610617e639a3edda59c01dac257fcd6bb50df19d0899e0ad1a7aa5c4145ec11f5e41 *920091dcc2c5ab25df62ecd2aa481539542ccf9e5fd16f1e7cf1e1a3c76f3f7ff6f4fd86ee6d17 *c30f21f8e9eaf4fc875fbcb8d5711a590d3d39674a7bb5c5ad14cbd4f235435cb262f90e1e6181 *39efb6776ca799ebab4b5484a1ef88411177dc8d9203e673fb00cbc22dc04cc1ad209eeaa6b3ba *e36fa7b99e3c996aeee115e17294d02b3e66525432106262083d713de363e6643e67da8fecc62d *cf5edc71f9defb7ce6e10d5d1f081a78f3cd479cae074e4ed7c498e8530351826305bc003ed775 *9940341cea7f9b5e85ec44f2c1388b875ceaf7637ce090ed936bf4154788d8e1a5f251f94ccbd1 *f8aec65fc2484809d588e0accfcef51ffba77ef487fff24ffe85aff4210ce338866af8aeeb80cd *effee297be3fa615e76767f47d4f29a581347e307e6c48d70128513bda71a5659d526b86525049 *7469d98581d055371fd38087481f03b92c38b8b5135f4f7850401262a19d9c0e6342acd6eed9da *f32ce02e1510118194708c6ed890f34ce98d159087c2e0993266cec8f8b8e7d1f436bbe9969bdb *2d732e3c7b794d178c8b47e79cae4e39bfd8f0f0fc827e486cfa35ae4e4aa9e63c1a20cf87c351 *e18023c0c68febfafb53ea7a74f6e5de786a7d7b5875e5a67e38f44b08d0a058f94e63bfe22944 *d0a0a4d431cd135ff8dcf7f06be717df1fdc375eb19a6af8e49e4a61f8811ff8dd6fdf4e23a514 *a6696a59b11f21dff58af372b1f9d5ba75a98be79c5115c67de6727bc3ee36f3deb7becdf98307 *d5e0aa94ec40666f19bc560459eb6e5d1663499cace8d16e17dca6ea82550e27c5ccc0e43e3924 *b29ff784b641cc05a792223e083e297115b038138635fd6a264f33f37ec738eef8f0c90d5fbffe *369bb313d6dd4010e3b39f7b87f566e0c1c929a90fa4d811a31cd6c57cae59bb685b835709cbe5 *daeee199fc0a336187bf87ef8aa9db423aa8ddbf427b1f014ce4f09cd236e67eb7c30b3c7d7af9 *b6bb2f4c6a8880cc1094123ff73dbfe32c8640df75872467d95535dedebb9ba0e13b10d0c55829 *2554e0863d628169baa3ebd7c4614d977a5462451070a206cc1cc1c10d6d6fb0d4c439e7ea4516 *b776907c1c9da003d256f3f20a803841042ba58616209782100812d19ac2d00f33250b5af6f425 *421999e7913215f2c58eedfe8edd38b1bdb9e1c5d56fd06f7a1e6c360c9bc4e38bc75c3c3ce364 *58a1eac4d4b53c4889120994460035c31e8137472ee2f03d84d2721dfdaed4992c60abde1b5852 *face506246d70f88c06673cecded15bff74b5f3afbb9bff8e7a3859a6ed60036cf62a00f1e3c1c *56ab15791e0fccd082e6ba1b21e87764a0e058ae706b0c6d4b5ac0bc506621c6c0f3e7cfc08dae *5b91fa8118074415094a960a811637d2825cb518280e29c6830b93d436404b6e1469b9c7525148 *ad8d17542a04c2c2d200a95bb0f4195afd3e4fa05da4938467c54884bcaa04906586dd2d20ec77 *77ecf6137977c747cf6eb9f9cd4bde7878cb6add13053eff85cf717a327072b266ddf5ac567d43 *22235e0a8852ca889582130fb037f8d1bf0350d7b958212c90b136f431d51c28922adcbb6cf80c *29851a76a9d465d040e82331d603f1c5dff7a5c1ac2866c2111629804cd3c83c67a6a91c250daf *2610fe5a3c11a11a1e402b962d1e99cbc4eded0d251bdbbb1d3168851c45d9e63dd113a59d74b1 *8279616e0e2ce3b81951f4e0023d54aad2c352f7562f54ca7cc0ceadc1c872c4c38b805ac4bc1c *9120a57a12adc6910699ba7b8ba5ed334a42baba09bad0938689717dcafa7ccfc9f601fb79cfcb *ab2ddbdd2ddf7ef284a4cac5a30bce572b2ece369c5f9cd10f2bd69d221a1abeae381915a1146b *2ef95570e7deb54fd5b07a542db41fad95ec1ab42695706f78ea010abbc0f6f696cbbb5bb4cc50 *d345b93ff1ed00af562b56abc46e1b0f6ed5ad0205c7ec453430a9b87ccdadac891e62f50c69a0 *5c430889abcb174cd39eae3ba15fad49dd0a6224682425c5b2207181822b201203472524b5be17 *90b4b877396c4ad588134132a1997521320e35b140d2bee1e08648c730287363bbacf2bbb855ae *2014a5e40caaf42922aae43933b1a22f8e9591d387ca384d9469cfb41fb9bbbe464ae6c9934bde *db7ec4e664552b83a07cdf673fcbc3371e70ba1e485d22c6481720866a7c104aa9e2153faae24a *6a24ce6bc9e1e1407af55a25dd0b381aac46099052a2dbddb1198d797ffb4aca105f2714a6a980 *472c6724e483015e01160eca036df1b9021e6e0551619e26aeee6e99c699179737ccfbc27a1388 *216131125b3cceb3e3960fc98d6098f95196ffca7ea3d83d967dbc00d972e3b0a79629c75a5296 *7bca70cef9fe758a1d92493dce1d104a9ec153ddc0407681022e152397a0488ea81943df3169a0 *eb4e18561b8acd9c4c0f99b623bbfd1dd7775bee76b77cf4e429eba1e764bde6ece284b71ebec1 *f98313565d62d50fc458798f5c1a57ef8e8bd5132d75132ebcfe92309a55d4a04c53856f975a1f *18a96112f35692e7efc0135e337c758153de36c101873739367c3ea6a74508d9c8a171e38015d8 *edb64dde54300d84ee144264decf480c35b327b77ab63480a6ba5b7fa55cb967cbcce6439e6156 *ee89e5acb880693924378233513750f0dc1e9608a5d2b01582adec97783c4a50e5507fef99aa27 *cb6de3abd5ccb9382e813967240cd0f076b1996e7d8aa6cc700eebfd1567f3884d333777d77cfc *72cbbbdffc80c78f5ed2af126ac6e7bff70b5c6c566c4ece580d818e882647b426bbb355de9dd9 *f1b9ba766f84931d9df357b9fe5a05ed55d8eff7e4fd9e799c3ed9f02104faa1a71f876a30b3ea *ea63e0bb4919ac010f31dc832f3176ec7713413b6ec66b3efae003bafe84d5664dea06babe276a *c20394a6635b5c6da1921620afd5c04d10217af8598864af3982d60ce640634adb28da5e2bb603 *3d61d025340b6e4e9ffa8aa2652597b985b470ef5863a82e3f69e3f5f341ff56c45875abea508a *635d6a5ea91053ad20d69b9e5c9c793f71fae00de669cf6e7f4799266eafafd9cf7b6e7efdab40 *e1cd470fd99c9ef1e6c3873c7878cee966601812ee42e805cd75ad8b3b921dd498cd0ebac205ca *5f90531541fac8dded1e9fe18e4f3df133d33851762339cf68e8715b2448af53994de76b862ed9 *a524f2bce5c5f52dbbdd96cb972f996c66d527081db833e68912609a725b5c255835be1f34708d *03b042968260f72591194879a5bc533b60954c1492576f20b93e66f67a36969c24368ddb3cce95 *6e5db0f6e6a140c18532ee0fc9d2b2a80b82e9661432a3147a143c613255cf3057b06a26239d12 *487851d65d47ec378cd3c46af380ed78cbb8bb63bedbf3ad0f9e7375f5554ecfce39590fb808df *f7f9cf73fef09c07271bba14e8ba404c8900b8d78474f20a27e3605131b703c066bbc4388e5cdf *dc50a64f39f1b288019212a52aa6bd7982855b7e457b2db59c4aaae43c832a56849ceb73f6db2d *41953eae204051e843c054e9241da444b5f4ba971689348c5c2054bd6ecd1fc409410e88d77239 *2a01d7267dcaf70e70a15cd5d3a1ea00902c07838be42626b8c727cc2a791851b2de0334212f88 *625d97ac42278ab7aa011288e07151e5762042dff568ae3073df4dc4758fcf46574e1037f2ddc4 *54f69c3c7ec46e3772bbdf7373f98297b75bd629f2f0c139a7eb156fbdfd56259756276cd62b4a *712418512385093147086863ee3cd5323ba584e7f9530cdf351993064aac88819b230d4215d5c3 *6a0be00d35ca66481308e08e954c4a3dd7379704847ebda2ef378418b1a80414b352411ac09aa1 *c312eb97722d048c70f02821740766b086260e8a98ba310b5dd28356aee63705316ddbbaaa548b *dc6f8a83e8426a8e2180583575910a51173392434e0117472ce161a2d35043a2433c06b4bcf2ea *de361a9e08b196a3ea43d52a44288ce09129ee19f482757ec0388d900bfbed2dbbed9ef1ee866f *7ff092eb9b7779eba3e75c6c360475bee7fbbec0c38b0b4e4f37ac07274947e803a2019f778012 *fa8e989c2e25e63d9f6cf8711cd9ed764cd3449ee78391bdc98a5e51f6fb3defbcd4cb42e07abb *e3f66ec7d3a74fb8bbb96518ce202893419f0ba250b2e1560e0b6d47fce4425e8845ac5515f709 *4cbea77e65213aeeafb12c0b4dc47dd1a3fb4113ed4c15c29dbce50b762048ea6b38a65e932338 *2487d1ab52b1feecb0a879757f60e15e8564432d1d43c18a11a5ab1b31945aab9b30ba1382924b *21cac0e8864b42132085d549a2dbcc4c9b532edc38dfdeb0bdbbe19b1f3da5cc7bbefedefb6c4e *569c9facb9b8d8f0d9cfbcc5e9b0a11f56ac365d1594eceed86db75cdedc92b7bb4f36fc3af56c *d66bc6ddaec6b265598f746bf5b4c5035276004944304dc471a2eb3ab6d30c12899b0ddd6a4d88 *81b8ea3157a48bcd5597daf8d0840a05236860ca73f53ca48a4537c8361f627a6c40cfdc6aefae *65f2e5208f166092868c9506d96aa8c9aa4634d48d6307b9d33d761034923192e55762fc400388 *64015cba25b8569e8109bc269e3539bddf88aac254e6fa702b079a5e3b081e619ed11410595372 *6dcc400aa72730e799d5f9050ff2c49467e6ddc8ddf515dbed0def7f74c9bbdff8800f3f7f87e6 *99878fdee007fee1efe7b3efbcc9d00bebed9ef3096e8e84a4df99dc95ccd49280dc12982579bb *3ff115dd2ac55e61981cd8ee466eb67be679621af78826fa7e8d6a2268205b65a2cdf6909d6c56 *11b4e64172cbc9173085e37f37c31cebe3173143b0489642b08ace99e9c14bd4e6842a0c410b85 *09f588110e958900ea7240231707e4e6e400c922a31512851c2064ad8adad7729e8552cfb9b47f *d7eb23175c124397903ee105cc03e8dc3c59152dce79c64c09aea8d4835762eb0a8a09cd139491 *55bf21ad369ce5893cee18b723b7b757dcdeedf8e0e957f8ea37bec1db9f79831ffc03ff086285 *17d737307f4a8c2fb9bab03967f25c410344aa60a09d8c63c1c4a233f786954fe3c46eb7e3e6ea *9a6fbdf71ee70fde441b61e366f85479eb719c98f677c4a09c9e9dd149c06c3ab8796b59b81d98 *ba45d0988ff084aafad95b2699938312724db8e4186a16c117793286492498922907f1a5f93d4a *795caa2e25e01084ce8d849045086a6481d01a24dcfc3e54b9414a87c4b36084149190887d64ca *ce0c8c3e537285b8d569d75341acdcfa876caaa149110a0591408c6bcc9d280997198635b2ce0c *e7179c4d3bf2b867dccebcffd133e2af7e852fbcf38871bf257af964c3a7ae23a644dff7785292 *09c5adaa550f4b92108987b24755c1031621cd95603037ba2e5581e46a4d1856489f2ab9500a25 *ef395b6df8e67b5fe3fff8955f402551a4d40e192b47ae52b045cbd6b06c337f85b635b7763d76 *805ccb9cf11408796252272daed81cf342d29eecd381f9b306d0ccd344e813e4aa790f5e2b8da8 *4a2e19332525c8f968c31cf5cc2d8254b372c841caa1c12290bd707ef1881ffe27ff30abd50945 *02ae89e08924c77abd4643b7bec05cacf6e688d464b508268e85ba41cb7e02032b13c58cbcdb31 *bcace1f6c38f9ef3f0a443c3a7d4f1fbfd9e711ad9ef66cc0ae342fe2f089e2e48db3d87ec3e57 *c32b3c7b76c9348f7cf8e113306d4ad58e69ce040f64f64c73c6b3f39bdffa0adff87b7f931023 *baba20c50e4d03458d9221695d5833af19b55629d7722acd6b4d9d73465c5bb25943857595ccf1 *29a14108062a15ec7033728155e85be8c835ef10a1eb7bb208a9afcd117d084c56a9e2aaed8b40 *26243de8008fafc3cd1bb4bafc7d262fb26b8fece61a067ff1a7ff2abfe71ffd7d6c4ecf58ad36 *30f4f80c458e1a338b61a95eef127b166f17db069bad914a7922c6841170011d36ac4e676e5ebc *e0f9cb2bc65178f32c7db2e1ab482f115324e76a580d8a345729b5adf5903c2d274f35b29b272c *389df7ec7677c4d0d1af4e882111b4d2b3ae82f8449a8477bff655ba2eb05e0f0c278f91d50a0b *4211a7142184aebe6ffbb0e6569f4fed37cbb9814aee48d1ca3b2d1bd3632d43e53e6e67b90f1f *c163fbb9958f5e6967697cc5424a09c2ec76a86a8e01acd61976ef35160fa58ee47a3da182d287 *b53ac94a29132f3ffe90cb671f92c73de1adb78921d177abeaee97447a0815630fa9025c8b7701 *82489570b4ea3aea293982e791208914422d1df592b7defe1c1f7cfbeff3c6fad1a7b8fa180f3c *76fd908da489b1d5d9dd2bc9cc84e322f42171b31df1ec7cf4f439fbfd4c1a4e897d4fe8ea4926 *24825a6b8bae7ab821f484e1145b9fe1714511450248a8895f19da7579739bda6a764f90a8a085 *48458670445245ff4ad5f3dd63f77ac8daed886636f75ab9146dd4af207de522ccad921c07e842 *6a722589bd65822c54f0821778ab34ace215014aaeeed88b830a920a9ef7ac5727e4ddccf3ddb7 *393939a9e2d3a52f41158f5a49325352d0c6058483a7733362cd3830adefe3c50892d010e83be5 *4e842e75cc5eb8bbbb63b6934f36fc3c4ddcdeddb1db8d2d2e2d899cbf029c2c35aff689799ec8 *52b8baba641a475ebe7cce6ebf637d728113c90e3219c12740d9ef77e898110259329a56107b66 *153c284e4083e381a6b59b984848838d4b28248b4c6208ebc69b5777e85ef0eccd08022591a5f6 *f579806282aa21dab73abce50a4d422e16c9210309b70957ad5e36d7dc615669d9fac02c56eb77 *5914b60ed60cadd4dc6891596b8dcd413b8c8c44e17677c5f6e69a371e3f42fa13922b216adbe0 *d010d9d63861f749646bda8499bcc8bbdb2604b0096eb785ebcbe7ac571d5ff9b55f25aab3fdb4 *3abeeb12279b73b09b0ac11e65d6af340334d1bee53ddd6643991c094a5a75281d29f6ac4f37ac *fa0e8991d4554e5b44e9a6359a76ad044cb824084a083d866321a14dbc388ba03155454fed6542 *4c705192d44512a8a86188b8d7581b455e112376c0e48b1ebd26691a42e3171af3180a58aac210 *0f484a58d64af4b83585519389852aa45a925e01266f40d1d203af81249189090d09bcc2a8e21d *daaff0fd84e78c535075fa7e2076ca5c20e148d792b9d6d4e97e2fd25cc257f4ee00792f557a17 *22d3b44734f0e8ace7572f9ff2ce1b1707f1ca772fe74a050ba6697c45162c47bdc387365e7714 *c873663b4edcdddd71755dcbb8d49f2071c0440944284d112bb5af3bba53722624a91bac080430 *a93a7a733d749a48f1061ddb61c31569652435a39f7241981052155452cbd2a03d9667b62d3f70 *9bd01070298790b15409a09816dc04f31931085adf37b7724db877fb73a37eabebadc961a1d6ca *dae4e0a34f4d195313482ff57db514c6fd9e5c46283504edc7919ec45cca2187424acb2fec501a *72c4938a08c5ca01b61211c652d8dfde419eb9b9bae6ddaf7d99cfbef98314954f63e7f2a1bbd3 *0e6a95fb2ecfb96597b1412d7b01c933bbdd96799aea770aeb2192babe19b3504cb1529058176a *9eb6680acc36430ab0b8b2d6cd6ced7fbc550f5e19bbb9813a61c9e045985dc0b5b17bb9b17a0a *06938f35eb961e7530996aecae301b450d6ba1005ae98ae05637fcd4a8e6d4f282dcc49b42429a *08c50e3d02f633300400002000494441548e6875fd5e6ad2e94b9fa109eeb9825ead83572ab5c9 *388e0ca52039531abb2618c50cd7422e9944aab235cb15085b125111dc0a9dd41e080915dfd8dd *ee8851f9e6d7becad96620a5a136b87e92e187a167e807729356dfcbab5bf6b8347b352c5b1502 *89abeb1deb61c3bbd7df2668c7b0aedd32127b5208444d94a088047c30f23436158ce31e2a77ac *021e10c98793159aeac472e597bbb450a78d13af301d2a559ce0722f02af43076a3561b95494bd *9584aaa176bf8810255482a6e5054b72ab3130b76a42a8d727ad4be5705dc19b12b995b652f321 *54aa2eeed0362d15fdd48e188cd2d4cb0e745dcfa0917ebd26a6805a5502d75eba899e155e8e5f *6591a6d5da3e93485e87544834bc6444e1f1c543fede2f7d93371e9fb15a777cfbfdf73fd9f0bb *dd9edd6ec76eb73b34481c777a1ccba0dc1c93c834def2e2f92526c2cb97cf51715cfb4ab0ba30 *cec6d886300502dbed2dcc13a5649218cc551a344f822a145f78ef5ab2559edc3084796fedbd43 *73bd7303706a2c2c455b938335514463fd42cd554aa9e1da3d1f3c8c06254fd65cf5226a9c50a1 *7a98daff8d5b6d2071abeb524bc3dcdc6d0b171298e799d0ba84ccb9ef6f975625943d3e4d642f *b839dbed96cd3431ddded07589ba45e3617042d019f565e2c65c1b3c2d92ada0b1b2a75ba99a22 *9f151f476e6fae78e32cf09b5ffb0a3ff807bfc8bbdffa0099779fa6c051528aad87bbbce2e611 *6a3da9cb6c17a148649a6ad3e1fb1f7dc4cde51dabb3076c366768ea0edd1cee8290c00aa95be3 *f358c779e4f9a06c0da13f88f942d3c1d73ca2b66097767a05c80d1d5403f145873f3481463b79 *49912ac1aba81a82045a3b77cdf2a5296b55040b1ce8678d8a523b7316aec21a955b318e7bc592 *b4539e31c40c95ea0f47774243e044a4ea5ac5d1102006e6e6f22b6f1e18ba9ebe4fccedc4570e *a2824e36392642d20537185ac3a642caa8552fd399725bee3819069e7cf411b38fe49cb9bcbee3 *f39ffbdc271b5ec3d2781f5bbff8d4929f782f643023a515d99dce8dcb694288dc5ced20750c7d *22ae3a5c20860ac192aace5edba297064844a9a728094de65c5d60d02a305c5ca5358d9c9b318b *11ccaba236f55513d086201d12514950ea292ce2ad49a3956252f572ea7288931aaac1bc4db970 *5f061669153b6a9b016046b67228d34aeb0a3631b4fd7ba2ce06886db84106d402120a258094d8 *10cfda0ea56d9d0835c7758d945ce5145133599a5d4408b10155a24d245365f221745573ed33a5 *cc9c9f44befc77dec51d9e5fde707efe19d6ebf5a740b6bb1d7777778ce354bb541b91b164c98b *287227f5f7b7d3c8f5f515bbdd4c9e270427f62bc4948ca05910cfe43263662402fb3c21b95072 *2188537281a95489b05422339bd54530438807a955a1d6e88b7cccbc36559652a14ab44e95b09c *09415a8c76c282bc790b516d94c9c2b0a5068ccc87ec3d1eb562dd6b02e5480b68eab8b59272e9 *1d140e34b29931b590357b40724125b09bf78479c2dd9826639f27b677135d9cd0c9885dd50be4 *26165d00ac6246d18c344abc92685e95c5d23124e16eb7e7faf2259f79e7017fe3977f9e27ef7f *cc97bef40798c5aa7af813ebf8be63b55e63a5604598a52e9258ebf90ed59586a2c418d8baa29a *986ccbd7bef91e0f1f3ca25bad897d24f53d51031e2392eb3489a44ef68c76b51ba0685bd05465 *42418552ea898d022eada46ba85ba042be1252f5204855ef1c182cc345f05055362144c40d09cb *4c9b3ac142b475e1c87d2e603821e483e14d0ade387b09f7c20f21e0ae75685052f679beff9b44 *ba941ab10571c1dea3345977c502525a317b4254e8ba5493eaf50a3c542146a812f104cdb0427c *ad6760e87b2c14d4d698430ac634cd9cf46ba21b4ffececff0e6977e94b3078f9061c3a6ef3fad *8e2f4c63155ae67926aba02d4656ddfa5cb35f4fb815aeef6ed86eb7dc5c5f9362240d2b866153 *7be3f28cc5da1cb9b45889d6fa7db27298f9e2add1d1b330d3eaed367130b7515f561637de924d *b1ca7937a0c47c6ae3c0e63a1acc63ed50f1d478fa1aaf29d3a1f3a784da889f1592d7b93a499c *d10b9d39b9b160ae40b6aa16ca8dfc6938439658f38946c78676e26b3caf248db50e2011ad93c0 *4c99e6f14038e55c1b54759c909428a357bc083b52cd96d7e4e6cb448dca08a60c23c26e5fbdee *4ffd959f047ade7cfb2dc2708278630f3f91a4f1da7068a614d33a584fa48a32dc2a162995d79e *e7c2767b47f6cc93271f37373f5054c95e9b06c722049703735672a1e44c71dab0a3eabadd8d52 *3231864a798a1fc692d4455b0613b52951a5a280963326cb00114109553b20a56208b9906da6cd *f340ac924ea55518268e63142f981826a196980a628a68a64824a8e09a509d0ea48b4ac04b2d21 *473362e8d8975deb652b0daaadca2f2f750e5f0cede7a68c2d653c50cda554b267f6a59c9b6a49 *780098a45559f79a815c5ad9eb8251b8b9dd13a71d7ffd7ffb65182e383b3d43fb58452f7c0a1f *4f1719fa0e2f3329d69123bea86442681dac6da66c7154239bcd1977d77b621ae8fb357dbfa21b *ea5489d2109918ea6b25edc86562ce0195d836931f2647892cf5b2b7a91186c942b0d4d9b2d21a *27f29459c78980d456249beb098ad4060f2229781d796a5365b35affbab596a3b220930754abd2 *d1eea162eed6d04077c83b506bfd79994c60b20e8d913e751846288a243da8920a1583a8c86e20 *4aa4f84d430fe7c3678e5dd540484a880c8744554dbe638cca327fafae4e9dacd1858efddd2d1f *7ef821dffbf609e5e37779f8f9dfc13b9ffd3c170fde20e4cceef6f25390bb79e6667fc36e371e *c4962104c819cbb9ceca2a852e0d5cde5cf2ecf29a17cf2f99a63dc3ea04e9fa2aaf9a46ac54b5 *8b958c699d443913d8dfcd94b92252b41a7d9a273cf5ccf34c76435b438487d2e0d0366746a194 *a9c2aaf98e7ff35ffe63fcce7722c1609aaaea76e9399dfdbefcd4e5fbd11c216f1343177da437 *404a5e9b5b5b8ec4b36141160552843ffeefff378cf31a2f7b24ae6a4957966e1c9af7319206e6 *bc650a824e133acf94b9c67c37639a46b89d081dccec1b352b47ae3e3683e7b601b495a4994062 *e799af7ef92be479cfc7efdf02779c3d7ec466b3c1ddd9ef778ce3f829c85d3fd0f71d65bc9fac *50d9ab78804a538aa844ca64c410b8bdbd663bcd3c3a4df45d42bb9e98068a3ac11589a90de115 *c49c30243407449552e646dedccf83b3d2f880363ecca476dfda02884802355230ece605574f22 *65bb3b34119a8da8f6875373af95b75617f841b1733f5af478fad47d693b37b1a51eda958ddc36 *453c7f9369fb92590b299e223993ba886b682ebab5954bf52d759c5942c354f3245912be8607f4 *157d0b96286dd64dad22aa22e9602ec96d368fa0edb03cf9f039d33cf3b9371ff30b3ff5df833c *e49d2f7c96c78f1f13fb15930ad3eef6930def5e15a31a14f540302337856b25390a482497c23c *4fc418c003413a5627e7c4d4558836282ab162d8d8419972af71ab711d6b644d6b529c4d2a276f *daa65d082e064dd9aad2861021140b54294540d309fbf1a63562acdaa62a581354cc4dbaa5dabd *767ce55ee1726c79d3da28891e74fb3145dc842c5543af6940c611933ba6e4f4a71775b276ce75 *40e161eaa453246032236ea8d44d3f066933076ab3ca32acb04427b58997aed4f688723c92b5ab *5847a7dcee8c27cfb6280171e38489a77ffde7e1cd7778f0f8739c9d9d902de06522bd3629eb55 *3e3ecfec767bc6fd9e799e89adaebe1f563081cc4cfb99ebbb1bae6e27bef1f5afb15a9fa2a1f6 *c34df34421218c555102941060bb27a4c07ebf234f7b4a2e0c29616e945cc83ee1b1af259c189e *ef756b1470ad1b656106cb34d561c902f33c551ec0ebf4acaa07957b7978dbd4875935cddf57b9 *9263cb80a7c53d2f75bbd2524c679ee7c33874cb8179b7657f77c9248570a2e87eaa52a9f68ec5 *ee478e2e7d7fce44291396ab2cbcb48c7e9a46e6bb3b729c6b89db78834c4d1ed5ee2782485492 *f43cbbbce2a397770c21727b7bcb767b4b3989c0131e3dfebdac3727e0ca38edd95edfb1ff3457 *1f6364bd5e81973a79d10c6d0045ed54599186c493a72fa08becf7d71477baa16738bf20a51569 *7d5a27392ccabc050869681e833397b18e3929d5059694ebd8510d4c736dc23414970c31b66242 *b06264b53a59b29d9492db029b57cd5ad0d66deb305b3b272d9cbc36d1d6a619391a3cb28c1fd3 *c360fcf66cbf1f3ee662f5660973a92250d9b3d2c787e18369b5a24c0b82b80c266e03a14c88cc *580cec8a11621df9daaf4e18863592221e12799e6bf9fccaf83747a220a1e7c9d52d57fbc2c5c5 *05aa30ce5b1e3f7ec4afffed5f004e78e3edb7f8cc673fcff9c3870cd344076c6f5e7e3a2d3b4d *557d3a8ee39104eb5ebbb69b662e5f5e318fc6cb17cf119cd4afda6c5747276796a90a0f545f9d *a621c2348e943cd73a16639e26b4847ad25b674bce65197cd950c31a136733285588614bcfb744 *cca6f69c5a1e1eb2615990363f0ceb2e6eaf5cd7fd883969ad56f5b4befab73a9f3e864602c584 *87d812d4c06e7f4b973655a3378f3554b853bc2983ac024b2a4d47574a2b610b3665f27e621f76 *244e28658f153bdc59489ae0443521aa3cf9f803ae7705ed22d338e238dbab5bde79dcf3577fe5 *1760f3808b8b07754e21308d13dba97af057e0f9575cfd5cd99f6576dd61f4c672f301adf2acfd *583b6d6e9ebf24c69ed4af28044248873627cfca449511cdaecc7e3feabcd6b5ed7b43c2dc9522 *76687e74ab5fb3572c61217316199299111d12154baf98c9e2991aa9e6b5baafdda355d091a950 *edec758a6691e50e18d56314a9ef6f872fa7b86341181b3c3cfad44691698550cbfddc3ecb75f4 *5a016683d917aca23269deb09252f2ab730704f69e2b0f8f568fd7fa1045033b2fbcf7e153aeee *6682683d2c383e174a99aaeae8c513cedf7cc4a3478fe9fb9e106b774fc9f25a987b3dabef360c *abbeeab3cbab628c61e82108d3b425c5c8871f7cc48bbb2b4e360f1836e7f45d4f970624049c88 *0cce2c4d13a6b165f540d7550141ebed5d8c5441a9844aa6914de410aa94d8eebb6a970edd9052 *d5ed5591fb612c546963cfda1b1fe6f1058f4c0e7ddfd793171a10d3060a1e37531cb7c6b85788 *34c121e44429a4eea40e55ec23b18f87ea04957ae30195c3ccbf1802c56b1d2802310642e8eb3c *7fad6bdbf703b91bea6e6f61436445d0aaa17bf6f205da0dac92231e89412914f27cc7c566cdfb *bff91bc035e7e7e7bcf5d65b3c7af488878f1e52dc1877ce75d77db2e16fef6eb9bb1bd9ef7675 *64679b905c969b1979e0e9d327dcdedef2e4e3e75881d8ad90189973c0a6118901f58217a3c4d6 *5c68a18a13288c775b2c6772c9a804722984c6c4cdd39ed069dd74dcf3e16aa5316da1bac7e294 *fd8e09c3424427a7b411e2e138a3e37ee6ee6c06bae2dffdf7fe23c6561a06027e2f5bafbabca3 *e18421873ab2a551b8d5dd87dab24da4c88066673f195d9f2979be57c8d87d7e33e780845ca7cb *6541c6f1a076daee33d7773744d59a3734ad8368443ae1d9d3e75cdd8d84d8419eeb2008e918db *c77cfae137793c087fed977e11e4210f1f7d86a1efd9e7cceeea96cb8f9f71f5e2e5a727777ddf *d3f73d96fbba8821907341a5d1965e67a36b3734c223d1ad56c46e6058f790621dc1566adf97a6 *462c945a7706514a4a7897da4cf7cab78b0841062c589bfcd454315a2757745dc73ee77b758c24 *4ae80ff3eb8e8d55b17b7b4563600e85484a1db7d348486b425ae149314f84a65deb88984f04ed *c9251f1c495c863f94da8a8d2bd98dd00f84d4a3ebd3261f4f87de79a1d2bce2098b061ab036be *5c5ae9863b7d4aacfa9ed06fd02e354dbfb29b334f5f5e32219c9c9dd74a232ec9675f51c6b9d0 *a744c79ef183af236fbec5e3773ec3c5a3079c9f5f707ab6e6fcc105dbddc875fab4860aaf5322 *c381562c55516a155cb8b9dde266dcddeef9ea57bfced98347ac37a7f546032e489b6153a9ab2a *eabf57a0384112d2f471d99ca0350626b11adfcd6b59667502865b2dd1c64ca3230597cc38cf35 *eeb716a5a2b1e2e65ab56aa1814f75c4aa56f2c4ad46000d6888e8d013d21925248244dc2692ae *288c942224b54339195abf7df23a234fa4cecf931028d213e300616871b9dee0c0b2e0b12680cb *687469c96b48a1257815129f44593591866ae2e5d58e6737d775e8449ba38f0ad9aa1736995033 *c6ed963c6eb9d97f0897dfe0e1eff943bcf1f833ac562b367dbb918186c321fee4fef85ca73cef *b677e43937950aed663f85972f5f7073b3e5f9f3678490e857674888350bce3336d60f493b9dc7 *b7eb307790c2dd54f9e8520ac56b16574aa1480d0fde840eb31542e82b8fbcd4c34b9362639bb2 *ddebe4169d7c4dfe6abcbf9f8bdb542dad4e4fd2a1d2e37d8fc41e2711acab4305bce2b8129a80 *b3dd0d6a19b51a65552b09bc72112e648ec7a3541a3bab13bd276747a4561d298197ccb4db32ce *73cbec67f6fb11e99d60231fbf78ca6e9e518dcc5649196d52336bec640a099f662e5f3c65de5e *f31b5ffebbc08693d33336a7e7a8c16ebfc71dae6eaeb9b9b966fa3457df8535ebf519415bd9d5 *06f04712a8a32aa4d5c0f5d5254103abd586b8de30ac4ff0a88876d5452f860ae5086a14ca3c32 *0c3d36ed5a6f5c832ebd769786213117c75c891a6bcb94c4aaafb03a712a848095dac173689e94 *5c099436bfaf50e3ba67a9b3f48ab53931333144e813923674c319654840939ab59bf22cf2ee65 *d3963664a90e3cc8140f2df409416b0b56955c392243f50ead5f5f9313bc4eaa88dac6af8440d7 *25ee66a13f39e5fcfc017b552eafb7e8b0e26cb5ae5d4192db5da8620392eae70b114a9800e3f1 *1b6ff0ab3ffb0dd8ac78e7735fe0f167dee0f1e3473cbc7848dff5dc5c5db1bfc8ec3ead8e3737 *c669647b775749962644c86accfb99175777b8c18b1757102a0eaf31b19f27fad0558dbc579ac4 *143ccf75c0001da81cf86acf9549ab377cf403e55bb255b162e8da98b486673780bc945a8f97e2 *4744c67227a6d67e54ca61b2e5d20b5705bcd5a374bd3678698b5b20e61e2592bd1c01394d6328 *81699a88421d8668153e9dbca308a8d61b2965cff5909802e3bd18f5d0e8092e352fd0526f9428 *383a0cec6ef6fcc66f7e138653fa9373c432a5682d3017ccbece4ac7108214e65199b7b7dc5e5f *b13981dd37bfcec9e7dfe6e2fc1c978e82b1dfed99a799dd76c7eddd1dafd1f1af61f554b995a9 *34c2a31c6ae8bb718b5be6c9f3174ce39ebedbd06f4e90d6a05866a168c1a54e9cf03621cab357 *58341b2ef731ad48c473e5a3672bccf34c97aadecf5be78ab48d123cd5fca366586d616ba11f09 *757afb117d99db24bb7a1fba1a77134e2e233ff15ffd676c4e3a72c55ed00856e7361dee2219f4 *7e0ecf321f67a9f73b853ffd3ffc9ffcec2fffdfb5fb4657b5ce23a0522553eacb14ad26feac6a *8ec324f01423acd67cfdef7f05e9bfc63bbff72dfa754245dbfda1e6d7ee8ab55c486eef25cce3 *8e8472fbe23970cbe3c76ff0e08dc7acd7eb9ae04ad5042c34c4a7d6f17ddf9362a2efbb0a1b86 *809b6208566e4869c5cbe7d7eca7c21b176bfa2ed1af3768a823bc3d2a2e4e9d065a3f6c4aad9f *de1d71c353c2423868d5dcbd75d286a3bb40ddcfb98921d46e933687b68ecdad70728ae99591e0 *a5093643034d2a6c6af77d0025f3adf7be4117075484181ca260e35c5b4f1b211368b73d498de1 *b3d85c7b4636e79c7581e9ee8ab479805b4163579544ea6df2546bb7d22544814a6a24d6cccd87 *135ffeb55f637afa11bff38bbf877ebde1e4e49cd0370ca4f54af9729bb2e516a49a0912882edc *3c9f79f3d19abff52b7f0de2433ef3b97778ebcd3779f0f0848bf35356eb0d22c28b172f38d90c *dc0ee9ff7df8d17e5fa557c52744619e665ebe7ccecd76cfe5d5cbda4bbe5ae1ed0e53da47f6b9 *66e6b2dc8acc97f1e1759450f69128b507bf2cf7aec39aebcf64ad73207211a44da5cdb421be59 *2b7882d46994addb669c26e6ffa7bd378bb1edbad3fb7e6bd8d399aa4e4db7ea4ebc242f078914 *2975dbed8e5bb6d38dc43612c006929704f04b27798df3100406820470f29487a0013bc8d46db7 *61b46dc4b1db869d1e24f520758b524b6c89d4444a222971b873cd67dec31af2b0d619aaeebd25 *52adf653177079b9efae53c3597bafbdd6ffff7dbfafd0b1b16e505a2caa8ed22fa76c6c344120 *68a75da40c0b4a9ca43190d0c27882535128ec5c7367ece22df2715b2abd86ba623638c01847da *131825b0d2637d48b1527e1e481060c5c2297c9631ac0d071fbccff8fd0f820d3dc9a86dc36c3a *c5eb21ba49f1d2a37da47b2d9c4171958d45a23065c3e0f088277a70f795df83ad4d5add6da410 *5455cd703862320dd5d5e160c8c9e92993e9f4a2264d4292242436a0c82c3e2cd6ac4492503753 *6ebd7f9b8dad4b144597242d48f302af8307dec5a97cb5e2457cf6699de10d244905f53c12d4a3 *5416b6472a80009d32f1ee21c6fa88b0c296a1a0a3c89052d0cc452282b331a062017b5ec4a579 *54bc005798b63294709505e3ec2224d845b3848aafad7148e317fa785b9554e5105797a8c2224d *8348154848858e1ef7b8d84b8b980c050ff68f38180ec9bc236fb5b1d528f0fe748b2c4b69b7db *c85423b40849c973b79c8cd5c5e8a5131266a621cf359d36c06d36779e617b77877e7f9d6eb74b *a7c8436e9fd6b4db6dd6d76a66c3e30b9a34111e0436d2a08368703a9d30b30da3e1902ccbc9db *6d74ab83d202a943e3c3cb34501cdc5c14282201ca47ab72a44539171768162d4570d444b1a227 *d6b417f021155833b828bb9ac37b25dece61041a293d4ef9255059ada0371121ce84a08c157e91 *838a1741d32745c092592716121b2708c18504c169d0003894100b3e8d332e7418a37539680b1d *388b4c533c09fbc7c73cb87740d62a48923689abe2456962e6408c13734b3ab5442dd62c413d64 *626a40e8774cab0979abe09defbf0ef4d8bcb4c3fac616455150e8042564fc3997a0a8551af8c3 *fdf866de9d6b42c6ab0844e5e3c100d334dcbe750b292049c3346f7c64a54b113469f352e73c73 *dd360b6c69e3835b765697b8baa6f106e965d87a5983f509b5a803a0373a97eab9c62c7ac34d2c *87796f70d604aab34ca373359a1ca23833f030e5829563ac0df26d211142474d9c0dd26c27168e *d479c6ab049c4ea36529000fa44c425fde38aa724ce24a7c53e19a3a6a1624420425d2dd7bfbdc *3f1e824e515946e341e3286d836e62944ae3a8ab3abcd79309da876db3b02aee56ea40bf9241c8 *229da0b186e1e109379fd8e29ffdeae72069b3beb64eab55d0340dd3e92cdc6cc6209462341c31 *1a8d1634b3472feeb4a69564780b4a65282599ce66245a93770a66d309324eef79d14617719a4e *b3a83c110bee9bd02c8dfbb1ea268443b5d69999f0ec93abf19b890aad4b529cab82765c2bbc91 *581d885c5a066280d512d784b2e77c2de10d6171b5e28d0f953e8f323220d67d60de374df8fece *b86546b4e0a1406051874aa0894d7beb3d49d1c2291f62ca4446aa73749e81ce69a4e4ded180a3 *0777f14942d6e92ca25684082b172f343a09e40aab14599ed36aa5b4d73a41114bf00284154d16 *b6b4f14250226cd3f222a5dfebc0d103ba97b7b872f52add8d3e3bdb3bb4da05890e94519d240c *8703eaca525e24b69c56253353477f7c28689c9e1c33381d71e7ee7dc6938abcd725cd8ba0f06c *044e194c15a4d9cba892b9dbc444f363c8664912c96432890a148ff521de4c188b5141265de363 *a3c5209ca6112664eeba300856809b595cd3043a666ce0f847a45c1a63d04968bda27c303f7a49 *d64e2345c2af809ce601c18ec4815122e6ccc795b90ad48c2ccd40b5713e54e772ad98cd1a0e27 *43ee1c1d2374882d0b0bda506f10cee111642a48b2cddcd5e21c55159c4b723643fb148445faf0 *f9f37dbcf47aa1c8181c1fa1bde5cd6f7e1dcc7d7a6b4fd38909df755d83f08b4c2184603c1e33 *1e4fa82fc4964bb5448a46cbd1a4342013264d43692bfaed1d545280523458b4ce8253469ac0b4 *c5839a372a740c305258d7606cecc77b055e635c195da5c1a36ee374ebe6383531872c4629948e *d15b2a88318cd451886878d447884eb3e0a0f1029f29febbfffe7fc454a15b27b524c808e58287 *5b3b4732f7d4c5ee9aad8326a0f1817c2545826ead3333927bf70e39a90f495b7d74d65d22db84 *5c3cf2049240dbf10fe5c52da348c462afeeac3c97e217aa8e0841538db9d4cdf8cdcffe21881d *f6ae3c4167ad1bfaef4a05866e8c38997389a59267224f1e76d228415264b1b162a9eb80f54e13 *8d310d894ce8163db2a2855219691ea8d4ce0b100aa9cc82d1b2fcc54258b5d63a9809d20a6174 *d4d387ee9596195626a8a8ba1171b51fe4d5626170ac5d2c8268b948a65a6d9ffbd058088e5408 *338f1088448113289931991aa46c61a522c98a8856d191451f15eb62990ceabd43260e544a5b2b *84d69c1c0fb97bf7042b2bf2ad5df24e9f242d7058bc0c24cc8541458767733056a67855851941 *4aac94e8a488d6b50299c828fc5373a96ff8a57c08157295016f58eb644cdfff1e62e712db7bbb *f4fb7dd6d7d7e9b6daa824011b0c993a4dc382af2848920bc008663263360ad382339ec178ccd1 *f18093e3016f7df72d3abd2ee80c2f14a6a971221017998b01e55c8f5ead04dec6d5bc10282198 *4c2a5c5506d99208abfabaa93168ac02eb25a9839a7a0132c044230702211d4d6911758db4d166 *14f5f9c2a9d0cb8fb85515cf09177605e88c5955d36975c9f21e36cd4085e68c42e25db5b22699 *9700128a2463381ab37f3ae4e8f03ee81491f7d145072b9230a3d4152e169ee44a8f1f1fd6102e *d23584b7f8a6098d2d67a9aa8a6a3c013944b5344889b0818a2d747014291fca89d3e1887a3ae3 *f8fe318cbe4be7f25fa6b3d627d11a332d195b1f4d2309d606f3e6603860707aca7436bb886c99 *d06a75917e8a680926e58c244968aa12ef3d45ab4fabd34126092a4fd1494a1a65564b46cb52d5 *bae0c58990b3a2a292a736d3858c8a286bd24aa112496dc38029110b3f84586f2108a044254366 *4ecc4d772e68fbccc2c9ba92d1ea5722ba0281192d53449691e405b4d79149814787407517cc9d *c269121d1e658747a7dc3d38653aab916997f6955e1093268137eb551662bbbd5f4482aeaab4e7 *df3ac12385463512124d8aa494922c4d298a9ca2dd46e4320ebc5c002589e52c044c07a76c6d6f *f2f6d77e0be872697797ad9d5d7abd2edd5e2fc0a6845b5046549a30180c988e2ba683e38b4d93 *de7b508272d6703a9ce29de5e8e808a524799668f476ee0000200049444154a1d22ec207a69a37 *02a7424cd2026d7e2e09d9fbd019534a85d6e05c001995bb21f42738737ddde0a50e0243ef2307 *66a964914260bc0d1542e702553304936264083508e4896852b39a257c5a844a9a0e1e3b9202a9 *5a08d5c627912f2f1284541c9c8c18ee0f391a1ca3744e22ba649da0f6f53ae6e6a0102a45781b *906efe4cde41f8797d64d44b19e2d39c5bc8c8569ff5264218d43971848b8856e7085bc849c9ce *6e8b1fbcf906143db6b7b7e9b47b64598a301e9f8696f5a2d7e197481b71d133de3917ed362583 *f18cc1644053590e0ff6c3fe3d6be3bdc458f0b60efef0c62d382f73da75b8d357a344a2bcd907 *0fbe3586a6ae497570c4624cf07e0b415337d1071feb031e1ab30c2b72b5472a471dd9b2f39f3b *89b379e8dc05e1875cd192869abb635a5524dd00315049822e5a78e0603066707ac8d16040a23a *c854a2db1b8b246b13e99844a933384c55471258bcbb5db4629d438bcd7bf52aea07bd318b9fc7 *18c36c36434c4ed1b61df7f101d05cd98a440486d0683aa4aa86f82665fade9bb4af5ea3dbed81 *4ea8eb862a9961a72622d563c044ed994c264c261366e54553bdcce974bba449c2a4acc99336ef *df7e97e1684a7773837c6d0ddd2ed0693b18fc16556c198b61d1ce3c07b22d60c3116ee01da96f *614d859009ded74b31a210c82441eb50cd7226147704a093a8f2552e6a0444749fc8b8ca8e1e56 *1148536e91396a41f8408114a0b4a25de4e4ad352a34a349cdc9fe5d4ecb32448f6605edf54d84 *5778e91fde2578797635a9cfbd91b133bbcc025e8112e350e8e01ad20956aa906b9765743a1dda *bd1e2ac941797c5cdc65b450d28556703d66ad557078f716306377778f2b97834d6a7bab4fd12a *101e8c2d91327814549a303c9d50ce9a1fa1ab6f42c360369bb2ffe001d5ace1e8e000e33d49d2 *09aa561b5ab7d20689b05cc88a023e2c80b765c868317e893717818e515715b6a982754a874599 *894e19631aac076364c8a28fcf48eb63c68b7131872548b29bd8e4992b701a22a8d8b35853381f *0424420693c6addbf7197f30847c8b64eb1a496b1d957782381447632c1abbe8089e7f66e3cf1d *8b95e378adcdaf1927c2548d0972d54c290ca1bedfc800446c9a2634baa60d2af5f1f9a016c20b *a58290747874c84e5bf1853f7c05c41aeb5b1bb45a2d1c356539a3318624fa0a882413592a66b3 *2993f1e462058e8d2a1be71c8d830acbacaa505946de6e93e4394267a1862d97711c96b067c52d *a77685046597d65e11427cac0dc60abfd23a0d620c49a839242063ac88af63ccc832a826f8e702 *02c53b87960975e308425e85f7014824f1413f6f2cd3e994615d92f88cf1fe016cdc20eb74d069 *0e4912028f64680c29a9034e8665dad96ae8c1aaf5469dabf82d3edfad64effa90e5b3c8f8b072 *91c5c3ca73574a093a0407cef9781a1b00478da5311599541c7ee5f3b0bdc3fae62e45a715e4e2 *5291642258cf5d60e08a8843753a7c5da1d5c5059ca228188f6678ef28cb86f7defd21dbeb5729 *3a1da44e428952a781ff1a7f01895cf2e3500b23bf31815b3fcf9c514284601c1148d8de836f6c *9051498196415a2d23954a3a1d942f5e205412d1241e8422cf5aa469814c04d26538eba8ab06e7 *6a9a32881abd68f052a08442c8042913c80b4492a22391cb4a8997322c8aa45fb84cac0ba98f76 *c55eed1f11f22cddf2df63ef67e5f3fd127028c2a2529c2ba668ad17ea6691a958ac5101b59e7a *6c6d71baa19da4e4d2000fd8befa12dbbb97d9dcd860b3bb166c6f32c8ce9550481774f7f3ec81 *5651905ca4b2adeb2993c984c3c37d268309838323329592b773b4ce02d4c05634cee2a616370f *68f4416bbe9a7fbab05d0942d2a40fb5e6593985bac69a195207b1a5a92b9cd65813f4f7c23b1c *69942b7bbc4e426f4a49cad98c7169183cb8cbd170444b811d191a338d8e15025c41840b323aae *49544c9c76168fa5ac2cbe9ae145825772e989f7cb0177b193e878fc875d4c093e9238c161ce25 *bfcf71690e6703c3d6c6c55d55558c2763ac1e92d4e9e2192f01310babf3a383fb14d6f2adaf7d *1528e8b44211ad314d8055cda6a46986f726e6f3e948d5524c4f870c4e4ea926178511151dfafd *0deedc3da6bfb1cdb7bffb3679dea3d5dd20edae9376d7516981f012910636bbb76ef13b8a8599 *df2f2cd1420414aac793c88476e4bb24ad36b9f0743aeb346b3d5cda43688d9209c35949351d53 *8f2bcaa6625a4d29270dc3320017ac1024e598d248bc6a63f534fac8436efc62252d040249e50c *359a4c44ad95d0a4694a9aa55482105060961833e9c21be3041ff1439d2dbf9e8142fa103c2834 *4aafece3b38c76bb4da7d745a67251c04180c7a2ac67e03d972feff0bbfff80b90f4d8dbdb6377 *f70a1bfd3edd5e8722cbc1f885af5ec9988d9ba60c860326e3eae226cddd0787dcb977c85b1fdc *c218c17b3fbccdb46958531a2b5b38d946ea9c44a638e142c262325f04ad84f944cc983186c80e *02d1601acb685a333d1df2defb0fc0d53c9809ea9ea5120595b54ccb597cce0ba44c161d3c2915 *2a6ba34560ce211ab2cdcb64db9aa4bd816fcae0f7a94da44cbb683a14910d2bd1ad36a81ce183 *d6de598bd412aa66b1225f0d4d7e5441e6e263f7d8f3c1b215b675c2f933b3a3738ea6312491ce *659bf03b203db3d984ba29d1ba0fc70774aeefb2b5bd8d4892b068450441a81601812605c68990 *0b106362cf23e71fb6504d67bc77f72edfffe10ff9ee9b6ff1e5dff97d747f93133a7cb05fd1ea *f548922c6697fb4571e27ce6ecfc3f732d8027a0bda484f1e921cde098d1f7df81c452262942f4 *f18542253969270bcf44b9bc831401ef19aa20062f240df0b7ffcedfa5e566b86a4c3d9de0aa09 *de3441eeac5ca06b4478a2759aaa76608315b946a29dc75b83553a8cb55b7645dc2a8b607eecfe *04c7c20737b075086703fe24eee3abaa4694330cc9a256ef5c85f49ad1f0844cc07b6f7f173860 *7dfd79daad16528468f3b2aad0d2b35cb47b9009d638a6b3f93e7e7a310a657d7d8db5fe06eb6b *3b18f52eb47a5c7ee226576fdca4b3b143de59c36b1d9439de3f74692faff8f3c74106ad804c25 *ccb480762856b4b236badda3495a489552cfd9702b890f5248121f31a7528393146a0be7da4cea *117e9250d522c492fb1a5c1a4b2e222c0c45281bab5c615a0ad55a43171d54da46a67930718ab3 *79f52a6040160c1d2556f6e91ffad887c59e0beb1b15f9fc4a271479c144aab0f86ab5e8f47a67 *a67a251cb5837428d9d85ce3fffbf57f0d72972b576e70e9d2252eefedb1d6ce28da2d2416d704 *757478df82ef5e2709e3f198726a28c72717956c0dfbfbfb8c8623cab141642949ab839729550d *aeae118d090c1c1fe5be2c3561736cb878d4715ced8e6715ae7201fe22a1b40db96970d2d2288b *6d82decf59b72873ce336ee77791083679a45558ab10b24595d9106a60cc6251e75db3c4a6a1f0 *4a93e802996501e9e23dced4b12e1e5164220c3cf3e8d333fb723ef2b1f401a1ee7c308626d662 *4c4d4568d2344d84468f07e8bc05ca23ac26919e5959727a7cc4e52beb8cdffa3ef437e9f7fbc8 *54533613b2ca51370d8906dfb8907aede34ce943eceb783cfed14e9a3ccfb155c3e0f898ef7cfb *5b14ed35fafd7e707e1445706c4a8fb7c11cc1b95eb278c4f11c2736173b4a1d0d0f6736c7ab5b *ca180722e412283c2f85aeb8fa851328ad800e4aa788a685f0215e0cdfc4064ee8f56b9de36c68 *f05829d132c329199cb65245f3e6ca9a6c6ec8982f5a3d3ff6b15fd92acbf98524d3003092321a *4142db3ad11a2b1c128ff702e705a94e989cecc3e4bbac5df92b7476b6e9b4dbb474b0564b1dda *7f3e5bc6893b17b6894229129da0b5beb81fdf6ab5d045c26c3a052fe8f6d629d6b6e8143db23c *03adc2febd090b2ee22a72be8d79e838def141971e4a61599653cb49648b418a446b8d57e18d08 *55701bc20ee31a68f5712be7340b19c048856e616c415a38bcad4148a4a91152ad64d2860bcf08 *90de05a78e54a1b4ebfd72a4ce7df87305991fe7d8474346b037c73dbc0cae598b083e86429324 *053ad1280589d081ff3ba869b753beffda1f005d762eefb1bdb3c7fada3abd5e872ccdf0d220ec *aac4236ce7746408645946d62a50e985fb78cbc9c980dbf7ef0382b41ba0469529a10cc50e117d *f26e25965b4659ab7becb10669916826e33166365bc0e43c9eaaae7164d84881107ece8e31110e *2c173ef7253b3faa5d5548c69ce3d2c25c9d4533024b86ad900b1c8aa95dfcd9e6512bee614088 *e727f4e1f152e1bd4109816f0c34b390ff6eab90ef3e1c626587c2e6582129ed14bce3e4f8801b *7b3dfef07b6f40d661bddf23d109d6d68cc723666a16d62ec29dfb715514907886c321c7c7c754 *e545fef86e41927738199c92b4daf4d7b648b39c76b78fcc53b44e166ed4a0fe341f6ae031324c *494ee26d9bba2c573a579e224d69121de03f71e0830045b3c44f2d3a1fcbbb3efe439ae52b8375 *6ec4e66a1c37df818438354534509c1965c19fd68710090abd105b9621828334cbe8b6d7e874bb *782d28940607d3c9902297b4b284e97bdfa3fbc475f6f6f6e86cacd35fdfa4d36d2fc28dc59982 *5130772649825796e1c9948d8d867a32bcb83bf7cedbef70727442bbb349d1ed21d314ab755091 *d826c660ab901ab318687f6ee0fd6a5d0bd03863903e58aa9db5b1e5ea16f9ac61ca7120141eb3 *021ef48b54aac8148a59b1cb92a88c9abce5be7969399a3755e4fce7f3205dfde8268bf41f71df *fe238ee7cf7c2770ca2ddaa5d2ad6aef0cc634349525d109b5b768a798cdc6286ff9e0076f0123 *36fa9bacafaf53e4d9423ba184c7f966f59e580cbe3516952434a6a1aaab33b0888779f5c6b07f *748827a5b3b64e92e638a968ea0ae11466cead89cff0a59bf3d1c74b1164e8ce495fd2cc5c407d *23410a6a2ff0a6c12a83d03222c73cab5d4d774675182f27196ba922d89a59e5d8533ff2f5c286 *51b6f33d97910b20d245dfefc73ef6025490a6290fe80aaa2ab0036b1357f51e8f6656ce30ca84 *665163199f1c73a99bf3ca97bf02acb1b5b54991b5912234c92693096922f1fed11544ef1db2a9 *999533ea4989b968aa2fd23632a9f18966bdbf41abdba5dbeea35b393272effcdca87fe1335d9d *eb46c725ae74e459cac857c1269458b40eda72ab0b9c1668f4433cba879f9acb72510cdbe4fcf2 *86474ede02234d5c7c36818bef56f70bee47bc9e8f7c5e498f750a291ba43734ae410b459e158c *d356085f4e135a6b6d549e8645dfd4324d0a7ab9e5e0abafc0ee652eed5d637b773b082bd7da24 *5ae39b0a1bb7a14e0aa46b82e95268546cd20c8603ead25d5cb20d9a77814e72129d611c54a6a2 *1a79a42e7104f5a658882bedc353ebe2d89f5b3245dbb28476ab0fbd3ed8095ae4d4d3095e5974 *9285b081b9cde9a145d772b92c5560dd79f1d1ce2b1f6e742925d2b8381dffe4befef9f3269e6f *5c43331b6386473cbdd1e2ed3f7e13b637715e51ce6690ce507583d68af1604a558ea0d1606fd1 *ef3f49bab6162ef372cc881aa553347ef178994f62c1621d3032524bc6e331a78353aafa823bde *51b3beb90524189590a4013f2e648a4a02c33e3c24e753b13a332e729e3d3b7f36cf254f726e7e *f44814e95ac1cfff677f8bcffff37fc4e0e8103119a3d304a7753003c485d8f9faf2997b57caa0 *9efd31ceeb582fb0e7f46f3fa9afffd07921d1d6a0a5e5cace3a073f7c1d9a235a6b3710690b99 *2864aad1698a1292aaa9d9e874f9de1b5f040ad63777d8d8dca62872babd0e12499a06018c7c04 *b5d0cd1338b40c46581de2c81f5fb9ab6b5efee91779fd3b3fa0360d5278122d210d60824c838d *cf6ff1c8c94d5c702c405a940fd2a81b379fe12ffd27ff39b7def91e5539663838c08c0c232c7a *c516332759452acbca57f70f9d3f2bb2f70be9d7877dfdc3e7453c2f177cd9c7befea10d45f0bb *85ec98907ee9bde5cd6f7d0d46f748ae3dc1a5bd6b74b77629ba3df23c3002130fc21b3636bbfc *e6af7e1ef23ebb972eb1b31da6f934cdc812b9083be0dcfe3d948d439327499385ae5eeb0bf6f1 *e3c109dbfd36cf3d799defdfdae7feddf7984c42a458967541cb2518d8b9508bf7fea1a91e77b6 *80b33c6f83240ac90847bbbfcdceb50987b76f7172789fa69ee24c19f3e142c9d1c7be355206dc *97758b029190f2e1f326f2dd5d306b7ee4d79f39ef42c69db3f1bc0cb69ac7bc3e7cbe7b0826a6 *6460736895935cba4ae7c9a7e86c6cd2bd741daf34756df0be44249ed3e994e1d13ef9f693b07f *9fd6d51d7a6beb54de0651a6803a556167a3e523ea0db11fef02d777381c70747ccc7436bd8857 *9fd2e9147cfae7fe1cfe2baf33291d6553917b831625c28194092acb112245a619d679f0769123 *e3a45f7182ac2ef602e840c9101c64acc56348f6aeb3b1d6e1fab5cb54d3214e046d9dd67a0139 *30c6043b940addac54a45867031972ee91d33af0e4aa0044c6d805e5c21843f2615e7fe6bc0bc9 *d380317ca8ef2f644cf390e1bcd609ce3a34510f2892e013c87292569bce7aa082cabc4d2213d0 *025b97ecf4d779f7dd378113b6b75e646f77979d9d1db6b7b6c98b1c251dae8e4d9987463eece3 *950a4d9ae168c0c6c606cd747811b6dc504da774f284976f3ec1575e7b9defbdf60d4e8e4f78ea *e6f3f4fb9b6c5fbd4156ac33b60e54161c9f491ef2d2bc254d622e8cf7604d54b02cf7f9ce39a4 *d741f89f2bbc28d06a9b5cb5c9b676435b75ceb75f996a9d734156141328e77122213c589df1a2 *85411367d6fe2e0e14e7e24896af3f7b5ececbc7f3d0bfa830922bfd87d5d7db73e717df7f1e84 *1c7942a818bc98e4c82c87b44011122a13a7288743fa057cee773f0facb3b1b34577bd170283cb *2af8e0b018176ea250c9d4e72e001fb37f3c75550781abb317d3abcbba4658cf7ab7e0a5e79fa4 *dfcbb97feb3e3f7cef5dbef88dafe26be8ececf2d4f32f73f5da0d92568f991f2294c648452dc3 *8560437b2c0605d7e05544a3828a9526af42501f4986eaa5081b8c928824e6c328340644b2b04e *7b0c2ad30bc451e8cc9f3523e8d5675efc3c450384afabe2dfa0d1d2e19c7ae8fc3ce9424bfbc8 *f3c46319ffd62be7e5cad7c7fbd08b585c0491c99b6a5c13d2b41a6f500aca8963303ae64a7b83 *e1bbefc0ce2e9bdb9743dd5d2a9c3394f51885c2da3a5ea83eee26fcd9a9de3b64138a37e5acbc *d82d9ba6199b9b5b783cadb2a2dbebb0b5bbcde4c92779f1932f71727cc8c9e988bbb7ef70eb9d *d7f8deeb5f607d6d874bd7ae70f9ca93f4b77748d21e0d86d24ad23c412469cc6d572134a889a2 *045787322ea07c12a2bb097d71e95450da3a851326ec1ea47de86f1723c3e5e376d38f79ddbfbb *bfe32e48051690b54b40f19c262665b09749e19934251bed0ecd740027df66edc5bfc2e6a55db6 *b7b7d8dcdaa49364c8c4e38d07daac5c4be7ab07e8d88f1f0e0754b5633a3db9187e7432384478 *a86a87b386542854af4b9a256cf43acc66339ebabec7e8c567391e8cb8776f9ff76ebfcbb7ffe8 *15287aa4dd1e2f7ef267b87aed09caa68db1062513ac142819ba44128da546d46156703451d861 *97a6c3b85a36a609cfcaf954ae6454feccb35f2d1a151b3a7265aa9dbb6c6c6cd1ae4ec576d9b6 *9d3f8b1f731efc635ebfa4643dfeebc7e955a4e716bbab256211f3861d87fb07ac69f8c6ab7f08 *74e9f73768777b382b428d455624b9c235f6a136ebf9c59d8809d9e3f198e3e3634c7351ee5c34 *f109a150d2e2f0641121525615de0baaaac4dae0f21c4f6b9e7e7ac227cb4f717270cae1e0983b *efdfe5fb5ffb02dffad20c29329e7ef6599e7fee13b4da1d7c4751cea6589993e649c087a35049 *0ad686fc56ef830cdad9d04b4f8b458b3cf4d7416abd282748111a3932056c12b751aba142410a *2ca55ee1d6cdff6d597a79dc791e77fe437dfdf873eaa87973c9b9ba4798f87542b841b0ec5eda *e633af7e11f20ebb3b97d9e86fd3e974e8a4398952010a99aa3317f7a3065f08815439a4015f37 *b217e8ea139d90174550b97813d21c62de5c96e571b1d3c13930a6c1594be91aaaaaa4ba6e984e *274c5e1c737a7ac27834e5830f6e71ebd66dfef5bff80638c9f6d33779f1e59fa6b3b64122bb38 *910441071ea5055ea721d94265819a151d31171745173f3d681118b28e0f5157f87774bca2545a *e814e68b5de7d1ca23a4c28e4a8430583b83d109db4f3fc1e5cb9769afafd1ed15e4454eaa08bb *a80f51d00eabfa822c4b29f282f4a27e7c359b717c7c8c44529b25057a4e4d522a5aa2bca23221 *c1d13b478a46660245419e68d6ba6d26956167ef121f7ff10506c309070f1ef0c1bddbfcd1effc *3ae5704267bdcfe5279fe6da1337e96fec51a994c63b8ccad0aac00919420f6574d17817532156 *7b0326883c561b23d23ca684fce31d3be7d0b122f993f87a67a46a44e8b3930c4e0e4871bcfde6 *1bc098f6da26459ee31dcca63324821981c2b5da05f45cd0a45153a6a7434e4f4f696c7931d972 *7d7d1d49caac2a83b161117149c08a390724b4e7f11ff34c481b0a2ea669303644891ad3309ad5 *586328cb1983d35326e3114747a7dc7d7087f76fdde7f77ee31be8b4cddae60e373ff612d79ebe *499e1594ae4678891629ba686374e0c7f985155b816f62cefad937563c66e07e5437311c0b8457 *673483d2e91844f4615ecf47ea5e263234bfaaa162bbd7e35ffdd69720d96577ef1a9b97b6d9be *d467b3dd41252942d845b0c262ad2078ec3e5e2ac57038603cab2927173469bcf7d47585f01e53 *570bf39d9b37aee3364c3ab3e85dcfa795f9ace063048792c1fdbaa6c2d662aa05ebdd36b3d98c *4b7b5779f2a92779f1a509a3d3318707fbbc7ff736df7ef5b37cfd8bbf819439cf3cf73c4f3eff *1c45b14693b6a99dc0a98c34cb49448e912ef4e38dc3f810f0338f821471f1b5105bc63c1d2f4d *d802197bae9bb87aeca24ad8e3e2db23b9e8f37fbc631f81855638eaba66303ce672abc3ec076f *20b6d6e96df669e505ce799a98c72b65600df873dabe87073eece3659252560da674f8465cd08f *2f4beaba4659a84c8d8aab4ebfc849990ffc59e1c13cd9d92f162d3a5aa80211da7868b5dbd48d *a59ba4e4754dd9cbe9cfd6986e553c7165879b376f309b4d393c38e2eefd7d6e7ff02e6f7cfdcb *507bb69e7991173ff5e768af6fd0b80e55734292654109a443beab54216430d0371a9cd591a41d *818511d2e06c48ae1451dbb7544c98c8f27173da106ef1008975fb339fcf9fe83838b91d46348c *c74352a938b97f0beaf7d858ff057afd4d9224419a087896a1c813902e71e7f298810f452c8b6d *0cc3e190a6992d764c8f1a789f1739bdb53544a3486c1a1537abd9a6167fbe45e3fda3fbd262c9 *b75b72e7f482f4e0bcc7558eda1b7c63a96ccd6836a19a5926e3119349c9c9f084c30747bc77e7 *165ffbe2bfa59c56acad6f70e3da53ec3df134bdad2dd26493d2d6542e25cf12441a0c194ac63c *f9b9116365aa7d646f413673bb64bce3354e360ff51a3e9cc6503dba7771469f1053b3bd63a686 *146b1ddefdfa2bc03a5b7bbb5cdabbccd6f616fdfe06ad22070cc63cdc20f38f947985046ce33c *6992b0bdbbcde1830fce7cba5ecc0de067b31983832384c8689c41caf9f43ddf1bbb33d69fc76f *27c4637e2cb5b40fc7f4461de33bbc73b4920c212ded4c33ee95ac6fb6d9dbdbe4a9a7af331abe *c8d1e1018707c7bc7feb1dbefed52f41dea2bdbecbc75ffe24979f789ab2097c37e704320b6c9a *54cbe0507136dc71de2ff7f0325eb82baae09fdc62ceb36cfa960f0f3c022f2cde79f60f0f79f6 *4a9f6fbdfa5528daf4d7d7c9f30ea6ae198f8754b3214aebc7a86d1e7ee7bd97a844f1e068c4dd *7bf7686529ffec97fe0756c73afec68997d2ba44a8d2589bf77a2d445305b65ae4ad2fee78cfe2 *2e9eaf0b1efed6e6dc75c5191ff8dc459ba6819e195a8c4167d772066924ed884d9fcda6345b96 *b29c31bbf92493c18c4f4da68cc6530ef6f7f9e1fbb7f9ce977f876fbcf239944eb8f9b1e779fa *9917c8650793b6b095408a0c551418826131e8de5cbc0ee74d258f10e9b9892c3df7bb7d94637f *e1f048118429b6acc9b4c2da060edea27bfd39b6777648f282a2d5a2285a04529978c47bfd8889 *de3b9009a95658738a529a5ed101641921037e31324982b55699b29c0ceb6995eb0d48458a92a1 *43e6e651de67329ffc63eef2c7d78756073f78da22564c98f858b0b42910b9a0f06d9c34b4ba19 *ce885837f0947b0db3d994ba744c27d7f9c44b1f63361a70b47fc2ad7bf779efde2dfecdd75f05 *afb974f3395efad49f276b75e9aa5e40a2eb04a113d2aca0f1e1fb2699c69af03bd54de8e4adde *5ee717531ff6f8a1e1f68bf20a4a5a7029a3664c2f4b3979700710eced6d7369e7121bfd3e9d76 *9ba2d5026f1683eebd3f73e39d7fbea749426d3cce7ac6b3537add366f7ce71ba0fb43cc918992 *45af012b846884a03cdebf77efc1c1bd1da71545ab836966719092b86a6fce4defe74595e72f80 *f2b14a9a87ff5d9cab3cb1a062791fba5f4a4a5cd350e8149d1a12d9a653e4949d166bfd2d2e5d *bfca0bf54b9c1c9cb2bfff800feedee60ffecd3fa1ae2ad63777b8fce4535cb9fa14bd8d4d4a95 *5323b1328411a52a051dcc9ab5291728b61006f4e3edd3cf7fccf165e1a117ba88c787f7b8b69e *f3db9ffd3d608d6e7f1395691a5732998e69ea2952e9655dff31ea2401d4c6a3138d40727878c0 *9d3b7779eaea757eeff77f9774ad75af3e3a2a63f7c8ea20bca96ba5d4e4f6fb6fbf75f9d2e6cb *4dede85fe9639a3c465ae8383d2fe107abd24641f6a7ac49d7d14c3167ec443db1083381310e6b *0d4d5d31692aaa279af068180d03a8fff888dbf71ef0ee9d5bbcf9fad750798fcd8d1d9e7ce113 *5cbbf15464ef9581e6a13394ccf15a87542be74397d1874e9f93f142f03f62e0c5aa6e5f31e7d6 *8948ce4ca4a4991926a9245786d1eb5f44ed5d677bef06db5b5b6caff559eb76d0898ccd9d55df *c00acbcf59b40e33562f4d625841c3783c667b7d9defbef11d4ede7a9ddd27aebd75ff8809502f *061e28ad10a3fd5bef7ee9fae5cbffe9ebdffba16c0d06a47adeef6d22ef3cf4d3b51691ab1e56 *ac4efa3f95015f5ed5d5a2bf1d449ec101eb1b1b08103eac624912ba52d24933aa2ac3f6baf437 *37d9beb6c7b5a79ee113b31907c7a71c1f1d72eb83f7f9e62bbfc9ebaf489cb13cffc2cbdcfcd8 *2748f216266dd1580d2243684d92873c3a4164dada19520ae65275111d3f8bedac0b691b7e2e51 *94e186714d8448188f4f24a3d309f56c86492d704c7ffba7585beb87923550350d58411deb12e7 *75fb73f1f2b43421bfa77258d3f083f7ef71707848bfdbe6f5afbe025bd7dcf183aa4b32e90000 *09f4494441543b5f024671a5b918f80a63868d73f77ee3d7ffe9b76fbcf4e9971fdcbdc3f6a5dd *500ef5cb922d08eadaae98181bbcd3cb2bf14339533e6aedfb6c38909bc394dc32854aa9b01553 *d283cc408638d2344b68d52daa6ec37a597169678dc9788f8f3ff31493f1988383071cec9ff2ee *7b6ff39dafbf0a9563fbe32ff0dcc75f66f7ca0dac57948351f0db298f52294a84b021bb40f1c5 *19c8fb85dad5c9a0e3372b0f44e71c3ad1d03894f7cc26037a79c1b75ffb3cd0626d7d9d6e7f9d *4483303e820ee66d6c7b16d410d75cd698e0ce5112e33d478707dcbb758b6ea7cdebafbeca77bf *f819b69e7efedb8787b37bc010a8e603efe2c1480871f86bffe0973ff3ff7cee175f7ee7bddb48 *05edce5a88df6a4c98ea56680ecb71998b1dcd05cffef38b3e7feef3c58778bd5eb10b45e1c399 *f25560ef49156ad5c14f9760aa20c3aaab0a636b4c63a99b9aa6ae39194ea9aa92d168c2603866 *fffe3ddebf738b3ffefd7f45225b6445ced3cfbdc053cfbd8022c30b30d2227c4e9e6578a970d6 *a0b33c2663f9457f0369e63778085622a0dbd224244123616f7797cffcca2bd0dde6ea95ab6c6d *6eb2b5b5c5da7a8f240945a9105014de8ff07c9751485aa3550ba13384f7ec0f069c0ec76cacaf *e17cc36fffda2fb37ee3595435f80c7018eff86a5e5970f15d9c586b8f4e8f0f5efb97fff8fffa *caa7ffeadff8d9fdfdfbf46625599ac7848725d77d6ec909bde7f4dc40a97303f9b8815fdde77e *98814fcefd5b756e1611673d72b17fef5de8915b1bb47c819aed513a6163adc3cca6149d947e7f *8d4b3b7d9e79e649fec24fbdccd1d1091fdcbac35b6fbcc6ab9fff2d48d7b9f1dc0b5c7bf61936 *b72e534a11d43d3a653224d8b5d350de9e5f044e2c67b0107322a99d60323c653638446c65707a *9fd6d52b74ba5d8c0c99efa3e110a5c563de0fbdb8b013ad29eb31c7c727dcbe7d9bc9ac64bd53 *f02bfffbdf87768f7e3bfdcabb6fbcff1a70044ce2582fe6680bcc801329e5bd7ff0bffdafbffa *b37ff1df7baadfd9dae9f57b28afa85df068195c9c623933f0ce595ccca05d3e9bd387677b7f76 *6fb3f0aa7ab1d0e5fbc7ee93cd23fe6d7921cd6180211f66fe6b79507ab11d15c2a0544696e781 *92e51c6bb147010a636a2675455d574c4715cf3cfb0ce3b2e2f0c1110707fbdcb9fb80577efb5f *e0bde0f2d5eb6c6e5de2e9673fcec6da26957418e3c0b751691676094488b373a197ee1cd5a862 *363ce5f2ce1adffbd657819adddd3db6b7b6595f5fa3dd6e0552656cdd2e2fea10928c51a84c23 *856056359c9c0eb87de70e3acdd86db7f895ffe3ef317cef1dae7fe285fd77bff9e55f05ee0127 *718cedea8e53c677af0dec28a56eec5ebef6f3ffd32ffdf27f33c3e54f3ff91c5e681ad7844446 *c722388833290fe28c8b75c16e7ea89de459752dba08343c033f3833239c2f0ead6e979a9563f1 *d8e3304536cb4786084e9f24496201c947e66cd80357b1f1535625755551cd0cd3e998c9a46470 *7ac2fe837bdcbf7fcc0fdeff80c3bb8774762fd3dbdce2b98fbfc4dee5eb1895628d45484d9ae4 *34588cb1d4d33193d1989d5e06d323fedfffe5bf868dab7cfa2ffd657ee6dfff059ebcf91c9b6b *1d74a2c0f9c5f6791eb52208944e6fe07874ca9d3b77189d8c68afb5190f87fc937ff87f73ffad *3779e2f9e74b37daff7bb7de7dfbf3c07bc07ebce30de7805e2ade4e5de09252eac6cb3ffd337f *ed6ffead5ffc2f8f473e7ff9677e1aad52c6a3112ac943be9a0a8101bef191d0ec62c9338a0be3 *f2533c86916309c51253478d38a18992aa94c618541c3f1ba3d717494a4e06bffd5c1e158f97d3 *d0f23884126902237a25ebd68933656729155e8442898c98751fd3b2e6bd85ba2a691ac7a49c61 *8c67369d32184d38393ee160ff01efde7e9f0f7e788b342f48da2d9e7ff6935c7ff6694c9350da *1ae31d2dadd868e57cfd2b7fc0777ee3d740255cfef37f814fffdca7b9f9ecc7d9dedea6db4a49 *b48a624a8331e1bdae4d58638dc6234e4f469c9e9e626c4d2bcd79e3b557f9cc3ffd3f215fe3ca *b3cf957276f20f6fbdfdc667e3a03f88cff79a5534dfcaeda1800ce8013b2875fdfaf51b3ff777 *fee75ffac5dff9f29777fe835ff80fc9da6dda9d1e6559a3b5224d127c7c1397b6e587fdc3a12e *3e67e205bcc9f9f361872ecf6e59a4fb13fb9565ac439c81d33ce211e4086ddb05ad4b84edacf4 *3672f3c242ae7692ba2aa9eb0036284b0366c6743a633038e5e4f888fdc313debfbfcfc1c12969 *7b839b4fdf44e729efbff70eb7df7e0bf6dfa5bfb7c3c79e7f96abcfbcc4de1337b8bc7b89eddd *0d7295a2919858320798cd668cc623468329d3d914a5341bdb7d5efbe35779f3f5d779ed73ff92 *b5eb37b971756f7f7878ef1fbdfbd69b5f023e8877fa6235cf020ff1f05caa08a1ca5d600bd465 *29fdf5ffea6fffb7ff45d1dffdd9ef7cff6d76af3fc5dece65b6b77743be7b6d689a1a275c8cf5 *8c83b76038cf491a81b6d898b02f3d0ff43faf693f3f8ee7b7790f9f8f7c7825cf1ceb443f54e9 *5abcd685d966752379669f1c73ec42b6bd8845a4d06c6abcc7f91a57398cada8aa9ab22a699a86 *725653cea64cab92e160cc6c3a0971e15291279e34cbc8928c6eb74bb7bbc6c6d60645af4b5114 *a4422d545b20c0588c6b503a01dba01c7ce3f5aff1ddef7c93775efd2c6c3ecdd56b57d92cc457 *bef9475ff8d538e0775756f2e5eaa03f6ea3bd7ae7b781756007292f5f7be2a99ffaf9fff86ffe *7591f63ef1daebdf90f7eeedb3b7bbc35ffb8ffe06c3c968a1d4d54a07538538fbcc15f38ac3bc *956b23914a3ebad5f8d085e10552da60de8c400321c4a2a0a3a2cefccc20fbf97ae4dced2dc2f7 *573210a58d046d412809c6c5dd805f5e58ab80231ff3e40b89a8edc2c431c7b88688518fb5e122 *68ea3ac4af1813a2535cd8f265599ba25590b572b2345b30fba599730296f50aa924c3d129fffc *efffdd382c09d9768f6bd79e7059a2be3d3abcf3990f7ef0f66b71c0f781d3f84cafce0ffa4515 *96f9e0272b777f1fd804b65aadeede273ef5a9bf78e9f2b5e74a63f6062793dee9649497b35910 *727819e104714a75e1a96f45b04e396b49d3344003bc0fabf95802f5cea26581703678d901e112 *1c5508e7c1a349e3d46d31d6209a486fd461f1830b01c5c65738efc9552b68d016bbce40caf4d2 *c40b40051f9c08bd08530755919786aaac288a627131f9a8d777d6e145b388479de35b2d9046d2 *944e34890ec64521c24252c61025eb2cde2aa6d329e3e92955198207b50e17d5dc0d141c441932 *71b43b5d7a59ab2c5ac5304be4bdf168f0fd6f7dfdd52f8fc7a37bf1ee3e8aabf7f95dde3c6ad0 *f91105f6792b4ec7455f112fb56e5c03748156bc3092b820171ff26bffd9c787fff0e7fe7f5e77 *2981691ce461fc7b12b76c755cbdfbc7f5873fcce0cceffef90c90c53f79bc20e6832e7f8caffd *671f1f6de089033f1ffc3a5e0055fc33bfc3ed8f10047ca4c19923fad5b93ff25ca3fecf06fe4f *77e0fdca9d6fcffd717c4850dbff0f9560eb0e64b6ed7e0000000049454e44ae426082 } From alex at alex-smith.me.uk Sun Jun 3 09:04:29 2007 From: alex at alex-smith.me.uk (AlexExtreme) Date: Sun Jun 3 09:04:32 2007 Subject: [Frugalware-darcs] homepage-ng: news: 0.6a x86_64 release announce draft Message-ID: <20070603070430.286311768138@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=homepage-ng;a=darcs_commitdiff;h=20070603070338-46e39-7afc02d08d9abedc2e8653f303ea81650cc9b4f7.gz; [news: 0.6a x86_64 release announce draft AlexExtreme **20070603070338] { hunk ./frugalware/xml/news.xml 17 + 66 + Frugalware 0.6a (Terminus) for x86_64 released + Sun Jun 3 07:54:12 CEST 2007 + AlexExtreme + 1 + announce the immediate availability of Frugalware 0.6a for x86_64. This is a bug fix release to fix + various issues that users have encountered with the x86_64 0.6 releases. These new ISOs contain all security fixes since the release of 0.6. + Please note that if you want to use i686, you should still use the original 0.6 ISOs. This release is for x86_64 only.

+ + Please refer to the Frugalware ChangeLog for more information.
+ Download for x86_64:
+ NOTE: Don't download CDs 3-12 or the second DVD unless you don't have an internet connection
+ netinstall, + usb, + tftp, + cd1, + cd2, + cd3, + cd4, + cd5, + cd6, + cd7, + cd8, + cd9, + dvd1 and + dvd2 +
+ SHA1SUMS: +
+1d6f6a8a2b816090e3ba5399f5b4caeea9a588b7  frugalware-0.6a-x86_64-cd1.iso
+25fe5dab4f02d1c0ecc812e47cd139e1edc71a23  frugalware-0.6a-x86_64-cd2.iso
+a47d2b65f10fdf3d2a16621e8fe307f653dd251a  frugalware-0.6a-x86_64-cd3.iso
+a90f2faca524c97502f53557348a84fcb4465e87  frugalware-0.6a-x86_64-cd4.iso
+424c4b8351196ce10384dbb6a1fb72f35569198a  frugalware-0.6a-x86_64-cd5.iso
+cf5fa95b4afd4ee0cf07b59305b5ae821aa7f52c  frugalware-0.6a-x86_64-cd6.iso
+b613c3b5cd9d7f4b7950eb9bdfed683bb1761a84  frugalware-0.6a-x86_64-cd7.iso
+11c82a8b4d60fe3c17e5a16ab9540d4544d76cfa  frugalware-0.6a-x86_64-cd8.iso
+6ab188efb1e806f60b2b07591c7c488687f2c4de  frugalware-0.6a-x86_64-cd9.iso
+975254550d328b9a6f0a173c4affbba4bf197258  frugalware-0.6a-x86_64-dvd1.iso
+193e15d1c9e762db73cf1344336355c89a5739dd  frugalware-0.6a-x86_64-dvd2.iso
+93f4b96bb0aa3cbafeb3a6bac12deee80e5e84bb  frugalware-0.6a-x86_64-net.iso
+			
+ ]]> + + + } From alex at alex-smith.me.uk Sun Jun 3 09:07:08 2007 From: alex at alex-smith.me.uk (AlexExtreme) Date: Sun Jun 3 09:07:13 2007 Subject: [Frugalware-darcs] homepage-ng: news: uhh, helps to give the post a unique ID Message-ID: <20070603070709.36C161768138@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=homepage-ng;a=darcs_commitdiff;h=20070603070554-46e39-ddc27f516124e8a0788478b14e2acd6074d745ff.gz; [news: uhh, helps to give the post a unique ID AlexExtreme **20070603070554] { hunk ./frugalware/xml/news.xml 17 - 66 + 67 hunk ./frugalware/xml/news.xml 23 - The Frugalware Developer Team is pleased to announce the immediate availability of Frugalware 0.6a for x86_64. This is a bug fix release to fix + The Frugalware Developer Team is pleased to announce the immediate availability of Frugalware 0.6a for x86_64. This is a bug fix release to fix } From alex at alex-smith.me.uk Sun Jun 3 09:08:14 2007 From: alex at alex-smith.me.uk (AlexExtreme) Date: Sun Jun 3 09:08:16 2007 Subject: [Frugalware-darcs] homepage-ng: news: html fixes Message-ID: <20070603070815.25BA81768138@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=homepage-ng;a=darcs_commitdiff;h=20070603070729-46e39-a17c701a461d61fa3c7e46e60414e9b7031332f2.gz; [news: html fixes AlexExtreme **20070603070729] { hunk ./frugalware/xml/news.xml 24 - various issues that users have encountered with the x86_64 0.6 releases. These new ISOs contain all security fixes since the release of 0.6. + various issues that users have encountered with the x86_64 0.6 releases. These new ISOs contain all security fixes since the release of 0.6.

+ hunk ./frugalware/xml/news.xml 27 - + } From alex at alex-smith.me.uk Sun Jun 3 10:33:43 2007 From: alex at alex-smith.me.uk (AlexExtreme) Date: Sun Jun 3 10:33:48 2007 Subject: [Frugalware-darcs] upstart-mess: xorg-server-1.2.0-4-i686 Message-ID: <20070603083343.A9ABD1768138@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=upstart-mess;a=darcs_commitdiff;h=20070603083223-46e39-c1ce9a4799be76a4b5b1b7832a3f7c058ca13809.gz; [xorg-server-1.2.0-4-i686 AlexExtreme **20070603083223 * Sync with -current. So that's why X was crashing =D ] { hunk ./source/x11/xorg-server/FrugalBuild 8 -pkgrel=3 -mesaver=6.5.2 +pkgrel=4 +mesaver=6.5.3 hunk ./source/x11/xorg-server/FrugalBuild 15 - 'libxi>=1.1.0' 'freetype2>=2.3.1' 'mesa>=6.5.2-1' 'font-cursor-misc' 'font-misc-misc' \ + 'libxi>=1.1.0' 'freetype2>=2.3.1' 'mesa>=6.5.3-1' 'font-cursor-misc' 'font-misc-misc' \ hunk ./source/x11/xorg-server/FrugalBuild 23 - 'glproto' 'xf86driproto' 'libdrm>=2.3.0' 'printproto' 'mkfontdir' 'mkfontscale>=1.0.3' \ + 'glproto' 'xf86driproto' 'libdrm>=2.3.0-2' 'printproto' 'mkfontdir' 'mkfontscale>=1.0.3' \ hunk ./source/x11/xorg-server/FrugalBuild 39 - i915tex.patch \ - bug-9045.patch \ - bug-9237.patch \ hunk ./source/x11/xorg-server/FrugalBuild 41 + mesa-6.5.3.patch \ + remove__GLinterface.patch \ hunk ./source/x11/xorg-server/FrugalBuild 51 -sha1sums=('3c4e8ae90fafdddb4ec6e640b693c2beb295d106'\ - 'ba860bb6ee57c02202342dfd5927464a068ea18f'\ - 'f31702e0029b2d68018598e73ed55c4d6c58367b'\ - '859b98a4049400be152032fc09ceff2afe9e6dcf'\ - '863ad92892785c3785b122bf54d0def4d4d2732c'\ - '426b0b08617ec19cba41ab20f3891cab82f205a2'\ - 'b49bb4f22426fd0dab7551ef8907276214c9a3fa'\ - '2937d6a50155cc16f73ae44b1e5b6e26cabbb86a'\ - '31938c89a107ce89b06287b28c6d355ecaa13217'\ - '0eb64d46172b6f2f4462c02dad7964c6d7656076'\ - '067931e73ffd718f0715ddd69040c660821083d8'\ - 'af385a1f28afb4368719c634b4fb5d3991e9e432'\ - '9d0d4102b26962cc453c4d66f5638f0cfb33c4fd'\ - 'f53de93da5e110867db8b1655b5798d2049f43ae'\ - '22025bd7b96deec8cd31f24fe87a170f1c7898d1'\ +sha1sums=('3c4e8ae90fafdddb4ec6e640b693c2beb295d106' \ + '8ab86e54976752028fbffcc21a9e0d2ebefeeff4' \ + 'f31702e0029b2d68018598e73ed55c4d6c58367b' \ + '859b98a4049400be152032fc09ceff2afe9e6dcf' \ + '863ad92892785c3785b122bf54d0def4d4d2732c' \ + '426b0b08617ec19cba41ab20f3891cab82f205a2' \ + 'b49bb4f22426fd0dab7551ef8907276214c9a3fa' \ + '2937d6a50155cc16f73ae44b1e5b6e26cabbb86a' \ + '31938c89a107ce89b06287b28c6d355ecaa13217' \ + '0eb64d46172b6f2f4462c02dad7964c6d7656076' \ + 'f53de93da5e110867db8b1655b5798d2049f43ae' \ + '22025bd7b96deec8cd31f24fe87a170f1c7898d1' \ + 'f257b56953e9756d38aa01c7f7f5d9a13160576c' \ + '6473a13b65db3e44ba8b369a6a9c667887c41a52' \ hunk ./source/x11/xorg-server/FrugalBuild 72 - Fpatch i915tex.patch - Fpatch bug-9045.patch - Fpatch bug-9237.patch hunk ./source/x11/xorg-server/FrugalBuild 82 - ## this disables AIGLX by default , comment it to enable + ## this disables AIGLX by default , uncomment it to enable hunk ./source/x11/xorg-server/FrugalBuild 89 + ## as always xorg devels -> <-mesa devels mess .. + Fpatch mesa-6.5.3.patch + Fpatch remove__GLinterface.patch + ## GCC 4.2.0 bug do **NOT** remove this hack or it will kill your box!! + ## http://gcc.gnu.org/bugzilla/show_bug.cgi?id=30052 + echo 'CFLAGS = @CFLAGS@ -O0' >> hw/xfree86/scanpci/Makefile.am hunk ./source/x11/xorg-server/bug-9045.patch 1 -From: Xiang, Haihao -Date: Fri, 8 Dec 2006 09:00:59 +0000 (+0800) -Subject: fix bug#9045 -X-Git-Url: http://gitweb.freedesktop.org/?p=mesa/mesa.git;a=commitdiff;h=5449f5a97524cb21194b20d05449d7211faaa51c - -fix bug#9045 ---- - ---- a/src/mesa/drivers/dri/i965/intel_ioctl.c -+++ b/src/mesa/drivers/dri/i965/intel_ioctl.c -@@ -75,7 +75,7 @@ void intelWaitIrq( struct intel_context - { - if (!intel->no_hw) { - drmI830IrqWait iw; -- int ret; -+ int ret, lastdispatch; - - if (0) - fprintf(stderr, "%s %d\n", __FUNCTION__, seq ); -@@ -83,11 +83,12 @@ void intelWaitIrq( struct intel_context - iw.irq_seq = seq; - - do { -+ lastdispatch = intel->sarea->last_dispatch; - ret = drmCommandWrite( intel->driFd, DRM_I830_IRQ_WAIT, &iw, sizeof(iw) ); - - /* This seems quite often to return before it should!?! - */ -- } while (ret == -EAGAIN || ret == -EINTR || (ret == 0 && seq > intel->sarea->last_dispatch)); -+ } while (ret == -EAGAIN || ret == -EINTR || (ret == -EBUSY && lastdispatch != intel->sarea->last_dispatch) || (ret == 0 && seq > intel->sarea->last_dispatch)); - - - if ( ret ) { - rmfile ./source/x11/xorg-server/bug-9045.patch hunk ./source/x11/xorg-server/bug-9237.patch 1 -From: Xiang, Haihao -Date: Fri, 8 Dec 2006 09:05:14 +0000 (+0800) -Subject: fix bug#9237 -X-Git-Url: http://gitweb.freedesktop.org/?p=mesa/mesa.git;a=commitdiff;h=f79360858d4c94629ef543a35e4e44a13419ac0e - -fix bug#9237 ---- - ---- a/src/mesa/drivers/dri/i965/brw_misc_state.c -+++ b/src/mesa/drivers/dri/i965/brw_misc_state.c -@@ -88,10 +88,10 @@ static void upload_drawing_rect(struct b - if (brw->intel.numClipRects > 1) - return; - -- x1 = dPriv->x; -- y1 = dPriv->y; -- x2 = dPriv->x + dPriv->w; -- y2 = dPriv->y + dPriv->h; -+ x1 = brw->intel.pClipRects[0].x1; -+ y1 = brw->intel.pClipRects[0].y1; -+ x2 = brw->intel.pClipRects[0].x2; -+ y2 = brw->intel.pClipRects[0].y2; - - if (x1 < 0) x1 = 0; - if (y1 < 0) y1 = 0; - rmfile ./source/x11/xorg-server/bug-9237.patch hunk ./source/x11/xorg-server/i915tex.patch 1 -From: Michel DÃ?nzer -Date: Thu, 7 Dec 2006 10:03:48 +0000 (+0100) -Subject: i915tex: Recalculate viewport related hardware state in intelWindowMoved(). -X-Git-Url: http://gitweb.freedesktop.org/?p=mesa/mesa.git;a=commitdiff;h=7a10d66590a4cebd2b453218e75fe82b02a3edcc - -i915tex: Recalculate viewport related hardware state in intelWindowMoved(). - -This fixes vertically displaced rendering with some apps like Google Earth. - -Simplify other parts of the function somewhat. ---- - ---- a/src/mesa/drivers/dri/i915tex/intel_buffers.c -+++ b/src/mesa/drivers/dri/i915tex/intel_buffers.c -@@ -36,6 +36,7 @@ - #include "intel_batchbuffer.h" - #include "context.h" - #include "utils.h" -+#include "drirenderbuffer.h" - #include "framebuffer.h" - #include "swrast/swrast.h" - #include "vblank.h" -@@ -183,6 +184,8 @@ void - intelWindowMoved(struct intel_context *intel) - { - GLcontext *ctx = &intel->ctx; -+ __DRIdrawablePrivate *dPriv = intel->driDrawable; -+ GLframebuffer *drawFb = (GLframebuffer *) dPriv->driverPrivate; - - if (!intel->ctx.DrawBuffer) { - /* when would this happen? -BP */ -@@ -194,7 +197,7 @@ intelWindowMoved(struct intel_context *i - } - else { - /* drawing to a window */ -- switch (intel->ctx.DrawBuffer->_ColorDrawBufferMask[0]) { -+ switch (drawFb->_ColorDrawBufferMask[0]) { - case BUFFER_BIT_FRONT_LEFT: - intelSetFrontClipRects(intel); - break; -@@ -207,14 +210,11 @@ intelWindowMoved(struct intel_context *i - } - } - -- /* this update Mesa's notion of window size */ -- if (ctx->WinSysDrawBuffer) { -- _mesa_resize_framebuffer(ctx, ctx->WinSysDrawBuffer, -- intel->driDrawable->w, intel->driDrawable->h); -- } -+ /* Update Mesa's notion of window size */ -+ driUpdateFramebufferSize(ctx, dPriv); -+ drawFb->Initialized = GL_TRUE; /* XXX remove someday */ - -- if (intel->intelScreen->driScrnPriv->ddxMinor >= 7 && intel->driDrawable) { -- __DRIdrawablePrivate *dPriv = intel->driDrawable; -+ if (intel->intelScreen->driScrnPriv->ddxMinor >= 7) { - drmI830Sarea *sarea = intel->sarea; - drm_clip_rect_t drw_rect = { .x1 = dPriv->x, .x2 = dPriv->x + dPriv->w, - .y1 = dPriv->y, .y2 = dPriv->y + dPriv->h }; -@@ -245,6 +245,9 @@ intelWindowMoved(struct intel_context *i - /* Update hardware scissor */ - ctx->Driver.Scissor(ctx, ctx->Scissor.X, ctx->Scissor.Y, - ctx->Scissor.Width, ctx->Scissor.Height); -+ -+ /* Re-calculate viewport related state */ -+ ctx->Driver.DepthRange( ctx, ctx->Viewport.Near, ctx->Viewport.Far ); - } rmfile ./source/x11/xorg-server/i915tex.patch addfile ./source/x11/xorg-server/mesa-6.5.3.patch hunk ./source/x11/xorg-server/mesa-6.5.3.patch 1 +diff -Naur xorg-server-X11R7.2-1.2.0/configure.ac xorg-server-X11R7.2-1.2.0-p/configure.ac +--- xorg-server-X11R7.2-1.2.0/configure.ac 2007-01-23 05:53:24.000000000 +0100 ++++ xorg-server-X11R7.2-1.2.0-p/configure.ac 2007-06-02 03:23:55.000000000 +0200 +@@ -1690,6 +1690,7 @@ + GL/mesa/swrast/Makefile + GL/mesa/swrast_setup/Makefile + GL/mesa/tnl/Makefile ++GL/mesa/vbo/Makefile + GL/mesa/X/Makefile + include/Makefile + afb/Makefile +diff -Naur xorg-server-X11R7.2-1.2.0/GL/mesa/glapi/Makefile.am xorg-server-X11R7.2-1.2.0-p/GL/mesa/glapi/Makefile.am +--- xorg-server-X11R7.2-1.2.0/GL/mesa/glapi/Makefile.am 2007-01-23 04:13:14.000000000 +0100 ++++ xorg-server-X11R7.2-1.2.0-p/GL/mesa/glapi/Makefile.am 2007-06-02 03:23:55.000000000 +0200 +@@ -7,7 +7,6 @@ + + INCLUDES = -I@MESA_SOURCE@/include \ + -I../X \ +- -I../array_cache \ + -I../glapi \ + -I../main \ + -I../math \ +diff -Naur xorg-server-X11R7.2-1.2.0/GL/mesa/main/Makefile.am xorg-server-X11R7.2-1.2.0-p/GL/mesa/main/Makefile.am +--- xorg-server-X11R7.2-1.2.0/GL/mesa/main/Makefile.am 2007-01-23 04:13:14.000000000 +0100 ++++ xorg-server-X11R7.2-1.2.0-p/GL/mesa/main/Makefile.am 2007-06-02 03:23:55.000000000 +0200 +@@ -7,7 +7,6 @@ + + INCLUDES = -I@MESA_SOURCE@/include \ + -I../X \ +- -I../array_cache \ + -I../glapi \ + -I../main \ + -I../math \ +@@ -62,13 +61,14 @@ + matrix.c \ + mipmap.c \ + mm.c \ +- occlude.c \ + pixel.c \ + points.c \ + polygon.c \ ++ queryobj.c \ + rastpos.c \ + rbadaptors.c \ + renderbuffer.c \ ++ shaders.c \ + state.c \ + stencil.c \ + texcompress.c \ +diff -Naur xorg-server-X11R7.2-1.2.0/GL/mesa/Makefile.am xorg-server-X11R7.2-1.2.0-p/GL/mesa/Makefile.am +--- xorg-server-X11R7.2-1.2.0/GL/mesa/Makefile.am 2007-01-23 04:13:14.000000000 +0100 ++++ xorg-server-X11R7.2-1.2.0-p/GL/mesa/Makefile.am 2007-06-02 03:23:55.000000000 +0200 +@@ -1,15 +1,15 @@ +-SUBDIRS = main math array_cache swrast swrast_setup tnl shader X glapi ++SUBDIRS = main math swrast swrast_setup tnl shader X glapi vbo + + noinst_LTLIBRARIES = libGLcore.la + + libGLcore_la_SOURCES = dummy.c + libGLcore_la_LIBADD = main/libmain.la \ + math/libmath.la \ +- array_cache/libac.la \ + swrast/libswrast.la \ + swrast_setup/libss.la \ + tnl/libtnl.la \ + shader/libshader.la \ + shader/grammar/libgrammar.la \ + shader/slang/libslang.la \ ++ vbo/libvbo.la \ + X/libX.la +diff -Naur xorg-server-X11R7.2-1.2.0/GL/mesa/math/Makefile.am xorg-server-X11R7.2-1.2.0-p/GL/mesa/math/Makefile.am +--- xorg-server-X11R7.2-1.2.0/GL/mesa/math/Makefile.am 2007-01-23 04:13:14.000000000 +0100 ++++ xorg-server-X11R7.2-1.2.0-p/GL/mesa/math/Makefile.am 2007-06-02 03:23:55.000000000 +0200 +@@ -7,7 +7,6 @@ + + INCLUDES = -I@MESA_SOURCE@/include \ + -I../X \ +- -I../array_cache \ + -I../glapi \ + -I../main \ + -I../math \ +diff -Naur xorg-server-X11R7.2-1.2.0/GL/mesa/shader/grammar/Makefile.am xorg-server-X11R7.2-1.2.0-p/GL/mesa/shader/grammar/Makefile.am +--- xorg-server-X11R7.2-1.2.0/GL/mesa/shader/grammar/Makefile.am 2007-01-23 04:13:14.000000000 +0100 ++++ xorg-server-X11R7.2-1.2.0-p/GL/mesa/shader/grammar/Makefile.am 2007-06-02 03:23:55.000000000 +0200 +@@ -7,7 +7,6 @@ + + INCLUDES = -I@MESA_SOURCE@/include \ + -I../../X \ +- -I../../array_cache \ + -I../../glapi \ + -I../../main \ + -I../../math \ +diff -Naur xorg-server-X11R7.2-1.2.0/GL/mesa/shader/Makefile.am xorg-server-X11R7.2-1.2.0-p/GL/mesa/shader/Makefile.am +--- xorg-server-X11R7.2-1.2.0/GL/mesa/shader/Makefile.am 2007-01-23 04:13:14.000000000 +0100 ++++ xorg-server-X11R7.2-1.2.0-p/GL/mesa/shader/Makefile.am 2007-06-02 03:23:55.000000000 +0200 +@@ -9,7 +9,6 @@ + + INCLUDES = -I@MESA_SOURCE@/include \ + -I../X \ +- -I../array_cache \ + -I../glapi \ + -I../main \ + -I../math \ +@@ -28,8 +27,13 @@ + atifragshader.c \ + nvfragparse.c \ + nvprogram.c \ +- nvvertexec.c \ +- nvvertparse.c \ ++ nvvertparse.c \ ++ prog_debug.c \ ++ prog_execute.c \ ++ prog_instruction.c \ ++ prog_parameter.c \ ++ prog_print.c \ + program.c \ +- shaderobjects.c \ +- shaderobjects_3dlabs.c ++ programopt.c \ ++ prog_statevars.c \ ++ shader_api.c +diff -Naur xorg-server-X11R7.2-1.2.0/GL/mesa/shader/slang/Makefile.am xorg-server-X11R7.2-1.2.0-p/GL/mesa/shader/slang/Makefile.am +--- xorg-server-X11R7.2-1.2.0/GL/mesa/shader/slang/Makefile.am 2007-01-23 04:13:14.000000000 +0100 ++++ xorg-server-X11R7.2-1.2.0-p/GL/mesa/shader/slang/Makefile.am 2007-06-02 03:23:55.000000000 +0200 +@@ -8,7 +8,6 @@ + INCLUDES = -I@MESA_SOURCE@/include \ + -I../grammar \ + -I../../X \ +- -I../../array_cache \ + -I../../glapi \ + -I../../main \ + -I../../math \ +@@ -19,23 +18,24 @@ + -I../.. \ + -I$(top_srcdir)/hw/xfree86/os-support + +-nodist_libslang_la_SOURCES = slang_analyse.c \ +- slang_assemble_assignment.c \ +- slang_assemble.c \ +- slang_assemble_conditional.c \ +- slang_assemble_constructor.c \ +- slang_assemble_typeinfo.c \ ++nodist_libslang_la_SOURCES = slang_builtin.c \ ++ slang_codegen.c \ + slang_compile.c \ + slang_compile_function.c \ + slang_compile_operation.c \ + slang_compile_struct.c \ + slang_compile_variable.c \ +- slang_execute.c \ +- slang_execute_x86.c \ +- slang_export.c \ +- slang_library_texsample.c \ ++ slang_emit.c \ ++ slang_ir.c \ ++ slang_label.c \ + slang_library_noise.c \ + slang_link.c \ ++ slang_log.c \ ++ slang_mem.c \ + slang_preprocess.c \ ++ slang_print.c \ ++ slang_simplify.c \ + slang_storage.c \ +- slang_utility.c ++ slang_typeinfo.c \ ++ slang_utility.c \ ++ slang_vartable.c +diff -Naur xorg-server-X11R7.2-1.2.0/GL/mesa/swrast/Makefile.am xorg-server-X11R7.2-1.2.0-p/GL/mesa/swrast/Makefile.am +--- xorg-server-X11R7.2-1.2.0/GL/mesa/swrast/Makefile.am 2007-01-23 04:13:14.000000000 +0100 ++++ xorg-server-X11R7.2-1.2.0-p/GL/mesa/swrast/Makefile.am 2007-06-02 03:23:55.000000000 +0200 +@@ -7,7 +7,6 @@ + + INCLUDES = -I@MESA_SOURCE@/include \ + -I../X \ +- -I../array_cache \ + -I../glapi \ + -I../main \ + -I../math \ +@@ -24,7 +23,6 @@ + s_aatriangle.c \ + s_accum.c \ + s_alpha.c \ +- s_arbshader.c \ + s_atifragshader.c \ + s_bitmap.c \ + s_blend.c \ +@@ -36,11 +34,11 @@ + s_drawpix.c \ + s_feedback.c \ + s_fog.c \ ++ s_fragprog.c \ + s_imaging.c \ + s_lines.c \ + s_logic.c \ + s_masking.c \ +- s_nvfragprog.c \ + s_points.c \ + s_readpix.c \ + s_span.c \ +diff -Naur xorg-server-X11R7.2-1.2.0/GL/mesa/swrast_setup/Makefile.am xorg-server-X11R7.2-1.2.0-p/GL/mesa/swrast_setup/Makefile.am +--- xorg-server-X11R7.2-1.2.0/GL/mesa/swrast_setup/Makefile.am 2007-01-23 04:13:14.000000000 +0100 ++++ xorg-server-X11R7.2-1.2.0-p/GL/mesa/swrast_setup/Makefile.am 2007-06-02 03:23:55.000000000 +0200 +@@ -7,7 +7,6 @@ + + INCLUDES = -I@MESA_SOURCE@/include \ + -I../X \ +- -I../array_cache \ + -I../glapi \ + -I../main \ + -I../math \ +diff -Naur xorg-server-X11R7.2-1.2.0/GL/mesa/tnl/Makefile.am xorg-server-X11R7.2-1.2.0-p/GL/mesa/tnl/Makefile.am +--- xorg-server-X11R7.2-1.2.0/GL/mesa/tnl/Makefile.am 2007-01-23 04:13:14.000000000 +0100 ++++ xorg-server-X11R7.2-1.2.0-p/GL/mesa/tnl/Makefile.am 2007-06-02 03:23:55.000000000 +0200 +@@ -7,7 +7,6 @@ + + INCLUDES = -I@MESA_SOURCE@/include \ + -I../X \ +- -I../array_cache \ + -I../glapi \ + -I../main \ + -I../math \ +@@ -19,16 +18,9 @@ + -I.. \ + -I$(top_srcdir)/hw/xfree86/os-support + +-nodist_libtnl_la_SOURCES = t_array_api.c \ +- t_array_import.c \ +- t_context.c \ ++nodist_libtnl_la_SOURCES = t_context.c \ ++ t_draw.c \ + t_pipeline.c \ +- t_save_api.c \ +- t_save_loopback.c \ +- t_save_playback.c \ +- t_vb_arbprogram.c \ +- t_vb_arbprogram_sse.c \ +- t_vb_arbshader.c \ + t_vb_cull.c \ + t_vb_fog.c \ + t_vb_light.c \ +@@ -42,9 +34,4 @@ + t_vertex.c \ + t_vertex_generic.c \ + t_vertex_sse.c \ +- t_vp_build.c \ +- t_vtx_api.c \ +- t_vtx_eval.c \ +- t_vtx_exec.c \ +- t_vtx_generic.c \ +- t_vtx_x86.c ++ t_vp_build.c +diff -Naur xorg-server-X11R7.2-1.2.0/GL/mesa/vbo/Makefile.am xorg-server-X11R7.2-1.2.0-p/GL/mesa/vbo/Makefile.am +--- xorg-server-X11R7.2-1.2.0/GL/mesa/vbo/Makefile.am 1970-01-01 01:00:00.000000000 +0100 ++++ xorg-server-X11R7.2-1.2.0-p/GL/mesa/vbo/Makefile.am 2007-06-02 03:23:55.000000000 +0200 +@@ -0,0 +1,35 @@ ++noinst_LTLIBRARIES = libvbo.la ++ ++AM_CFLAGS = \ ++ $(DIX_CFLAGS) \ ++ -DXFree86Server \ ++ @GLX_DEFINES@ ++ ++INCLUDES = -I@MESA_SOURCE@/include \ ++ -I../X \ ++ -I../glapi \ ++ -I../main \ ++ -I../math \ ++ -I../shader \ ++ -I../shader/slang \ ++ -I../shader/slang \ ++ -I../swrast \ ++ -I../swrast_setup \ ++ -I../tnl \ ++ -I.. \ ++ -I$(top_srcdir)/hw/xfree86/os-support ++ ++nodist_libvbo_la_SOURCES = vbo_context.c \ ++ vbo_exec_api.c \ ++ vbo_exec_array.c \ ++ vbo_exec.c \ ++ vbo_exec_draw.c \ ++ vbo_exec_eval.c \ ++ vbo_rebase.c \ ++ vbo_save_api.c \ ++ vbo_save.c \ ++ vbo_save_draw.c \ ++ vbo_save_loopback.c \ ++ vbo_split.c \ ++ vbo_split_copy.c \ ++ vbo_split_inplace.c +diff -Naur xorg-server-X11R7.2-1.2.0/GL/mesa/X/Makefile.am xorg-server-X11R7.2-1.2.0-p/GL/mesa/X/Makefile.am +--- xorg-server-X11R7.2-1.2.0/GL/mesa/X/Makefile.am 2007-01-23 04:13:14.000000000 +0100 ++++ xorg-server-X11R7.2-1.2.0-p/GL/mesa/X/Makefile.am 2007-06-02 03:23:55.000000000 +0200 +@@ -2,7 +2,6 @@ + + INCLUDES = -I@MESA_SOURCE@/include \ + -I../X \ +- -I../array_cache \ + -I../glapi \ + -I../main \ + -I../math \ +@@ -21,18 +20,15 @@ + AM_CFLAGS = \ + $(DIX_CFLAGS) \ + -DXFree86Server \ +- @GLX_DEFINES@ \ +- -DXFree86Server ++ @GLX_DEFINES@ + +-libX_la_SOURCES = xf86glx.c \ +- xf86glx_util.c \ +- xf86glx_util.h \ +- xf86glxint.h ++libX_la_SOURCES = xf86glx.c + + nodist_libX_la_SOURCES = \ + xm_api.c \ + xm_buffer.c \ + xm_dd.c \ ++ xm_image.c \ + xm_line.c \ + xm_span.c \ + xm_tri.c \ +diff -Naur xorg-server-X11R7.2-1.2.0/GL/symlink-mesa.sh xorg-server-X11R7.2-1.2.0-p/GL/symlink-mesa.sh +--- xorg-server-X11R7.2-1.2.0/GL/symlink-mesa.sh 2007-01-23 04:13:14.000000000 +0100 ++++ xorg-server-X11R7.2-1.2.0-p/GL/symlink-mesa.sh 2007-06-02 03:23:55.000000000 +0200 +@@ -85,15 +85,6 @@ + done + } + +-symlink_mesa_ac() { +- src_dir src/mesa/array_cache +- dst_dir mesa/array_cache +- +- for src in $REAL_SRC_DIR/*.c $REAL_SRC_DIR/*.h; do +- action `basename $src` +- done +-} +- + symlink_mesa_swrast() { + src_dir src/mesa/swrast + dst_dir mesa/swrast +@@ -157,6 +148,15 @@ + done + } + ++symlink_mesa_vbo() { ++ src_dir src/mesa/vbo ++ dst_dir mesa/vbo ++ ++ for src in $REAL_SRC_DIR/*.c $REAL_SRC_DIR/*.h; do ++ action `basename $src` ++ done ++} ++ + symlink_mesa_x() { + src_dir src/mesa/drivers/x11 + dst_dir mesa/X +@@ -168,6 +168,8 @@ + action xm_api.c + action xm_buffer.c + action xm_dd.c ++ action xm_image.c ++ action xm_image.h + action xm_line.c + action xm_span.c + action xm_tri.c +@@ -203,7 +205,6 @@ + symlink_mesa() { + symlink_mesa_main + symlink_mesa_math +- symlink_mesa_ac + symlink_mesa_swrast + symlink_mesa_ss + symlink_mesa_tnl +@@ -215,6 +216,7 @@ + symlink_mesa_glapi + symlink_mesa_ppc + symlink_mesa_sparc ++ symlink_mesa_vbo + symlink_mesa_x86 + symlink_mesa_x8664 + } +@@ -225,9 +227,6 @@ + dst_dir glx + + action indirect_size.h +- +- src_dir src/mesa/drivers/dri/common +- + action glcontextmodes.c + action glcontextmodes.h + +@@ -289,9 +288,9 @@ + } + + usage() { +- echo symlink.sh src-dir dst-dir +- echo src-dir: the xc directory of the monolithic source tree +- echo dst-dir: the modular source tree containing proto, app, lib, ... ++ echo symlink-mesa.sh src-dir dst-dir ++ echo src-dir: the Mesa source directory ++ echo dst-dir: the GL subdirectory of the Xserver modular tree + } + + # Check commandline args addfile ./source/x11/xorg-server/remove__GLinterface.patch hunk ./source/x11/xorg-server/remove__GLinterface.patch 1 +diff -Nur GL.orig/glx/glxext.c GL/glx/glxext.c +--- GL.orig/glx/glxext.c 2006-12-01 03:40:10.000000000 +0200 ++++ GL/glx/glxext.c 2007-04-23 01:23:39.900111785 +0300 +@@ -275,7 +275,7 @@ + /* + ** The GL was will call this routine if an error occurs. + */ +-void __glXErrorCallBack(__GLinterface *gc, GLenum code) ++void __glXErrorCallBack(GLenum code) + { + errorOccured = GL_TRUE; + } +diff -Nur GL.orig/glx/glxext.h GL/glx/glxext.h +--- GL.orig/glx/glxext.h 2006-09-18 09:04:17.000000000 +0300 ++++ GL/glx/glxext.h 2007-04-23 01:23:39.900111785 +0300 +@@ -66,7 +66,7 @@ + extern GLboolean __glXFreeContext(__GLXcontext *glxc); + extern void __glXFlushContextCache(void); + +-extern void __glXErrorCallBack(__GLinterface *gc, GLenum code); ++extern void __glXErrorCallBack(GLenum code); + extern void __glXClearErrorOccured(void); + extern GLboolean __glXErrorOccured(void); + extern void __glXResetLargeCommandStatus(__GLXclientState*); +diff -Nur hw.orig/dmx/glxProxy/glxext.h hw/dmx/glxProxy/glxext.h +--- hw.orig/dmx/glxProxy/glxext.h 2006-09-18 09:04:17.000000000 +0300 ++++ hw/dmx/glxProxy/glxext.h 2006-09-18 09:04:17.000000000 +0300 +@@ -67,7 +67,7 @@ + + extern void __glXNoSuchRenderOpcode(GLbyte*); + extern int __glXNoSuchSingleOpcode(__GLXclientState*, GLbyte*); +-extern void __glXErrorCallBack(__GLinterface *gc, GLenum code); ++extern void __glXErrorCallBack(GLenum code); + extern void __glXClearErrorOccured(void); + extern GLboolean __glXErrorOccured(void); + extern void __glXResetLargeCommandStatus(__GLXclientState*); } From alex at alex-smith.me.uk Sun Jun 3 11:16:30 2007 From: alex at alex-smith.me.uk (AlexExtreme) Date: Sun Jun 3 11:16:33 2007 Subject: [Frugalware-darcs] upstart-mess: gnome.sh: sync with current Message-ID: <20070603091630.B84921768138@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=upstart-mess;a=darcs_commitdiff;h=20070603091549-46e39-80edd8c34d406babac7a4af46b58b21e8c453aca.gz; [gnome.sh: sync with current AlexExtreme **20070603091549] { hunk ./source/include/gnome.sh 41 - _F_gnome_devel="y" + _F_gnome_devel="n" } From alex at alex-smith.me.uk Sun Jun 3 12:19:59 2007 From: alex at alex-smith.me.uk (AlexExtreme) Date: Sun Jun 3 12:20:01 2007 Subject: [Frugalware-darcs] upstart-mess: gdm-2.18.2-2-i686 Message-ID: <20070603101959.4713F1768138@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=upstart-mess;a=darcs_commitdiff;h=20070603092123-46e39-499ca5602c81b9ae7f5a84f3b8dbb60c7b23b04a.gz; [gdm-2.18.2-2-i686 AlexExtreme **20070603092123 * Sync with -current ] { hunk ./source/gnome/gdm/FrugalBuild 5 -pkgver=2.18.1 -pkgrel=4 +pkgver=2.18.2 +pkgrel=2 hunk ./source/gnome/gdm/FrugalBuild 17 -options=(${options[@]} 'force') hunk ./source/gnome/gdm/FrugalBuild 21 - $pkgname-2.18.1-desktop-fix-from-svn.patch + $pkgname-2.18.1-desktop-fix-from-svn.patch \ hunk ./source/gnome/gdm/FrugalBuild 23 -sha1sums=('70b902ff810a69109746c135dd095db34982a9d0' \ +sha1sums=('eec572827fd8356d6d231f28e20d4b8e2a6c1048' \ } From alex at alex-smith.me.uk Sun Jun 3 13:05:04 2007 From: alex at alex-smith.me.uk (AlexExtreme) Date: Sun Jun 3 13:05:07 2007 Subject: [Frugalware-darcs] upstart-mess: wine-0.9.38-2-i686 Message-ID: <20070603110505.31D7E1768138@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=upstart-mess;a=darcs_commitdiff;h=20070603110105-46e39-fd9e8f95d39f4f97a41e7b193c49c5a0c2cd96dd.gz; [wine-0.9.38-2-i686 AlexExtreme **20070603110105 * Sync with -current ] { hunk ./source/xapps/wine/FrugalBuild 6 -pkgver=0.9.35 +pkgver=0.9.38 hunk ./source/xapps/wine/FrugalBuild 12 -## sane-backends , gphoto2 , jack , arts , nas +## sane-backends , gphoto2 , jack , arts , nas , esd hunk ./source/xapps/wine/FrugalBuild 14 - 'fontforge' 'libjpeg' 'libxml2' 'libusb' 'freeglut' 'alsa-lib' 'esd' 'libxrender' 'libxrandr') -makedepends=('flex' 'bison') + 'fontforge' 'libjpeg' 'libxml2' 'libusb' 'freeglut' 'alsa-lib' 'libxrender' 'libxrandr' 'libcups') +makedepends=('flex' 'bison' 'cups') hunk ./source/xapps/wine/FrugalBuild 24 - Fbuild --enable-opengl --disable-debug --disable-trace - #make depend || return 1 - #make || return 1 - #Fmakeinstall + Fconf --enable-opengl --disable-debug --disable-trace + make depend || Fdie + make || Fdie + Fmakeinstall hunk ./source/xapps/wine/FrugalBuild 31 -sha1sums=('312ca169c76a616e749c4380e98744c5ba445716'\ +sha1sums=('2a9ca694170c6a5ca95c0300c51566b1d8de09e0' \ } From alex at alex-smith.me.uk Sun Jun 3 13:33:13 2007 From: alex at alex-smith.me.uk (AlexExtreme) Date: Sun Jun 3 13:33:15 2007 Subject: [Frugalware-darcs] homepage-ng: news.xml: 0.6a for x86_64 released Message-ID: <20070603113313.210D41768137@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=homepage-ng;a=darcs_commitdiff;h=20070603113208-46e39-bfca6114f2f449d4e202b348e61a04652ddc683b.gz; [news.xml: 0.6a for x86_64 released AlexExtreme **20070603113208] { hunk ./frugalware/xml/news.xml 21 - 1 + 0 } From alex at alex-smith.me.uk Sun Jun 3 13:34:41 2007 From: alex at alex-smith.me.uk (AlexExtreme) Date: Sun Jun 3 13:34:43 2007 Subject: [Frugalware-darcs] homepage-ng: news.xml: typo fix Message-ID: <20070603113441.DCF161768138@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=homepage-ng;a=darcs_commitdiff;h=20070603113354-46e39-a5d14594c81a98e319d8de4ea97e296288f8aa36.gz; [news.xml: typo fix AlexExtreme **20070603113354] { hunk ./frugalware/xml/news.xml 30 - NOTE: Don't download CDs 3-12 or the second DVD unless you don't have an internet connection
+ NOTE: Don't download CDs 3-9 or the second DVD unless you don't have an internet connection
} From alex at alex-smith.me.uk Sun Jun 3 13:38:36 2007 From: alex at alex-smith.me.uk (AlexExtreme) Date: Sun Jun 3 13:38:37 2007 Subject: [Frugalware-darcs] homepage-ng: news.xml: added note about 0.6a for x86_64 to 0.6 announce Message-ID: <20070603113836.95DFE1768138@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=homepage-ng;a=darcs_commitdiff;h=20070603113745-46e39-8578de25b84304dc71e01d1c262212b50bf48726.gz; [news.xml: added note about 0.6a for x86_64 to 0.6 announce AlexExtreme **20070603113745] { hunk ./frugalware/xml/news.xml 268 +
  • If you want to use x86_64, download 0.6a for x86_64 instead!
  • } From vmiklos at frugalware.org Sun Jun 3 13:46:04 2007 From: vmiklos at frugalware.org (VMiklos) Date: Sun Jun 3 13:46:06 2007 Subject: [Frugalware-darcs] frugalware-current: glibc-2.6-3-i686 Message-ID: <20070603114604.784281768138@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070603113307-e2957-b933e0c0ec70d5c68e6e5597f91579003e00dfd8.gz; [glibc-2.6-3-i686 VMiklos **20070603113307 rebuilt using --enable-kernel=2.6.0 closes #2104 ] { hunk ./source/base/glibc/FrugalBuild 6 -pkgrel=2 +pkgrel=3 hunk ./source/base/glibc/FrugalBuild 35 - --enable-add-ons=nptl --enable-kernel=2.6.20 --enable-bind-now \ + --enable-add-ons=nptl --enable-kernel=2.6.0 --enable-bind-now \ } From crazy at frugalware.org Sun Jun 3 13:50:11 2007 From: crazy at frugalware.org (crazy) Date: Sun Jun 3 13:50:19 2007 Subject: [Frugalware-darcs] frugalware-current: php-5.2.3-2-i686 Message-ID: <20070603115013.ADA341768138@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070603114551-f6986-48b073dbfcdd6f947404ddeb89a1a376ee27581c.gz; [php-5.2.3-2-i686 crazy **20070603114551 * fixes for SMP builds , make is fine with SMP just make install is broken * fixed php-cgi , reported by janny ] { hunk ./source/devel/php/FrugalBuild 7 -pkgrel=1 +pkgrel=2 hunk ./source/devel/php/FrugalBuild 91 + # OK make install does not really like SMP and random dies so .. + JOBS="$MAKEFLAGS" + unset MAKEFLAGS + Fcd hunk ./source/devel/php/FrugalBuild 97 - Fmkdir usr/lib/php hunk ./source/devel/php/FrugalBuild 98 - ./buildconf --force - Fmake ${phpconfig} \ + sh buildconf --force || Fdie + ## do we really need this ? --disable-all .. + Fconf \ + ${phpconfig} \ hunk ./source/devel/php/FrugalBuild 106 - + make ${JOBS} || Fdie hunk ./source/devel/php/FrugalBuild 111 - Frm usr/bin/{phpize,php-config,pecl,pear*} + Frm usr/bin/{phpize,php-config,pecl,pear*,php} hunk ./source/devel/php/FrugalBuild 113 - Fmv usr/bin/php usr/bin/php-cgi hunk ./source/devel/php/FrugalBuild 123 - ./buildconf --force - Fmake ${phpconfig} --with-apxs2 + sh buildconf --force || Fdie + Fconf ${phpconfig} --with-apxs2 + make ${JOBS} || Fdie } From vmiklos at frugalware.org Sun Jun 3 14:29:48 2007 From: vmiklos at frugalware.org (VMiklos) Date: Sun Jun 3 14:29:52 2007 Subject: [Frugalware-darcs] frugalwareutils: libfwgrubconfig/os_prober(): kernel parameters may contain double dots Message-ID: <20070603122949.3F401176813A@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalwareutils;a=darcs_commitdiff;h=20070603122241-e2957-a3ced919975d68f1c78b9686e0a3ac7a59ac3ec6.gz; [libfwgrubconfig/os_prober(): kernel parameters may contain double dots VMiklos **20070603122241 closes #964 ] { hunk ./libfwgrubconfig/libfwgrubconfig.c 571 - while(*++ptr) - if(*ptr==':') - break; - *ptr='\0'; } From vmiklos at frugalware.org Sun Jun 3 14:29:48 2007 From: vmiklos at frugalware.org (VMiklos) Date: Sun Jun 3 14:29:53 2007 Subject: [Frugalware-darcs] frugalwareutils: doc/frugalwareutils.3 Message-ID: <20070603122948.EC5291768139@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalwareutils;a=darcs_commitdiff;h=20070603121921-e2957-8bfc39f3f90ea50684bba4eba52ad679e5061328.gz; [doc/frugalwareutils.3 VMiklos **20070603121921 * remove some accidently added lines * add libfwxconfig * typo fix in libfwxconfig's line ] { hunk ./doc/frugalwareutils.3 10 -SUBDIRS = doc libfwutil libfwdialog setup \ - libfwnetconfig netconfig \ - libfwtimeconfig timeconfig \ - libfwraidconfig raidconfig \ - libfwmouseconfig mouseconfig \ - libfwxconfig - hunk ./doc/frugalwareutils.3 17 -libfwxonfig Functions to make X configuration easier. +libfwxconfig Functions to make X configuration easier. +libfwxwmonfig Functions to make XDM configuration easier. } From vmiklos at frugalware.org Sun Jun 3 14:48:28 2007 From: vmiklos at frugalware.org (VMiklos) Date: Sun Jun 3 14:48:34 2007 Subject: [Frugalware-darcs] pacman-tools: portpkg: s/rf/repoman push/ Message-ID: <20070603124829.5C79A1768138@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=pacman-tools;a=darcs_commitdiff;h=20070603124219-e2957-673553da2849596a362493a56d7b13562178efc2.gz; [portpkg: s/rf/repoman push/ VMiklos **20070603124219] { hunk ./portpkg 30 - rf -k -f *fpm + repoman -k push } From vmiklos at frugalware.org Sun Jun 3 14:48:29 2007 From: vmiklos at frugalware.org (VMiklos) Date: Sun Jun 3 14:48:35 2007 Subject: [Frugalware-darcs] pacman-tools: --rf -> --push Message-ID: <20070603124829.B55981868008@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=pacman-tools;a=darcs_commitdiff;h=20070603124039-e2957-644de76d8efbaf7eff79952ff71146042595469e.gz; [--rf -> --push VMiklos **20070603124039 since we use repoman push, not rf ] { hunk ./bumppkg 140 - if [ "$1" == "--rf" ]; then + if [ "$1" == "--push" ]; then hunk ./portpkg 28 -if [ "$1" == "--rf" ]; then +if [ "$1" == "--push" ]; then hunk ./portpkg 32 - die "now run '$0 --rf' to record and push your changes" + die "now run '$0 --push' to record and push your changes" hunk ./revdep-rebuild 41 - bumppkg --rebuild "rebuilt with $pkg-$ver" --rf || echo $i >>$log + bumppkg --rebuild "rebuilt with $pkg-$ver" --push || echo $i >>$log } From vmiklos at frugalware.org Sun Jun 3 14:48:29 2007 From: vmiklos at frugalware.org (VMiklos) Date: Sun Jun 3 14:48:35 2007 Subject: [Frugalware-darcs] pacman-tools: bumppkg: drop --record, use repoman rec Message-ID: <20070603124829.ECDAC186800A@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=pacman-tools;a=darcs_commitdiff;h=20070603124653-e2957-692bc0339b8d664633b5891a7973da9e7a3e6666.gz; [bumppkg: drop --record, use repoman rec VMiklos **20070603124653] { hunk ./bumppkg 147 -if [ "$1" == "--record" ]; then - do_record "$2" - shift 2 -fi - hunk ./syncemul 13 - bumppkg --record "version bump" --push + bumppkg + repoman rec "version bump" + repoman -k push } From vmiklos at frugalware.org Sun Jun 3 14:48:30 2007 From: vmiklos at frugalware.org (VMiklos) Date: Sun Jun 3 14:48:35 2007 Subject: [Frugalware-darcs] pacman-tools: bumppkg: remove --record-only, use repoman rec instead Message-ID: <20070603124830.3EF791868019@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=pacman-tools;a=darcs_commitdiff;h=20070603124536-e2957-015ad5797f6ac100a40ddcba8ecb46249e3f9a0b.gz; [bumppkg: remove --record-only, use repoman rec instead VMiklos **20070603124536] { hunk ./bumppkg 125 - -if [ "$1" == "--record-only" ]; then - do_record "$2" - exit 0 -fi hunk ./portpkg 29 - bumppkg --record-only "added `uname -m` to archs()" || die "failed to record the patch" + repoman rec "added `uname -m` to archs()" || die "failed to record the patch" } From vmiklos at frugalware.org Sun Jun 3 14:55:20 2007 From: vmiklos at frugalware.org (VMiklos) Date: Sun Jun 3 14:55:22 2007 Subject: [Frugalware-darcs] pacman-tools: bumppkg: drop do_record(), use repoman rec Message-ID: <20070603125521.231D91768138@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=pacman-tools;a=darcs_commitdiff;h=20070603125414-e2957-5914522b833764e4c65378ed848a04831d92e248.gz; [bumppkg: drop do_record(), use repoman rec VMiklos **20070603125414] { hunk ./bumppkg 111 -# this can be replaced with repoman rec soon -do_record() -{ - source FrugalBuild || die "failed to source the FrugalBuild!" - root="`get_root`" - echo -e "`LANG= LC_ALL= date +"%a %b %d %H:%M:%S %Z %Y"` -`cat $root/_darcs/prefs/author` -$pkgname-$pkgver-$pkgrel-$CARCH -$@" | darcs rec -a --pipe . -} - hunk ./bumppkg 121 - do_record "$1" + repman rec "$1" } From vmiklos at frugalware.org Sun Jun 3 14:59:24 2007 From: vmiklos at frugalware.org (VMiklos) Date: Sun Jun 3 14:59:30 2007 Subject: [Frugalware-darcs] frugalware-current: busybox-1.6.0-1-i686 Message-ID: <20070603125924.BE8C21768138@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070603125559-e2957-f462f19b81ba86bbc61989b40be62176fdb42991.gz; [busybox-1.6.0-1-i686 VMiklos **20070603125559 * version bump * updated config ] { hunk ./source/apps-extra/busybox/FrugalBuild 5 -pkgver=1.5.1 +pkgver=1.6.0 hunk ./source/apps-extra/busybox/FrugalBuild 15 +sha1sums=('bce33a204a943bf7438e1fdb8d8a28e8d99e9c81' \ + 'fc8f5aabdb53c823c942244c2046f3f61ec8169d') hunk ./source/apps-extra/busybox/FrugalBuild 27 -sha1sums=('474a45d626735ec8e04ec31fd353a8ceb2984f3c'\ - '7507a970873770142474f27fe5598490cc1652f4') hunk ./source/apps-extra/busybox/config 3 -# Busybox version: 1.5.0 -# Fri May 18 17:22:15 2007 +# Busybox version: 1.6.0 +# Sun Jun 3 14:49:29 2007 hunk ./source/apps-extra/busybox/config 28 +# CONFIG_FEATURE_PIDFILE is not set hunk ./source/apps-extra/busybox/config 35 -# CONFIG_FEATURE_EXEC_PREFER_APPLETS is not set +# CONFIG_FEATURE_PREFER_APPLETS is not set hunk ./source/apps-extra/busybox/config 53 -# CONFIG_NO_DEBUG_LIB is not set +CONFIG_NO_DEBUG_LIB=y hunk ./source/apps-extra/busybox/config 202 +# CONFIG_SPLIT is not set +# CONFIG_FEATURE_SPLIT_FANCY is not set hunk ./source/apps-extra/busybox/config 280 +# CONFIG_FEATURE_RUN_PARTS_FANCY is not set hunk ./source/apps-extra/busybox/config 321 +CONFIG_FEATURE_FIND_GROUP=y hunk ./source/apps-extra/busybox/config 323 +CONFIG_FEATURE_FIND_DEPTH=y +CONFIG_FEATURE_FIND_PAREN=y +CONFIG_FEATURE_FIND_SIZE=y +CONFIG_FEATURE_FIND_PRUNE=y +# CONFIG_FEATURE_FIND_DELETE is not set +CONFIG_FEATURE_FIND_PATH=y hunk ./source/apps-extra/busybox/config 360 +# CONFIG_FEATURE_ADDUSER_TO_GROUP is not set hunk ./source/apps-extra/busybox/config 362 +# CONFIG_FEATURE_DEL_USER_FROM_GROUP is not set hunk ./source/apps-extra/busybox/config 373 +# CONFIG_CRYPTPW is not set hunk ./source/apps-extra/busybox/config 549 -# CONFIG_FEATURE_IFUPDOWN_IPX is not set hunk ./source/apps-extra/busybox/config 550 +# CONFIG_FEATURE_IFUPDOWN_EXTERNAL_DHCP is not set hunk ./source/apps-extra/busybox/config 578 +# CONFIG_FEATURE_NETSTAT_WIDE is not set hunk ./source/apps-extra/busybox/config 659 +# CONFIG_HUSH_HELP is not set +# CONFIG_HUSH_INTERACTIVE is not set +# CONFIG_HUSH_JOB is not set +# CONFIG_HUSH_TICK is not set +# CONFIG_HUSH_IF is not set +# CONFIG_HUSH_LOOPS is not set hunk ./source/apps-extra/busybox/config 672 -# CONFIG_FEATURE_SH_STANDALONE_SHELL is not set +# CONFIG_FEATURE_SH_STANDALONE is not set +# CONFIG_CTTYHACK is not set hunk ./source/apps-extra/busybox/config 704 +# CONFIG_LOAD_POLICY is not set hunk ./source/apps-extra/busybox/config 711 +# +# ipsvd utilities +# +# CONFIG_TCPSVD is not set +# CONFIG_UDPSVD is not set + } From krics at linuxforum.hu Sun Jun 3 15:32:11 2007 From: krics at linuxforum.hu (Christian Hamar alias krix) Date: Sun Jun 3 15:32:14 2007 Subject: [Frugalware-darcs] frugalware-current: imagemagick-6.3.4_5-1-x86_64 Message-ID: <20070603133211.7953A1768138@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070603133002-d209c-43771abbb009e5f9c9e3edb083acec49cec21d50.gz; [imagemagick-6.3.4_5-1-x86_64 Christian Hamar alias krix **20070603133002 * Version bump ] { hunk ./source/xapps/imagemagick/FrugalBuild 6 -pkgver=6.3.4_2 +pkgver=6.3.4_5 hunk ./source/xapps/imagemagick/FrugalBuild 32 -sha1sums=('7e46ce886e4496f2bda98f416fccd072d9af5294'\ +sha1sums=('59bdea4beaf7b694b8110789b0b0a12c36827cfe'\ } From alex at alex-smith.me.uk Sun Jun 3 16:21:20 2007 From: alex at alex-smith.me.uk (AlexExtreme) Date: Sun Jun 3 16:21:22 2007 Subject: [Frugalware-darcs] frugalware-current: gedit-2.18.1-2-i686 Message-ID: <20070603142120.7EDB61768138@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070603141913-46e39-1c7e5aa6b8727415b602657bc52da0b30a4c1846.gz; [gedit-2.18.1-2-i686 AlexExtreme **20070603141913 * Removed unnecessary eel depend (closes #2109) ] { hunk ./source/gnome/gedit/FrugalBuild 6 -pkgrel=1 +pkgrel=2 hunk ./source/gnome/gedit/FrugalBuild 9 -depends=('eel>=2.18.0.1' 'scrollkeeper' 'desktop-file-utils' 'python>=2.5' 'gtksourceview>=1.8.5' 'dbus-glib>=0.73' 'enchant' 'iso-codes') +depends=('scrollkeeper' 'desktop-file-utils' 'python>=2.5' 'gtksourceview>=1.8.5' 'dbus-glib>=0.73' 'enchant' 'iso-codes') } From vmiklos at frugalware.org Sun Jun 3 16:43:04 2007 From: vmiklos at frugalware.org (VMiklos) Date: Sun Jun 3 16:43:07 2007 Subject: [Frugalware-darcs] frugalware-current: os-prober-1.18-1-i686 Message-ID: <20070603144304.EA4CE1768138@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070603144103-e2957-e3efb799beced7d75cb518ea888d21fff4b22bb8.gz; [os-prober-1.18-1-i686 VMiklos **20070603144103 version bump, switching to upstream releases instead of svn snapshots ] { hunk ./source/base/os-prober/FrugalBuild 5 -pkgver=38238 -pkgrel=2 +pkgver=1.18 +pkgrel=1 hunk ./source/base/os-prober/FrugalBuild 8 -url="http://svn.debian.org/wsvn/d-i" +url="http://packages.debian.org/os-prober" hunk ./source/base/os-prober/FrugalBuild 12 -up2date="lynx -dump http://ftp.frugalware.org/pub/other/sources/os-prober/|Flasttarbz2" -source=(http://ftp.frugalware.org/pub/other/sources/os-prober/os-prober-$pkgver.tar.bz2 \ +up2date="lynx -dump http://ftp.debian.org/debian/pool/main/o/os-prober/|Flasttar|sed 's/.*_//'" +source=(http://ftp.debian.org/debian/pool/main/o/os-prober/os-prober_$pkgver.tar.gz \ hunk ./source/base/os-prober/FrugalBuild 15 +sha1sums=('c38e4fe62712a086bf43274491af7b9934b5136e' \ + 'f32a69a86bf8c03478a14f74d69d46d05e909615') +options=('force') hunk ./source/base/os-prober/FrugalBuild 40 -sha1sums=('787c7216d16216ecf5002c0623be591322b7974c' \ - 'f32a69a86bf8c03478a14f74d69d46d05e909615') - } From alex at alex-smith.me.uk Sun Jun 3 18:17:38 2007 From: alex at alex-smith.me.uk (AlexExtreme) Date: Sun Jun 3 18:17:40 2007 Subject: [Frugalware-darcs] upstart-mess: cups-1.2.11-3-i686 Message-ID: <20070603161738.747E81768138@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=upstart-mess;a=darcs_commitdiff;h=20070603161615-46e39-ea189b702c0546db1fdb98b5238095690a7744ec.gz; [cups-1.2.11-3-i686 AlexExtreme **20070603161615 * Sync with -current ] { hunk ./source/apps/cups/FrugalBuild 7 -pkgrel=2 +pkgrel=3 hunk ./source/apps/cups/FrugalBuild 10 -depends=('libtiff' 'openssl' 'libjpeg' 'libpng') +depends=('libtiff' 'libjpeg' 'libpng') +rodepends=('libcups') +makedepends=('openssl') hunk ./source/apps/cups/FrugalBuild 22 +subpkgs=('libcups') +subdescs=('Main library of the CUPS printing system.') +subdepends=('openssl zlib') +subgroups=('lib') +subarchs=('i686 x86_64') + hunk ./source/apps/cups/FrugalBuild 51 + Fsplit libcups usr/lib/libcups.so* } From krics at linuxforum.hu Sun Jun 3 18:57:10 2007 From: krics at linuxforum.hu (Christian Hamar alias krix) Date: Sun Jun 3 18:57:12 2007 Subject: [Frugalware-darcs] frugalware-current: mldonkey-2.8.7-1-x86_64 Message-ID: <20070603165710.73EF81768138@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070603165527-d209c-1661dc6dbbbbecccd5c97bf46d14effebf40cf2f.gz; [mldonkey-2.8.7-1-x86_64 Christian Hamar alias krix **20070603165527 * Version bump ] { hunk ./source/gnome-extra/mldonkey/FrugalBuild 5 -pkgver=2.8.6 +pkgver=2.8.7 hunk ./source/gnome-extra/mldonkey/FrugalBuild 30 -sha1sums=('f61437d48cb7796353c988e14a2c126bdaf3ac01') +sha1sums=('598e1443ac9b7684301892b620e620d11c333001') } From crazy at frugalware.org Sun Jun 3 19:17:18 2007 From: crazy at frugalware.org (crazy) Date: Sun Jun 3 19:17:21 2007 Subject: [Frugalware-darcs] frugalware-current: crystal-1.0.4-1-i686 Message-ID: <20070603171718.D33141768138@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070603171454-f6986-4f47d75a73a00fecbf6e22e7e7fe3f0b5302d594.gz; [crystal-1.0.4-1-i686 crazy **20070603171454 * Version bump ] { hunk ./source/kde/crystal/FrugalBuild 5 -pkgver=1.0.3 +pkgver=1.0.4 hunk ./source/kde/crystal/FrugalBuild 8 -depends=('kdebase>=3.5.6') +depends=('kdebase>=3.5.7') hunk ./source/kde/crystal/FrugalBuild 14 -sha1sums=('59ee62c8ccc507bdacf337e828e70dba0cd826ee') +sha1sums=('9df074ca5cae8a5a92a156d9d6b5970d57572b13') } From vmiklos at frugalware.org Sun Jun 3 20:22:00 2007 From: vmiklos at frugalware.org (VMiklos) Date: Sun Jun 3 20:22:06 2007 Subject: [Frugalware-darcs] frugalware-current: ash-0.4.0-5-i686 Message-ID: <20070603182201.2E24C1768138@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070603150758-e2957-6bc5dec56c3bec19307c5c7c3ad8cd72389b7f51.gz; [ash-0.4.0-5-i686 VMiklos **20070603150758 moved ash-0.4.0.diff to ftp ] { hunk ./source/apps/ash/FrugalBuild 6 -pkgrel=4 +pkgrel=5 hunk ./source/apps/ash/FrugalBuild 12 -up2date="lynx -dump http://slackware.at/data/slackware-current/source/ap/ash/|grep ash-[0-9\.]*tar\.gz$|sed -n -e 's/.*h-\(.*\)\.tar\.gz$/\1/' -e '1 p'" +up2date="lynx -dump ftp://ftp.slackware.com/pub/slackware/slackware-current/source/ap/ash|Flasttar" hunk ./source/apps/ash/FrugalBuild 14 - $pkgname-$pkgver.diff $pkgname-$pkgver-gcc4.diff) + http://ftp.frugalware.org/pub/other/sources/ash/$pkgname-$pkgver.diff.bz2 \ + $pkgname-$pkgver-gcc4.diff) hunk ./source/apps/ash/FrugalBuild 17 - '66c9637ab925043279e7e270b13b353ff8350b8b' \ + '964d796a695a2053107593c1c7b44acee6c36d6d' \ hunk ./source/apps/ash/ash-0.4.0.diff 1 -Author: VMiklos -Author: Tushar Teredesai -Description: This is a collection of patches from Debian, Slackware, LFS, etc. -(don't you love Open Source:-) along with a minor bison related fix -from me (Tushar). Additionally I removed debian specific stuff. -diff -Nur ash-0.4.0.orig/Makefile ash-0.4.0.fixed/Makefile ---- ash-0.4.0.orig/Makefile 2001-01-12 10:50:34.000000000 -0600 -+++ ash-0.4.0.fixed/Makefile 2003-10-01 21:08:15.000000000 -0500 -@@ -7,56 +7,69 @@ - SHSRCS= alias.c cd.c echo.c error.c eval.c exec.c expand.c \ - histedit.c input.c jobs.c mail.c main.c memalloc.c miscbltin.c \ - mystring.c options.c parser.c redir.c show.c trap.c output.c var.c \ -- test.c --GENSRCS=arith.c arith.h arith_lex.c builtins.c builtins.h init.c nodes.c \ -- nodes.h syntax.c syntax.h token.h -+ test.c setmode.c test.c hetio.c -+GENSRCS=builtins.c builtins.h init.c nodes.c arith.c arith.h lex.yy.c \ -+ nodes.h syntax.c syntax.h token.h signames.c - SRCS= ${SHSRCS} ${GENSRCS} - --LDADD+= -ll -ledit -ltermcap --DPADD+= ${LIBL} ${LIBEDIT} ${LIBTERMCAP} -+OBJS=alias.o cd.o bltin/echo.o error.o eval.o exec.o expand.o \ -+ histedit.o input.o jobs.o mail.o main.o memalloc.o miscbltin.o \ -+ mystring.o options.o output.o parser.o redir.o show.o \ -+ trap.o var.o bltin/test.o signames.o \ -+ builtins.o init.o nodes.o syntax.o arith.o lex.yy.o \ -+ setmode.o bltin/times.o hetio.o -+ -+OPT_FLAGS= -+LDFLAGS= -+CFLAGS+=-DSHELL -I. -DNO_HISTORY -DBSD=1 -DSMALL -D_GNU_SOURCE \ -+ -DGLOB_BROKEN -D__COPYRIGHT\(x\)= -D__RCSID\(x\)= -D_DIAGASSERT\(x\)= \ -+ -DHETIO -+ -+all: $(PROG) -+ -+$(PROG): build-tools $(GENSRCS) $(GENHDRS) $(OBJS) -+ $(CC) $(LDFLAGS) -o $(PROG) $(OBJS) $(LDLIBS) -lfl -+ -+lex.yy.c: arith_lex.l -+ flex -8 $< -+ -+CLEANFILES+= mkinit mkinit.o mknodes mknodes.o \ -+ mksyntax mksyntax.o -+ -+CLEANFILES+= ${GENSRCS} ${GENHDRS} -+ -+build-tools: mkinit mknodes mksyntax -+ -+.ORDER: builtins.c builtins.h -+builtins.c builtins.h: mkbuiltins builtins.def -+ sh mkbuiltins shell.h builtins.def `pwd` -+ -+INIT_DEPS = alias.c eval.c exec.c input.c jobs.c options.c parser.c \ -+ redir.c trap.c var.c output.c -+ -+init.c: mkinit $(INIT_DEPS) -+ ./mkinit $(INIT_DEPS) -+ -+mkinit: mkinit.o -+mknodes: mknodes.o -+mksyntax: mksyntax.o - --LFLAGS= -8 # 8-bit lex scanner for arithmetic --YFLAGS= -d -- --CPPFLAGS+=-DSHELL -I. -I${.CURDIR} -- --.PATH: ${.CURDIR}/bltin ${.CURDIR}/../../usr.bin/printf ${.CURDIR}/../test -- --CLEANFILES+= mkinit mknodes mksyntax --CLEANFILES+= ${GENSRCS} y.tab.h -- --token.h: mktokens -- sh ${.ALLSRC} -- --builtins.c builtins.h: mkbuiltins shell.h builtins.def -- sh ${.ALLSRC} ${.OBJDIR} -- --init.c: mkinit ${SHSRCS} -- ./${.ALLSRC} -+signames.c: mksignames -+ ./mksignames - - nodes.c nodes.h: mknodes nodetypes nodes.c.pat -- ./${.ALLSRC} -+ ./mknodes ./nodetypes ./nodes.c.pat - - syntax.c syntax.h: mksyntax -- ./${.ALLSRC} -- --mkinit: mkinit.c -- ${HOST_LINK.c} -o mkinit ${.IMPSRC} -- --mknodes: mknodes.c -- ${HOST_LINK.c} -o mknodes ${.IMPSRC} -+ ./mksyntax - --.if (${MACHINE_ARCH} == "powerpc") || \ -- (${MACHINE_ARCH} == "arm32") || \ -- (${MACHINE_ARCH} == "arm26") --TARGET_CHARFLAG= -DTARGET_CHAR="u_int8_t" --.else --TARGET_CHARFLAG= -DTARGET_CHAR="int8_t" --.endif -+arith.c arith.h: arith.y -+ yacc -d arith.y -+ mv y.tab.h arith.h -+ mv y.tab.c arith.c - --mksyntax: mksyntax.c -- ${HOST_LINK.c} ${TARGET_CHARFLAG} -o mksyntax ${.IMPSRC} -- --.include -+token.h: mktokens -+ sh ./mktokens - --${OBJS}: builtins.h nodes.h syntax.h token.h -+clean: -+ rm -f $(PROG) $(OBJS) $(CLEANFILES) core -diff -Nur ash-0.4.0.orig/arith.y ash-0.4.0.fixed/arith.y ---- ash-0.4.0.orig/arith.y 1999-07-09 06:02:05.000000000 -0500 -+++ ash-0.4.0.fixed/arith.y 2003-10-02 00:53:57.000000000 -0500 -@@ -150,43 +150,43 @@ - %left ARITH_UNARYMINUS ARITH_UNARYPLUS ARITH_NOT ARITH_BNOT - %% - --exp: expr = { -+exp: expr { - return ($1); - } - ; - - --expr: ARITH_LPAREN expr ARITH_RPAREN = { $$ = $2; } -- | expr ARITH_OR expr = { $$ = $1 ? $1 : $3 ? $3 : 0; } -- | expr ARITH_AND expr = { $$ = $1 ? ( $3 ? $3 : 0 ) : 0; } -- | expr ARITH_BOR expr = { $$ = $1 | $3; } -- | expr ARITH_BXOR expr = { $$ = $1 ^ $3; } -- | expr ARITH_BAND expr = { $$ = $1 & $3; } -- | expr ARITH_EQ expr = { $$ = $1 == $3; } -- | expr ARITH_GT expr = { $$ = $1 > $3; } -- | expr ARITH_GE expr = { $$ = $1 >= $3; } -- | expr ARITH_LT expr = { $$ = $1 < $3; } -- | expr ARITH_LE expr = { $$ = $1 <= $3; } -- | expr ARITH_NE expr = { $$ = $1 != $3; } -- | expr ARITH_LSHIFT expr = { $$ = $1 << $3; } -- | expr ARITH_RSHIFT expr = { $$ = $1 >> $3; } -- | expr ARITH_ADD expr = { $$ = $1 + $3; } -- | expr ARITH_SUB expr = { $$ = $1 - $3; } -- | expr ARITH_MUL expr = { $$ = $1 * $3; } -- | expr ARITH_DIV expr = { -+expr: ARITH_LPAREN expr ARITH_RPAREN { $$ = $2; } -+ | expr ARITH_OR expr { $$ = $1 ? $1 : $3 ? $3 : 0; } -+ | expr ARITH_AND expr { $$ = $1 ? ( $3 ? $3 : 0 ) : 0; } -+ | expr ARITH_BOR expr { $$ = $1 | $3; } -+ | expr ARITH_BXOR expr { $$ = $1 ^ $3; } -+ | expr ARITH_BAND expr { $$ = $1 & $3; } -+ | expr ARITH_EQ expr { $$ = $1 == $3; } -+ | expr ARITH_GT expr { $$ = $1 > $3; } -+ | expr ARITH_GE expr { $$ = $1 >= $3; } -+ | expr ARITH_LT expr { $$ = $1 < $3; } -+ | expr ARITH_LE expr { $$ = $1 <= $3; } -+ | expr ARITH_NE expr { $$ = $1 != $3; } -+ | expr ARITH_LSHIFT expr { $$ = $1 << $3; } -+ | expr ARITH_RSHIFT expr { $$ = $1 >> $3; } -+ | expr ARITH_ADD expr { $$ = $1 + $3; } -+ | expr ARITH_SUB expr { $$ = $1 - $3; } -+ | expr ARITH_MUL expr { $$ = $1 * $3; } -+ | expr ARITH_DIV expr { - if ($3 == 0) - yyerror("division by zero"); - $$ = $1 / $3; - } -- | expr ARITH_REM expr = { -+ | expr ARITH_REM expr { - if ($3 == 0) - yyerror("division by zero"); - $$ = $1 % $3; - } -- | ARITH_NOT expr = { $$ = !($2); } -- | ARITH_BNOT expr = { $$ = ~($2); } -- | ARITH_SUB expr %prec ARITH_UNARYMINUS = { $$ = -($2); } -- | ARITH_ADD expr %prec ARITH_UNARYPLUS = { $$ = $2; } -+ | ARITH_NOT expr { $$ = !($2); } -+ | ARITH_BNOT expr { $$ = ~($2); } -+ | ARITH_SUB expr %prec ARITH_UNARYMINUS { $$ = -($2); } -+ | ARITH_ADD expr %prec ARITH_UNARYPLUS { $$ = $2; } - | ARITH_NUM - ; - %% -@@ -195,7 +195,6 @@ - const char *s; - { - -- yyerrok; - yyclearin; - arith_lex_reset(); /* reprime lex */ - error("arithmetic expression: %s: \"%s\"", s, arith_startbuf); -diff -Nur ash-0.4.0.orig/bltin/bltin.h ash-0.4.0.fixed/bltin/bltin.h ---- ash-0.4.0.orig/bltin/bltin.h 1997-07-05 06:12:37.000000000 -0500 -+++ ash-0.4.0.fixed/bltin/bltin.h 2003-10-01 21:08:15.000000000 -0500 -@@ -46,8 +46,10 @@ - - #include "../shell.h" - #include "../mystring.h" -+#include "../memalloc.h" - #ifdef SHELL - #include "../output.h" -+#ifndef _GNU_SOURCE - #define stdout out1 - #define stderr out2 - #define printf out1fmt -@@ -56,12 +58,13 @@ - #define fprintf outfmt - #define fputs outstr - #define fflush flushout --#define INITARGS(argv) - #define warnx(a, b, c) { \ - char buf[64]; \ - (void)snprintf(buf, sizeof(buf), a, b, c); \ - error("%s", buf); \ - } -+#endif -+#define INITARGS(argv) - - #else - #undef NULL -diff -Nur ash-0.4.0.orig/bltin/echo.c ash-0.4.0.fixed/bltin/echo.c ---- ash-0.4.0.orig/bltin/echo.c 1996-11-03 06:06:22.000000000 -0600 -+++ ash-0.4.0.fixed/bltin/echo.c 2003-10-01 21:08:15.000000000 -0500 -@@ -44,7 +44,13 @@ - - #define main echocmd - -+#ifdef _GNU_SOURCE -+#include -+ -+#include "../mystring.h" -+#else - #include "bltin.h" -+#endif - - /* #define eflag 1 */ - -@@ -53,7 +59,6 @@ - register char **ap; - register char *p; - register char c; -- int count; - int nflag = 0; - #ifndef eflag - int eflag = 0; -@@ -62,34 +67,42 @@ - ap = argv; - if (argc) - ap++; -- if ((p = *ap) != NULL) { -+ while ((p = *ap) != NULL && *p == '-') { - if (equal(p, "-n")) { -- nflag++; -- ap++; -+ nflag = 1; - } else if (equal(p, "-e")) { - #ifndef eflag -- eflag++; -+ eflag = 1; -+#endif -+ } else if (equal(p, "-E")) { -+#ifndef eflag -+ eflag = 0; - #endif -- ap++; - } -+ else break; -+ ap++; - } - while ((p = *ap++) != NULL) { - while ((c = *p++) != '\0') { - if (c == '\\' && eflag) { -- switch (*p++) { -+ switch (c = *p++) { -+ case 'a': c = '\007'; break; - case 'b': c = '\b'; break; - case 'c': return 0; /* exit */ -+ case 'e': c = '\033'; break; - case 'f': c = '\f'; break; - case 'n': c = '\n'; break; - case 'r': c = '\r'; break; - case 't': c = '\t'; break; - case 'v': c = '\v'; break; - case '\\': break; /* c = '\\' */ -- case '0': -- c = 0; -- count = 3; -- while (--count >= 0 && (unsigned)(*p - '0') < 8) -- c = (c << 3) + (*p++ - '0'); -+ case '0': case '1': case '2': case '3': -+ case '4': case '5': case '6': case '7': -+ c -= '0'; -+ if (*p >= '0' && *p <= '7') -+ c = c * 8 + (*p++ - '0'); -+ if (*p >= '0' && *p <= '7') -+ c = c * 8 + (*p++ - '0'); - break; - default: - p--; -@@ -103,5 +116,12 @@ - } - if (! nflag) - putchar('\n'); -+#ifdef _GNU_SOURCE -+ fflush(stdout); -+ if (ferror(stdout)) { -+ clearerr(stdout); -+ return 1; -+ } -+#endif - return 0; - } -diff -Nur ash-0.4.0.orig/bltin/test.c ash-0.4.0.fixed/bltin/test.c ---- ash-0.4.0.orig/bltin/test.c 1969-12-31 18:00:00.000000000 -0600 -+++ ash-0.4.0.fixed/bltin/test.c 2003-10-01 21:08:15.000000000 -0500 -@@ -0,0 +1,583 @@ -+/* $NetBSD: test.c,v 1.22 2000/04/09 23:24:59 christos Exp $ */ -+ -+/* -+ * test(1); version 7-like -- author Erik Baalbergen -+ * modified by Eric Gisin to be used as built-in. -+ * modified by Arnold Robbins to add SVR3 compatibility -+ * (-x -c -b -p -u -g -k) plus Korn's -L -nt -ot -ef and new -S (socket). -+ * modified by J.T. Conklin for NetBSD. -+ * -+ * This program is in the Public Domain. -+ */ -+ -+#include -+#ifndef lint -+__RCSID("$NetBSD: test.c,v 1.22 2000/04/09 23:24:59 christos Exp $"); -+#endif -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#ifdef __STDC__ -+#include -+#else -+#include -+#endif -+ -+/* test(1) accepts the following grammar: -+ oexpr ::= aexpr | aexpr "-o" oexpr ; -+ aexpr ::= nexpr | nexpr "-a" aexpr ; -+ nexpr ::= primary | "!" primary -+ primary ::= unary-operator operand -+ | operand binary-operator operand -+ | operand -+ | "(" oexpr ")" -+ ; -+ unary-operator ::= "-r"|"-w"|"-x"|"-f"|"-d"|"-c"|"-b"|"-p"| -+ "-u"|"-g"|"-k"|"-s"|"-t"|"-z"|"-n"|"-o"|"-O"|"-G"|"-L"|"-S"; -+ -+ binary-operator ::= "="|"!="|"-eq"|"-ne"|"-ge"|"-gt"|"-le"|"-lt"| -+ "-nt"|"-ot"|"-ef"; -+ operand ::= -+*/ -+ -+enum token { -+ EOI, -+ FILRD, -+ FILWR, -+ FILEX, -+ FILEXIST, -+ FILREG, -+ FILDIR, -+ FILCDEV, -+ FILBDEV, -+ FILFIFO, -+ FILSOCK, -+ FILSYM, -+ FILGZ, -+ FILTT, -+ FILSUID, -+ FILSGID, -+ FILSTCK, -+ FILNT, -+ FILOT, -+ FILEQ, -+ FILUID, -+ FILGID, -+ STREZ, -+ STRNZ, -+ STREQ, -+ STRNE, -+ STRLT, -+ STRGT, -+ INTEQ, -+ INTNE, -+ INTGE, -+ INTGT, -+ INTLE, -+ INTLT, -+ UNOT, -+ BAND, -+ BOR, -+ LPAREN, -+ RPAREN, -+ OPERAND -+}; -+ -+enum token_types { -+ UNOP, -+ BINOP, -+ BUNOP, -+ BBINOP, -+ PAREN -+}; -+ -+static struct t_op { -+ const char *op_text; -+ short op_num, op_type; -+} const ops [] = { -+ {"-r", FILRD, UNOP}, -+ {"-w", FILWR, UNOP}, -+ {"-x", FILEX, UNOP}, -+ {"-e", FILEXIST,UNOP}, -+ {"-f", FILREG, UNOP}, -+ {"-d", FILDIR, UNOP}, -+ {"-c", FILCDEV,UNOP}, -+ {"-b", FILBDEV,UNOP}, -+ {"-p", FILFIFO,UNOP}, -+ {"-u", FILSUID,UNOP}, -+ {"-g", FILSGID,UNOP}, -+ {"-k", FILSTCK,UNOP}, -+ {"-s", FILGZ, UNOP}, -+ {"-t", FILTT, UNOP}, -+ {"-z", STREZ, UNOP}, -+ {"-n", STRNZ, UNOP}, -+ {"-h", FILSYM, UNOP}, /* for backwards compat */ -+ {"-O", FILUID, UNOP}, -+ {"-G", FILGID, UNOP}, -+ {"-L", FILSYM, UNOP}, -+ {"-S", FILSOCK,UNOP}, -+ {"=", STREQ, BINOP}, -+ {"!=", STRNE, BINOP}, -+ {"<", STRLT, BINOP}, -+ {">", STRGT, BINOP}, -+ {"-eq", INTEQ, BINOP}, -+ {"-ne", INTNE, BINOP}, -+ {"-ge", INTGE, BINOP}, -+ {"-gt", INTGT, BINOP}, -+ {"-le", INTLE, BINOP}, -+ {"-lt", INTLT, BINOP}, -+ {"-nt", FILNT, BINOP}, -+ {"-ot", FILOT, BINOP}, -+ {"-ef", FILEQ, BINOP}, -+ {"!", UNOT, BUNOP}, -+ {"-a", BAND, BBINOP}, -+ {"-o", BOR, BBINOP}, -+ {"(", LPAREN, PAREN}, -+ {")", RPAREN, PAREN}, -+ {0, 0, 0} -+}; -+ -+static char **t_wp; -+static struct t_op const *t_wp_op; -+static gid_t *group_array = NULL; -+static int ngroups; -+ -+static void syntax __P((const char *, const char *)); -+static int oexpr __P((enum token)); -+static int aexpr __P((enum token)); -+static int nexpr __P((enum token)); -+static int primary __P((enum token)); -+static int binop __P((void)); -+static int filstat __P((char *, enum token)); -+static enum token t_lex __P((char *)); -+static int isoperand __P((void)); -+static int getn __P((const char *)); -+static int newerf __P((const char *, const char *)); -+static int olderf __P((const char *, const char *)); -+static int equalf __P((const char *, const char *)); -+static int test_eaccess(); -+static int bash_group_member(); -+static void initialize_group_array(); -+ -+#if defined(SHELL) -+extern void error __P((const char *, ...)) __attribute__((__noreturn__)); -+#else -+static void error __P((const char *, ...)) __attribute__((__noreturn__)); -+ -+static void -+#ifdef __STDC__ -+error(const char *msg, ...) -+#else -+error(va_alist) -+ va_dcl -+#endif -+{ -+ va_list ap; -+#ifndef __STDC__ -+ const char *msg; -+ -+ va_start(ap); -+ msg = va_arg(ap, const char *); -+#else -+ va_start(ap, msg); -+#endif -+ verrx(2, msg, ap); -+ /*NOTREACHED*/ -+ va_end(ap); -+} -+#endif -+ -+#ifdef SHELL -+int testcmd __P((int, char **)); -+ -+int -+testcmd(argc, argv) -+ int argc; -+ char **argv; -+#else -+int main __P((int, char **)); -+ -+int -+main(argc, argv) -+ int argc; -+ char **argv; -+#endif -+{ -+ int res; -+ -+ -+ if (strcmp(argv[0], "[") == 0) { -+ if (strcmp(argv[--argc], "]")) -+ error("missing ]"); -+ argv[argc] = NULL; -+ } -+ -+ if (argc < 2) -+ return 1; -+ -+ t_wp = &argv[1]; -+ res = !oexpr(t_lex(*t_wp)); -+ -+ if (*t_wp != NULL && *++t_wp != NULL) -+ syntax(*t_wp, "unexpected operator"); -+ -+ return res; -+} -+ -+static void -+syntax(op, msg) -+ const char *op; -+ const char *msg; -+{ -+ if (op && *op) -+ error("%s: %s", op, msg); -+ else -+ error("%s", msg); -+} -+ -+static int -+oexpr(n) -+ enum token n; -+{ -+ int res; -+ -+ res = aexpr(n); -+ if (t_lex(*++t_wp) == BOR) -+ return oexpr(t_lex(*++t_wp)) || res; -+ t_wp--; -+ return res; -+} -+ -+static int -+aexpr(n) -+ enum token n; -+{ -+ int res; -+ -+ res = nexpr(n); -+ if (t_lex(*++t_wp) == BAND) -+ return aexpr(t_lex(*++t_wp)) && res; -+ t_wp--; -+ return res; -+} -+ -+static int -+nexpr(n) -+ enum token n; /* token */ -+{ -+ if (n == UNOT) -+ return !nexpr(t_lex(*++t_wp)); -+ return primary(n); -+} -+ -+static int -+primary(n) -+ enum token n; -+{ -+ enum token nn; -+ int res; -+ -+ if (n == EOI) -+ return 0; /* missing expression */ -+ if (n == LPAREN) { -+ if ((nn = t_lex(*++t_wp)) == RPAREN) -+ return 0; /* missing expression */ -+ res = oexpr(nn); -+ if (t_lex(*++t_wp) != RPAREN) -+ syntax(NULL, "closing paren expected"); -+ return res; -+ } -+ if (t_wp_op && t_wp_op->op_type == UNOP) { -+ /* unary expression */ -+ if (*++t_wp == NULL) -+ syntax(t_wp_op->op_text, "argument expected"); -+ switch (n) { -+ case STREZ: -+ return strlen(*t_wp) == 0; -+ case STRNZ: -+ return strlen(*t_wp) != 0; -+ case FILTT: -+ return isatty(getn(*t_wp)); -+ default: -+ return filstat(*t_wp, n); -+ } -+ } -+ -+ if (t_lex(t_wp[1]), t_wp_op && t_wp_op->op_type == BINOP) { -+ return binop(); -+ } -+ -+ return strlen(*t_wp) > 0; -+} -+ -+static int -+binop() -+{ -+ const char *opnd1, *opnd2; -+ struct t_op const *op; -+ -+ opnd1 = *t_wp; -+ (void) t_lex(*++t_wp); -+ op = t_wp_op; -+ -+ if ((opnd2 = *++t_wp) == (char *)0) -+ syntax(op->op_text, "argument expected"); -+ -+ switch (op->op_num) { -+ case STREQ: -+ return strcmp(opnd1, opnd2) == 0; -+ case STRNE: -+ return strcmp(opnd1, opnd2) != 0; -+ case STRLT: -+ return strcmp(opnd1, opnd2) < 0; -+ case STRGT: -+ return strcmp(opnd1, opnd2) > 0; -+ case INTEQ: -+ return getn(opnd1) == getn(opnd2); -+ case INTNE: -+ return getn(opnd1) != getn(opnd2); -+ case INTGE: -+ return getn(opnd1) >= getn(opnd2); -+ case INTGT: -+ return getn(opnd1) > getn(opnd2); -+ case INTLE: -+ return getn(opnd1) <= getn(opnd2); -+ case INTLT: -+ return getn(opnd1) < getn(opnd2); -+ case FILNT: -+ return newerf (opnd1, opnd2); -+ case FILOT: -+ return olderf (opnd1, opnd2); -+ case FILEQ: -+ return equalf (opnd1, opnd2); -+ default: -+ abort(); -+ /* NOTREACHED */ -+ } -+} -+ -+static int -+filstat(nm, mode) -+ char *nm; -+ enum token mode; -+{ -+ struct stat s; -+ -+ if (mode == FILSYM ? lstat(nm, &s) : stat(nm, &s)) -+ return 0; -+ -+ switch (mode) { -+ case FILRD: -+ return test_eaccess(nm, R_OK) == 0; -+ case FILWR: -+ return test_eaccess(nm, W_OK) == 0; -+ case FILEX: -+ return test_eaccess(nm, X_OK) == 0; -+ case FILEXIST: -+ return 1; -+ case FILREG: -+ return S_ISREG(s.st_mode); -+ case FILDIR: -+ return S_ISDIR(s.st_mode); -+ case FILCDEV: -+ return S_ISCHR(s.st_mode); -+ case FILBDEV: -+ return S_ISBLK(s.st_mode); -+ case FILFIFO: -+ return S_ISFIFO(s.st_mode); -+ case FILSOCK: -+ return S_ISSOCK(s.st_mode); -+ case FILSYM: -+ return S_ISLNK(s.st_mode); -+ case FILSUID: -+ return (s.st_mode & S_ISUID) != 0; -+ case FILSGID: -+ return (s.st_mode & S_ISGID) != 0; -+ case FILSTCK: -+ return (s.st_mode & S_ISVTX) != 0; -+ case FILGZ: -+ return s.st_size > (off_t)0; -+ case FILUID: -+ return s.st_uid == geteuid(); -+ case FILGID: -+ return s.st_gid == getegid(); -+ default: -+ return 1; -+ } -+} -+ -+static enum token -+t_lex(s) -+ char *s; -+{ -+ struct t_op const *op = ops; -+ -+ if (s == 0) { -+ t_wp_op = (struct t_op *)0; -+ return EOI; -+ } -+ while (op->op_text) { -+ if (strcmp(s, op->op_text) == 0) { -+ if ((op->op_type == UNOP && isoperand()) || -+ (op->op_num == LPAREN && *(t_wp+1) == 0)) -+ break; -+ t_wp_op = op; -+ return op->op_num; -+ } -+ op++; -+ } -+ t_wp_op = (struct t_op *)0; -+ return OPERAND; -+} -+ -+static int -+isoperand() -+{ -+ struct t_op const *op = ops; -+ char *s; -+ char *t; -+ -+ if ((s = *(t_wp+1)) == 0) -+ return 1; -+ if ((t = *(t_wp+2)) == 0) -+ return 0; -+ while (op->op_text) { -+ if (strcmp(s, op->op_text) == 0) -+ return op->op_type == BINOP && -+ (t[0] != ')' || t[1] != '\0'); -+ op++; -+ } -+ return 0; -+} -+ -+/* atoi with error detection */ -+static int -+getn(s) -+ const char *s; -+{ -+ char *p; -+ long r; -+ -+ errno = 0; -+ r = strtol(s, &p, 10); -+ -+ if (errno != 0) -+ error("%s: out of range", s); -+ -+ while (isspace((unsigned char)*p)) -+ p++; -+ -+ if (*p) -+ error("%s: bad number", s); -+ -+ return (int) r; -+} -+ -+static int -+newerf (f1, f2) -+const char *f1, *f2; -+{ -+ struct stat b1, b2; -+ -+ return (stat (f1, &b1) == 0 && -+ stat (f2, &b2) == 0 && -+ b1.st_mtime > b2.st_mtime); -+} -+ -+static int -+olderf (f1, f2) -+const char *f1, *f2; -+{ -+ struct stat b1, b2; -+ -+ return (stat (f1, &b1) == 0 && -+ stat (f2, &b2) == 0 && -+ b1.st_mtime < b2.st_mtime); -+} -+ -+static int -+equalf (f1, f2) -+const char *f1, *f2; -+{ -+ struct stat b1, b2; -+ -+ return (stat (f1, &b1) == 0 && -+ stat (f2, &b2) == 0 && -+ b1.st_dev == b2.st_dev && -+ b1.st_ino == b2.st_ino); -+} -+ -+/* Do the same thing access(2) does, but use the effective uid and gid, -+ and don't make the mistake of telling root that any file is -+ executable. */ -+static int -+test_eaccess (path, mode) -+char *path; -+int mode; -+{ -+ struct stat st; -+ int euid = geteuid(); -+ -+ if (stat (path, &st) < 0) -+ return (-1); -+ -+ if (euid == 0) { -+ /* Root can read or write any file. */ -+ if (mode != X_OK) -+ return (0); -+ -+ /* Root can execute any file that has any one of the execute -+ bits set. */ -+ if (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)) -+ return (0); -+ } -+ -+ if (st.st_uid == euid) /* owner */ -+ mode <<= 6; -+ else if (bash_group_member (st.st_gid)) -+ mode <<= 3; -+ -+ if (st.st_mode & mode) -+ return (0); -+ -+ return (-1); -+} -+ -+static void -+initialize_group_array () -+{ -+ ngroups = getgroups(0, NULL); -+ group_array = malloc(ngroups * sizeof(gid_t)); -+ if (!group_array) -+ error(strerror(ENOMEM)); -+ getgroups(ngroups, group_array); -+} -+ -+/* Return non-zero if GID is one that we have in our groups list. */ -+static int -+bash_group_member (gid) -+gid_t gid; -+{ -+ register int i; -+ -+ /* Short-circuit if possible, maybe saving a call to getgroups(). */ -+ if (gid == getgid() || gid == getegid()) -+ return (1); -+ -+ if (ngroups == 0) -+ initialize_group_array (); -+ -+ /* Search through the list looking for GID. */ -+ for (i = 0; i < ngroups; i++) -+ if (gid == group_array[i]) -+ return (1); -+ -+ return (0); -+} -diff -Nur ash-0.4.0.orig/bltin/times.c ash-0.4.0.fixed/bltin/times.c ---- ash-0.4.0.orig/bltin/times.c 1969-12-31 18:00:00.000000000 -0600 -+++ ash-0.4.0.fixed/bltin/times.c 2003-10-01 21:08:15.000000000 -0500 -@@ -0,0 +1,30 @@ -+#ifdef _GNU_SOURCE -+/* -+ * Copyright (c) 1999 Herbert Xu -+ * This file contains code for the times builtin. -+ * $Id: ash-0.4.0-cumulative_fixes-1.patch,v 1.1 2004/06/04 10:32:01 jim Exp $ -+ */ -+ -+#include -+#include -+#include -+ -+#define main timescmd -+ -+int main() { -+ struct tms buf; -+ long int clk_tck = sysconf(_SC_CLK_TCK); -+ -+ times(&buf); -+ printf("%dm%fs %dm%fs\n%dm%fs %dm%fs\n", -+ (int) (buf.tms_utime / clk_tck / 60), -+ ((double) buf.tms_utime) / clk_tck, -+ (int) (buf.tms_stime / clk_tck / 60), -+ ((double) buf.tms_stime) / clk_tck, -+ (int) (buf.tms_cutime / clk_tck / 60), -+ ((double) buf.tms_cutime) / clk_tck, -+ (int) (buf.tms_cstime / clk_tck / 60), -+ ((double) buf.tms_cstime) / clk_tck); -+ return 0; -+} -+#endif /* _GNU_SOURCE */ -diff -Nur ash-0.4.0.orig/builtins.def ash-0.4.0.fixed/builtins.def ---- ash-0.4.0.orig/builtins.def 2000-04-10 06:02:58.000000000 -0500 -+++ ash-0.4.0.fixed/builtins.def 2003-10-01 21:08:15.000000000 -0500 -@@ -49,12 +49,13 @@ - # - # NOTE: bltincmd must come first! - --bltincmd command -+bltincmd builtin - #alloccmd alloc - bgcmd -j bg - breakcmd break continue - #catfcmd catf - cdcmd cd chdir -+commandcmd command - dotcmd . - echocmd echo - evalcmd eval -@@ -70,6 +71,7 @@ - hashcmd hash - jobidcmd jobid - jobscmd jobs -+killcmd -j kill - #linecmd line - localcmd local - #nlechocmd nlecho -@@ -91,3 +93,4 @@ - aliascmd alias - ulimitcmd ulimit - testcmd test [ -+timescmd times -diff -Nur ash-0.4.0.orig/cd.c ash-0.4.0.fixed/cd.c ---- ash-0.4.0.orig/cd.c 1999-07-09 06:02:05.000000000 -0500 -+++ ash-0.4.0.fixed/cd.c 2003-10-01 21:08:15.000000000 -0500 -@@ -244,6 +244,7 @@ - curdir = NULL; - getpwd(); - setvar("PWD", curdir, VEXPORT|VTEXTFIXED); -+ setvar("OLDPWD", prevdir, VEXPORT|VTEXTFIXED); - INTON; - return; - } -@@ -275,6 +276,7 @@ - prevdir = curdir; - curdir = savestr(stackblock()); - setvar("PWD", curdir, VEXPORT|VTEXTFIXED); -+ setvar("OLDPWD", prevdir, VEXPORT|VTEXTFIXED); - INTON; - } - -@@ -319,7 +321,7 @@ - * c implementation of getcwd, that does not open a pipe to - * /bin/pwd. - */ --#if defined(__NetBSD__) || defined(__SVR4) -+#if defined(__NetBSD__) || defined(__SVR4) || defined(__GLIBC__) - - if (getcwd(buf, sizeof(buf)) == NULL) { - char *pwd = getenv("PWD"); -diff -Nur ash-0.4.0.orig/error.c ash-0.4.0.fixed/error.c ---- ash-0.4.0.orig/error.c 2001-01-12 10:50:35.000000000 -0600 -+++ ash-0.4.0.fixed/error.c 2003-10-01 21:08:15.000000000 -0500 -@@ -233,6 +233,7 @@ - { ENOTDIR, E_CREAT,"directory nonexistent" }, - { ENOTDIR, E_EXEC, "not found" }, - { EISDIR, ALL, "is a directory" }, -+ { EEXIST, E_CREAT,"file exists" }, - #ifdef notdef - { EMFILE, ALL, "too many open files" }, - #endif -diff -Nur ash-0.4.0.orig/error.h ash-0.4.0.fixed/error.h ---- ash-0.4.0.orig/error.h 1999-07-09 06:02:05.000000000 -0500 -+++ ash-0.4.0.fixed/error.h 2003-10-01 21:08:15.000000000 -0500 -@@ -102,7 +102,7 @@ - * so we use _setjmp instead. - */ - --#if defined(BSD) && !defined(__SVR4) -+#if defined(BSD) && !defined(__SVR4) && !defined(__GLIBC__) - #define setjmp(jmploc) _setjmp(jmploc) - #define longjmp(jmploc, val) _longjmp(jmploc, val) - #endif -diff -Nur ash-0.4.0.orig/eval.c ash-0.4.0.fixed/eval.c ---- ash-0.4.0.orig/eval.c 2000-05-23 05:03:18.000000000 -0500 -+++ ash-0.4.0.fixed/eval.c 2003-10-01 21:08:15.000000000 -0500 -@@ -45,7 +45,9 @@ - #endif - #endif /* not lint */ - -+#include - #include -+#include - #include - - /* -@@ -101,6 +103,8 @@ - STATIC void evalpipe __P((union node *)); - STATIC void evalcommand __P((union node *, int, struct backcmd *)); - STATIC void prehash __P((union node *)); -+STATIC int is_assignment_builtin __P((const char *)); -+STATIC const char *get_standard_path __P((void)); - - - /* -@@ -257,6 +261,11 @@ - evalcase(n, flags); - break; - case NDEFUN: -+ if (is_special_builtin(n->narg.text)) { -+ outfmt(out2, "%s is a special built-in\n", n->narg.text); -+ exitstatus = 1; -+ break; -+ } - defun(n->narg.text, n->narg.next); - exitstatus = 0; - break; -@@ -442,6 +451,7 @@ - case NFROM: - case NTO: - case NAPPEND: -+ case NTOOV: - expandarg(redir->nfile.fname, &fn, EXP_TILDE | EXP_REDIR); - redir->nfile.expfname = fn.list->text; - break; -@@ -497,9 +507,14 @@ - close(0); - copyfd(prevfd, 0); - close(prevfd); -+ if (pip[0] == 0) { -+ pip[0] = -1; -+ } - } - if (pip[1] >= 0) { -- close(pip[0]); -+ if (pip[0] >= 0) { -+ close(pip[0]); -+ } - if (pip[1] != 1) { - close(1); - copyfd(pip[1], 1); -@@ -607,6 +622,7 @@ - int argc; - char **envp; - int varflag; -+ int pseudovarflag; - struct strlist *sp; - int mode; - int pip[2]; -@@ -619,12 +635,17 @@ - struct localvar *volatile savelocalvars; - volatile int e; - char *lastarg; -+ int not_special; -+ const char *path; -+ const char *standard_path; - #if __GNUC__ - /* Avoid longjmp clobbering */ - (void) &argv; - (void) &argc; - (void) &lastarg; - (void) &flags; -+ (void) ¬_special; -+ (void) &standard_path; - #endif - - /* First expand the arguments. */ -@@ -632,21 +653,31 @@ - setstackmark(&smark); - arglist.lastp = &arglist.list; - varlist.lastp = &varlist.list; -+ arglist.list = 0; - varflag = 1; -+ pseudovarflag = 0; - oexitstatus = exitstatus; - exitstatus = 0; -+ not_special = 0; -+ path = pathval(); -+ standard_path = NULL; - for (argp = cmd->ncmd.args ; argp ; argp = argp->narg.next) { - char *p = argp->narg.text; -- if (varflag && is_name(*p)) { -+ if ((varflag || pseudovarflag) && is_name(*p)) { - do { - p++; - } while (is_in_name(*p)); - if (*p == '=') { -- expandarg(argp, &varlist, EXP_VARTILDE); -+ if (varflag) -+ expandarg(argp, &varlist, EXP_VARTILDE); -+ else -+ expandarg(argp, &arglist, EXP_VARTILDE); - continue; - } - } - expandarg(argp, &arglist, EXP_FULL | EXP_TILDE); -+ if (varflag && arglist.list && is_assignment_builtin(arglist.list->text)) -+ pseudovarflag = 1; - varflag = 0; - } - *arglist.lastp = NULL; -@@ -688,37 +719,75 @@ - cmdentry.u.index = BLTINCMD; - } else { - static const char PATH[] = "PATH="; -- const char *path = pathval(); -+ const char *oldpath = NULL; -+ int findflag = DO_ERR; - - /* - * Modify the command lookup path, if a PATH= assignment - * is present - */ - for (sp = varlist.list ; sp ; sp = sp->next) -- if (strncmp(sp->text, PATH, sizeof(PATH) - 1) == 0) -+ if (strncmp(sp->text, PATH, sizeof(PATH) - 1) == 0) { - path = sp->text + sizeof(PATH) - 1; -- -- find_command(argv[0], &cmdentry, DO_ERR, path); -- if (cmdentry.cmdtype == CMDUNKNOWN) { /* command not found */ -- exitstatus = 127; -- flushout(&errout); -- return; -- } -- /* implement the bltin builtin here */ -- if (cmdentry.cmdtype == CMDBUILTIN && cmdentry.u.index == BLTINCMD) { -- for (;;) { -+ findflag |= DO_BRUTE; -+ } -+ for(;;) { -+ find_command(argv[0], &cmdentry, findflag, path); -+ if (oldpath) { -+ path = oldpath; -+ oldpath = NULL; -+ } -+ if (cmdentry.cmdtype == CMDUNKNOWN) { /* command not found */ -+ exitstatus = 127; -+ flushout(&errout); -+ goto out; -+ } -+ /* implement the bltin builtin here */ -+ if (cmdentry.cmdtype == CMDBUILTIN && cmdentry.u.index == BLTINCMD) { -+ not_special = 1; -+ for(;;) { -+ argv++; -+ if (--argc == 0) -+ break; -+ if ((cmdentry.u.index = find_builtin(*argv)) < 0) { -+ outfmt(&errout, "%s: not found\n", *argv); -+ exitstatus = 127; -+ flushout(&errout); -+ goto out; -+ } -+ if (cmdentry.u.index != BLTINCMD) -+ break; -+ } -+ } -+ if (cmdentry.cmdtype == CMDBUILTIN && cmdentry.u.index == COMMANDCMD) { -+ not_special = 1; - argv++; -- if (--argc == 0) -- break; -- if ((cmdentry.u.index = find_builtin(*argv)) < 0) { -- outfmt(&errout, "%s: not found\n", *argv); -- exitstatus = 127; -- flushout(&errout); -- return; -+ if (--argc == 0) { -+ exitstatus = 0; -+ goto out; - } -- if (cmdentry.u.index != BLTINCMD) -- break; -+ if (*argv[0] == '-') { -+ if (!equal(argv[0], "-p")) { -+ argv--; -+ argc++; -+ break; -+ } -+ argv++; -+ if (--argc == 0) { -+ exitstatus = 0; -+ goto out; -+ } -+ if (!standard_path) { -+ standard_path = get_standard_path(); -+ } -+ oldpath = path; -+ path = standard_path; -+ findflag |= DO_BRUTE; -+ } -+ findflag |= DO_NOFUN; -+ continue; - } -+ break; - } - } - -@@ -756,13 +825,12 @@ - #ifdef DEBUG - trputs("Shell function: "); trargs(argv); - #endif -+ exitstatus = oexitstatus; - redirect(cmd->ncmd.redirect, REDIR_PUSH); - saveparam = shellparam; - shellparam.malloc = 0; -- shellparam.reset = 1; - shellparam.nparam = argc - 1; - shellparam.p = argv + 1; -- shellparam.optnext = NULL; - INTOFF; - savelocalvars = localvars; - localvars = NULL; -@@ -772,6 +840,8 @@ - freeparam((volatile struct shparam *) - &saveparam); - } else { -+ saveparam.optind = shellparam.optind; -+ saveparam.optoff = shellparam.optoff; - freeparam(&shellparam); - shellparam = saveparam; - } -@@ -790,6 +860,8 @@ - INTOFF; - poplocalvars(); - localvars = savelocalvars; -+ saveparam.optind = shellparam.optind; -+ saveparam.optoff = shellparam.optoff; - freeparam(&shellparam); - shellparam = saveparam; - handler = savehandler; -@@ -807,9 +879,13 @@ - #endif - mode = (cmdentry.u.index == EXECCMD)? 0 : REDIR_PUSH; - if (flags == EV_BACKCMD) { -+#if defined(_GNU_SOURCE) && !defined(__UCLIBC__) -+ openmemout(); -+#else - memout.nleft = 0; - memout.nextc = memout.buf; - memout.bufsize = 64; -+#endif - mode |= REDIR_BACKQ; - } - redirect(cmd->ncmd.redirect, mode); -@@ -832,6 +908,8 @@ - out1 = &output; - out2 = &errout; - freestdout(); -+ if (!not_special && is_special_builtin(commandname)) -+ listsetvar(cmdenviron); - cmdenviron = NULL; - if (e != EXSHELLPROC) { - commandname = savecmdname; -@@ -854,10 +932,18 @@ - if (cmdentry.u.index != EXECCMD) - popredir(); - if (flags == EV_BACKCMD) { -+#if defined(_GNU_SOURCE) && !defined(__UCLIBC__) -+ closememout(); -+#endif - backcmd->buf = memout.buf; -+#if defined(_GNU_SOURCE) && !defined(__UCLIBC__) -+ backcmd->nleft = memout.bufsize; -+#else - backcmd->nleft = memout.nextc - memout.buf; -+#endif - memout.buf = NULL; - } -+ cmdenviron = NULL; - } else { - #ifdef DEBUG - trputs("normal command: "); trargs(argv); -@@ -867,7 +953,7 @@ - for (sp = varlist.list ; sp ; sp = sp->next) - setvareq(sp->text, VEXPORT|VSTACK); - envp = environment(); -- shellexec(argv, envp, pathval(), cmdentry.u.index); -+ shellexec(argv, envp, path, cmdentry.u.index); - } - goto out; - -@@ -1026,3 +1112,48 @@ - } - return 0; - } -+ -+STATIC int -+is_assignment_builtin (command) -+ const char *command; -+{ -+ static const char *assignment_builtins[] = { -+ "alias", "declare", "export", "local", "readonly", "typeset", -+ (char *)NULL -+ }; -+ int i; -+ -+ for (i = 0; assignment_builtins[i]; i++) -+ if (strcmp(command, assignment_builtins[i]) == 0) return 1; -+ return 0; -+} -+ -+int -+is_special_builtin(name) -+ const char *name; -+{ -+ static const char *special_builtins[] = { -+ "break", ":", ".", "continue", "eval", "exec", "exit", -+ "export", "readonly", "return", "set", "shift", "times", -+ "trap", "unset", (char *)NULL -+ }; -+ int i; -+ -+ if (!name) return 0; -+ for (i = 0; special_builtins[i]; i++) -+ if (equal(name, special_builtins[i])) return 1; -+ return 0; -+} -+ -+STATIC const char * -+get_standard_path() -+{ -+ char *p; -+ size_t len; -+ -+ len = confstr(_CS_PATH, NULL, 0); -+ p = stalloc(len + 2); -+ *p = '\0'; -+ confstr(_CS_PATH, p, len); -+ return p; -+} -diff -Nur ash-0.4.0.orig/eval.h ash-0.4.0.fixed/eval.h ---- ash-0.4.0.orig/eval.h 2000-01-28 06:03:00.000000000 -0600 -+++ ash-0.4.0.fixed/eval.h 2003-10-01 21:08:15.000000000 -0500 -@@ -61,6 +61,7 @@ - int falsecmd __P((int, char **)); - int truecmd __P((int, char **)); - int execcmd __P((int, char **)); -+int is_special_builtin __P((const char *)); - - /* in_function returns nonzero if we are currently evaluating a function */ - #define in_function() funcnest -diff -Nur ash-0.4.0.orig/exec.c ash-0.4.0.fixed/exec.c ---- ash-0.4.0.orig/exec.c 2001-01-12 10:50:35.000000000 -0600 -+++ ash-0.4.0.fixed/exec.c 2003-10-01 21:08:15.000000000 -0500 -@@ -51,6 +51,7 @@ - #include - #include - #include -+#include - - /* - * When commands are first encountered, they are entered in a hash table. -@@ -108,6 +109,9 @@ - STATIC void clearcmdentry __P((int)); - STATIC struct tblentry *cmdlookup __P((char *, int)); - STATIC void delete_cmd_entry __P((void)); -+STATIC int describe_command __P((char *, int)); -+STATIC int path_change __P((const char *, int *)); -+STATIC int is_regular_builtin __P((const char *)); - - - -@@ -125,6 +129,10 @@ - char *cmdname; - int e; - -+ if (fd2 >= 0 && fd2 != 2) { -+ close(fd2); -+ } -+ - if (strchr(argv[0], '/') != NULL) { - tryexec(argv[0], argv, envp); - e = errno; -@@ -164,7 +172,7 @@ - char **envp; - { - int e; --#ifndef BSD -+#if !defined(BSD) && !defined(linux) - char *p; - #endif - -@@ -180,7 +188,7 @@ - initshellproc(); - setinputfile(cmd, 0); - commandname = arg0 = savestr(argv[0]); --#ifndef BSD -+#if !defined(BSD) && !defined(linux) - pgetc(); pungetc(); /* fill up input buffer */ - p = parsenextc; - if (parsenleft > 2 && p[0] == '#' && p[1] == '!') { -@@ -195,7 +203,7 @@ - } - - --#ifndef BSD -+#if !defined(BSD) && !defined(linux) - /* - * Execute an interpreter introduced by "#!", for systems where this - * feature has not been built into the kernel. If the interpreter is -@@ -351,27 +359,29 @@ - if (*argptr == NULL) { - for (pp = cmdtable ; pp < &cmdtable[CMDTABLESIZE] ; pp++) { - for (cmdp = *pp ; cmdp ; cmdp = cmdp->next) { -- printentry(cmdp, verbose); -+ if (cmdp->cmdtype != CMDBUILTIN) { -+ printentry(cmdp, verbose); -+ } - } - } - return 0; - } -+ c = 0; - while ((name = *argptr) != NULL) { - if ((cmdp = cmdlookup(name, 0)) != NULL - && (cmdp->cmdtype == CMDNORMAL - || (cmdp->cmdtype == CMDBUILTIN && builtinloc >= 0))) - delete_cmd_entry(); - find_command(name, &entry, DO_ERR, pathval()); -- if (verbose) { -- if (entry.cmdtype != CMDUNKNOWN) { /* if no error msg */ -- cmdp = cmdlookup(name, 0); -- printentry(cmdp, verbose); -- } -+ if (entry.cmdtype == CMDUNKNOWN) c = 1; -+ else if (verbose) { -+ cmdp = cmdlookup(name, 0); -+ if (cmdp) printentry(cmdp, verbose); - flushall(); - } - argptr++; - } -- return 0; -+ return c; - } - - -@@ -435,6 +445,10 @@ - struct stat statb; - int e; - int i; -+ int bltin; -+ int firstchange; -+ int updatetbl; -+ int regular; - - /* If name contains a slash, don't use the hash table */ - if (strchr(name, '/') != NULL) { -@@ -459,12 +473,54 @@ - return; - } - -+ updatetbl = 1; -+ if (act & DO_BRUTE) { -+ firstchange = path_change(path, &bltin); -+ } else { -+ bltin = builtinloc; -+ firstchange = 9999; -+ } -+ - /* If name is in the table, and not invalidated by cd, we're done */ -- if ((cmdp = cmdlookup(name, 0)) != NULL && cmdp->rehash == 0) -- goto success; -+ if ((cmdp = cmdlookup(name, 0)) != NULL && cmdp->rehash == 0) { -+ if (cmdp->cmdtype == CMDFUNCTION) { -+ if (act & DO_NOFUN) { -+ updatetbl = 0; -+ } else { -+ goto success; -+ } -+ } else if (act & DO_BRUTE) { -+ if ((cmdp->cmdtype == CMDNORMAL && -+ cmdp->param.index >= firstchange) || -+ (cmdp->cmdtype == CMDBUILTIN && -+ ((builtinloc < 0 && bltin >= 0) ? -+ bltin : builtinloc) >= firstchange)) { -+ /* need to recompute the entry */ -+ } else { -+ goto success; -+ } -+ } else { -+ goto success; -+ } -+ } -+ -+ if ((regular = is_regular_builtin(name))) { -+ if (cmdp && (cmdp->cmdtype == CMDBUILTIN)) { -+ goto success; -+ } -+ } else if (act & DO_BRUTE) { -+ if (firstchange == 0) { -+ updatetbl = 0; -+ } -+ } - - /* If %builtin not in path, check for builtin next */ -- if (builtinloc < 0 && (i = find_builtin(name)) >= 0) { -+ if ((bltin < 0 || regular) && (i = find_builtin(name)) >= 0) { -+ if (!updatetbl) { -+ entry->cmdtype = CMDBUILTIN; -+ entry->u.index = i; -+ return; -+ } - INTOFF; - cmdp = cmdlookup(name, 1); - cmdp->cmdtype = CMDBUILTIN; -@@ -475,7 +531,7 @@ - - /* We have to search path. */ - prev = -1; /* where to start */ -- if (cmdp) { /* doing a rehash */ -+ if (cmdp && cmdp->rehash) { /* doing a rehash */ - if (cmdp->cmdtype == CMDBUILTIN) - prev = builtinloc; - else -@@ -488,26 +544,38 @@ - while ((fullname = padvance(&path, name)) != NULL) { - stunalloc(fullname); - idx++; -+ if (idx >= firstchange) { -+ updatetbl = 0; -+ } - if (pathopt) { - if (prefix("builtin", pathopt)) { -- if ((i = find_builtin(name)) < 0) -- goto loop; -- INTOFF; -- cmdp = cmdlookup(name, 1); -- cmdp->cmdtype = CMDBUILTIN; -- cmdp->param.index = i; -- INTON; -- goto success; -- } else if (prefix("func", pathopt)) { -+ if ((i = find_builtin(name)) >= 0) { -+ if (!updatetbl) { -+ entry->cmdtype = CMDBUILTIN; -+ entry->u.index = i; -+ return; -+ } -+ INTOFF; -+ cmdp = cmdlookup(name, 1); -+ cmdp->cmdtype = CMDBUILTIN; -+ cmdp->param.index = i; -+ INTON; -+ goto success; -+ } else { -+ continue; -+ } -+ } else if (!(act & DO_NOFUN) && -+ prefix("func", pathopt)) { - /* handled below */ - } else { -- goto loop; /* ignore unimplemented options */ -+ continue; /* ignore unimplemented options */ - } - } - /* if rehash, don't redo absolute path names */ -- if (fullname[0] == '/' && idx <= prev) { -+ if (fullname[0] == '/' && idx <= prev && -+ idx < firstchange) { - if (idx < prev) -- goto loop; -+ continue; - TRACE(("searchexec \"%s\": no change\n", name)); - goto success; - } -@@ -522,7 +590,7 @@ - } - e = EACCES; /* if we fail, this will be the error */ - if (!S_ISREG(statb.st_mode)) -- goto loop; -+ continue; - if (pathopt) { /* this is a %func directory */ - stalloc(strlen(fullname) + 1); - readcmdfile(fullname); -@@ -544,6 +612,13 @@ - } - #endif - TRACE(("searchexec \"%s\" returns \"%s\"\n", name, fullname)); -+ /* If we aren't called with DO_BRUTE and cmdp is set, it must -+ be a function and we're being called with DO_NOFUN */ -+ if (!updatetbl) { -+ entry->cmdtype = CMDNORMAL; -+ entry->u.index = idx; -+ return; -+ } - INTOFF; - cmdp = cmdlookup(name, 1); - cmdp->cmdtype = CMDNORMAL; -@@ -553,7 +628,7 @@ - } - - /* We failed. If there was an entry for this command, delete it */ -- if (cmdp) -+ if (cmdp && updatetbl) - delete_cmd_entry(); - if (act & DO_ERR) - outfmt(out2, "%s: %s\n", name, errmsg(e, E_EXEC)); -@@ -618,37 +693,12 @@ - changepath(newval) - const char *newval; - { -- const char *old, *new; -- int idx; - int firstchange; - int bltin; - -- old = pathval(); -- new = newval; -- firstchange = 9999; /* assume no change */ -- idx = 0; -- bltin = -1; -- for (;;) { -- if (*old != *new) { -- firstchange = idx; -- if ((*old == '\0' && *new == ':') -- || (*old == ':' && *new == '\0')) -- firstchange++; -- old = new; /* ignore subsequent differences */ -- } -- if (*new == '\0') -- break; -- if (*new == '%' && bltin < 0 && prefix("builtin", new + 1)) -- bltin = idx; -- if (*new == ':') { -- idx++; -- } -- new++, old++; -- } -+ firstchange = path_change(newval, &bltin); - if (builtinloc < 0 && bltin >= 0) - builtinloc = bltin; /* zap builtins */ -- if (builtinloc >= 0 && bltin < 0) -- firstchange = 0; - clearcmdentry(firstchange); - builtinloc = bltin; - } -@@ -838,11 +888,9 @@ - { - struct cmdentry entry; - -- INTOFF; - entry.cmdtype = CMDFUNCTION; - entry.u.func = copyfunc(func); - addcmdentry(name, &entry); -- INTON; - } - - -@@ -945,3 +993,189 @@ - } - return err; - } -+ -+STATIC int -+describe_command(command, verbose) -+ char *command; -+ int verbose; -+{ -+ struct cmdentry entry; -+ struct tblentry *cmdp; -+ char **pp; -+ struct alias *ap; -+ extern char *const parsekwd[]; -+ -+ for (pp = (char **)parsekwd; *pp; pp++) -+ if (**pp == *command && equal(*pp, command)) -+ break; -+ -+ if (*pp) { -+ if (verbose) { -+ out1fmt("%s is a reserved word\n", command); -+ } else { -+ out1fmt("%s\n", command); -+ } -+ return 0; -+ } -+ -+ /* Then look at the aliases */ -+ if ((ap = lookupalias(command, 1)) != NULL) { -+ if (verbose) { -+ out1fmt("%s is aliased to `%s'\n", command, ap->val); -+ } else { -+ out1fmt("alias %s='%s'\n", command, ap->val); -+ } -+ return 0; -+ } -+ -+ /* Then check if it is a tracked alias */ -+ if ((cmdp = cmdlookup(command, 0)) != NULL) { -+ entry.cmdtype = cmdp->cmdtype; -+ entry.u = cmdp->param; -+ } -+ else { -+ /* Finally use brute force */ -+ find_command(command, &entry, DO_ABS, pathval()); -+ } -+ -+ switch (entry.cmdtype) { -+ case CMDNORMAL: { -+ int j = entry.u.index; -+ const char *path = pathval(); -+ char *name; -+ if (j == -1) -+ name = command; -+ else { -+ do { -+ name = padvance(&path, command); -+ stunalloc(name); -+ } while (--j >= 0); -+ } -+ if (verbose) { -+ out1fmt("%s is %s\n", command, name); -+ } else { -+ out1fmt("%s\n", name); -+ } -+ break; -+ } -+ case CMDFUNCTION: -+ if (verbose) { -+ out1fmt("%s is a function\n", command); -+ } else { -+ out1fmt("%s\n", command); -+ } -+ break; -+ case CMDBUILTIN: -+ if (verbose) { -+ if (is_special_builtin(command)) { -+ out1fmt("%s is a special built-in utility\n", command); -+ } else { -+ out1fmt("%s is a built-in utility\n", command); -+ } -+ } else { -+ out1fmt("%s\n", command); -+ } -+ break; -+ default: -+ outfmt(out2, "%s not found\n", command); -+ return 127; -+ } -+ -+ return 0; -+} -+ -+int -+commandcmd(argc, argv) -+ int argc; -+ char **argv; -+{ -+ int c; -+ int default_path = 0; -+ int verify_only = 0; -+ int verbose_verify_only = 0; -+ -+ while ((c = nextopt("pvV")) != '\0') -+ switch (c) { -+ case 'p': -+ default_path = 1; -+ break; -+ case 'v': -+ verify_only = 1; -+ break; -+ case 'V': -+ verbose_verify_only = 1; -+ break; -+ default: -+ outfmt(out2, -+"command: nextopt returned character code 0%o\n", c); -+ return EX_SOFTWARE; -+ } -+ -+ if (default_path + verify_only + verbose_verify_only > 1 || -+ !*argptr) { -+ outfmt(out2, -+"command [-p] command [arg ...]\n"); -+ outfmt(out2, -+"command {-v|-V} command\n"); -+ return EX_USAGE; -+ } -+ -+ if (verify_only || verbose_verify_only) { -+ return describe_command(*argptr, verbose_verify_only); -+ } -+ -+ return 0; -+} -+ -+STATIC int -+path_change(newval, bltin) -+ const char *newval; -+ int *bltin; -+{ -+ const char *old, *new; -+ int idx; -+ int firstchange; -+ -+ old = pathval(); -+ new = newval; -+ firstchange = 9999; /* assume no change */ -+ idx = 0; -+ *bltin = -1; -+ for (;;) { -+ if (*old != *new) { -+ firstchange = idx; -+ if ((*old == '\0' && *new == ':') -+ || (*old == ':' && *new == '\0')) -+ firstchange++; -+ old = new; /* ignore subsequent differences */ -+ } -+ if (*new == '\0') -+ break; -+ if (*new == '%' && *bltin < 0 && prefix("builtin", new + 1)) -+ *bltin = idx; -+ if (*new == ':') { -+ idx++; -+ } -+ new++, old++; -+ } -+ if (builtinloc >= 0 && *bltin < 0) -+ firstchange = 0; -+ return firstchange; -+} -+ -+STATIC int -+is_regular_builtin(name) -+ const char *name; -+{ -+ static const char *regular_builtins[] = { -+ "alias", "bg", "cd", "command", "false", "fc", "fg", -+ "getopts", "jobs", "kill", "newgrp", "read", "true", -+ "umask", "unalias", "wait", (char *)NULL -+ }; -+ int i; -+ -+ if (!name) return 0; -+ for (i = 0; regular_builtins[i]; i++) -+ if (equal(name, regular_builtins[i])) return 1; -+ return 0; -+} -diff -Nur ash-0.4.0.orig/exec.h ash-0.4.0.fixed/exec.h ---- ash-0.4.0.orig/exec.h 2000-05-23 05:03:19.000000000 -0500 -+++ ash-0.4.0.fixed/exec.h 2003-10-01 21:08:15.000000000 -0500 -@@ -56,6 +56,8 @@ - - #define DO_ERR 1 /* find_command prints errors */ - #define DO_ABS 2 /* find_command checks absolute paths */ -+#define DO_NOFUN 4 /* find_command ignores functions */ -+#define DO_BRUTE 8 /* find_command ignores hash table */ - - extern const char *pathopt; /* set by padvance */ - extern int exerrno; /* last exec error */ -@@ -74,3 +76,4 @@ - void defun __P((char *, union node *)); - int unsetfunc __P((char *)); - int typecmd __P((int, char **)); -+int commandcmd __P((int, char **)); -diff -Nur ash-0.4.0.orig/expand.c ash-0.4.0.fixed/expand.c ---- ash-0.4.0.orig/expand.c 2000-03-14 06:03:45.000000000 -0600 -+++ ash-0.4.0.fixed/expand.c 2003-10-01 21:08:15.000000000 -0500 -@@ -54,6 +54,10 @@ - #include - #include - #include -+#if defined(__GLIBC__) && !defined(GLOB_BROKEN) -+#include -+#include -+#endif - - /* - * Routines to expand arguments to commands. We have to deal with -@@ -102,17 +106,30 @@ - STATIC int subevalvar __P((char *, char *, int, int, int, int)); - STATIC char *evalvar __P((char *, int)); - STATIC int varisset __P((char *, int)); -+STATIC char *strtodest __P((char *, int, int)); - STATIC void varvalue __P((char *, int, int)); - STATIC void recordregion __P((int, int, int)); - STATIC void removerecordregions __P((int)); - STATIC void ifsbreakup __P((char *, struct arglist *)); - STATIC void ifsfree __P((void)); - STATIC void expandmeta __P((struct strlist *, int)); -+#if defined(__GLIBC__) && !defined(GLOB_BROKEN) -+STATIC const char *preglob __P((const char *)); -+STATIC void addglob __P((const glob_t *)); -+#else - STATIC void expmeta __P((char *, char *)); -+#endif - STATIC void addfname __P((char *)); -+#if defined(__GLIBC__) && !defined(GLOB_BROKEN) -+STATIC int patmatch __P((char *, char *, int)); -+STATIC int patmatch2 __P((char *, char *, int)); -+STATIC char * _rmescapes __P((char *, int)); -+#else - STATIC struct strlist *expsort __P((struct strlist *)); - STATIC struct strlist *msort __P((struct strlist *, int)); - STATIC int pmatch __P((char *, char *, int)); -+#define patmatch2 patmatch -+#endif - STATIC char *cvtnum __P((int, char *)); - - /* -@@ -371,7 +388,7 @@ - * have to rescan starting from the beginning since CTLESC - * characters have to be processed left to right. - */ -- CHECKSTRSPACE(8, expdest); -+ CHECKSTRSPACE(10, expdest); - USTPUTC('\0', expdest); - start = stackblock(); - p = expdest - 1; -@@ -393,7 +410,7 @@ - if (quotes) - rmescapes(p+2); - result = arith(p+2); -- fmtstr(p, 10, "%d", result); -+ fmtstr(p, 12, "%d", result); - - while (*p++) - ; -@@ -503,7 +520,7 @@ - int amount; - - herefd = -1; -- argstr(p, 0); -+ argstr(p, subtype != VSASSIGN && subtype != VSQUESTION ? EXP_CASE : 0); - STACKSTRNUL(expdest); - herefd = saveherefd; - argbackq = saveargbackq; -@@ -535,7 +552,7 @@ - for (loc = startp; loc < str; loc++) { - c = *loc; - *loc = '\0'; -- if (patmatch(str, startp, varflags & VSQUOTE)) -+ if (patmatch2(str, startp, varflags & VSQUOTE)) - goto recordleft; - *loc = c; - if ((varflags & VSQUOTE) && *loc == CTLESC) -@@ -547,7 +564,7 @@ - for (loc = str - 1; loc >= startp;) { - c = *loc; - *loc = '\0'; -- if (patmatch(str, startp, varflags & VSQUOTE)) -+ if (patmatch2(str, startp, varflags & VSQUOTE)) - goto recordleft; - *loc = c; - loc--; -@@ -564,7 +581,7 @@ - - case VSTRIMRIGHT: - for (loc = str - 1; loc >= startp;) { -- if (patmatch(str, loc, varflags & VSQUOTE)) -+ if (patmatch2(str, loc, varflags & VSQUOTE)) - goto recordright; - loc--; - if ((varflags & VSQUOTE) && loc > startp && -@@ -580,7 +597,7 @@ - - case VSTRIMRIGHTMAX: - for (loc = startp; loc < str - 1; loc++) { -- if (patmatch(str, loc, varflags & VSQUOTE)) -+ if (patmatch2(str, loc, varflags & VSQUOTE)) - goto recordright; - if ((varflags & VSQUOTE) && *loc == CTLESC) - loc++; -@@ -819,6 +836,34 @@ - - - /* -+ * Put a string on the stack. -+ */ -+ -+STATIC char * -+strtodest(p, quoted, allow_split) -+ char *p; -+ int quoted; -+ int allow_split; -+{ -+ char const *syntax; -+ -+ if (allow_split) { -+ syntax = quoted ? DQSYNTAX : BASESYNTAX; -+ while (*p) { -+ if (syntax[(int) *p] == CCTL) -+ STPUTC(CTLESC, expdest); -+ STPUTC(*p++, expdest); -+ } -+ } else -+ while (*p) -+ STPUTC(*p++, expdest); -+ -+ return p; -+} -+ -+ -+ -+/* - * Add the value of a specialized variable to the stack string. - */ - -@@ -834,22 +879,6 @@ - extern int oexitstatus; - char sep; - char **ap; -- char const *syntax; -- --#define STRTODEST(p) \ -- do {\ -- if (allow_split) { \ -- syntax = quoted? DQSYNTAX : BASESYNTAX; \ -- while (*p) { \ -- if (syntax[(int)*p] == CCTL) \ -- STPUTC(CTLESC, expdest); \ -- STPUTC(*p++, expdest); \ -- } \ -- } else \ -- while (*p) \ -- STPUTC(*p++, expdest); \ -- } while (0) -- - - switch (*name) { - case '$': -@@ -875,7 +904,7 @@ - case '@': - if (allow_split && quoted) { - for (ap = shellparam.p ; (p = *ap++) != NULL ; ) { -- STRTODEST(p); -+ p = strtodest(p, quoted, allow_split); - if (*ap) - STPUTC('\0', expdest); - } -@@ -888,21 +917,20 @@ - else - sep = ' '; - for (ap = shellparam.p ; (p = *ap++) != NULL ; ) { -- STRTODEST(p); -+ p = strtodest(p, quoted, allow_split); - if (*ap && sep) - STPUTC(sep, expdest); - } - break; - case '0': -- p = arg0; -- STRTODEST(p); -+ p = strtodest(arg0, quoted, allow_split); - break; - default: - if (is_digit(*name)) { - num = atoi(name); - if (num > 0 && num <= shellparam.nparam) { -- p = shellparam.p[num - 1]; -- STRTODEST(p); -+ p = strtodest(shellparam.p[num - 1], quoted, -+ allow_split); - } - } - break; -@@ -1054,6 +1082,98 @@ - * should be escapes. The results are stored in the list exparg. - */ - -+#if defined(__GLIBC__) && !defined(GLOB_BROKEN) -+STATIC void -+expandmeta(str, flag) -+ struct strlist *str; -+ int flag; -+{ -+ const char *p; -+ glob_t pglob; -+ /* TODO - EXP_REDIR */ -+ -+ while (str) { -+ if (fflag) -+ goto nometa; -+ p = preglob(str->text); -+ INTOFF; -+ switch (glob(p, GLOB_NOMAGIC, 0, &pglob)) { -+ case 0: -+ if (!(pglob.gl_flags & GLOB_MAGCHAR)) -+ goto nometa2; -+ addglob(&pglob); -+ globfree(&pglob); -+ INTON; -+ break; -+ case GLOB_NOMATCH: -+nometa2: -+ globfree(&pglob); -+ INTON; -+nometa: -+ *exparg.lastp = str; -+ rmescapes(str->text); -+ exparg.lastp = &str->next; -+ break; -+ default: /* GLOB_NOSPACE */ -+ error("Out of space"); -+ } -+ str = str->next; -+ } -+} -+ -+ -+/* -+ * Prepare the string for glob(3). -+ */ -+ -+STATIC const char * -+preglob(str) -+ const char *str; -+{ -+ const char *p; -+ char *q, *r; -+ size_t len; -+ -+ p = str; -+ while (*p != CTLQUOTEMARK && *p != CTLESC) { -+ if (*p++ == '\0') -+ return str; -+ } -+ len = p - str; -+ q = r = stalloc(strlen(str) + 1); -+ if (len > 0) { -+ memcpy(q, str, len); -+ q += len; -+ } -+ do { -+ if (*p == CTLQUOTEMARK) -+ continue; -+ if (*p == CTLESC) { -+ if (*++p != '/') -+ *q++ = '\\'; -+ } -+ *q++ = *p; -+ } while (*++p); -+ *q = '\0'; -+ return r; -+} -+ -+ -+/* -+ * Add the result of glob(3) to the list. -+ */ -+ -+STATIC void -+addglob(pglob) -+ const glob_t *pglob; -+{ -+ char **p = pglob->gl_pathv; -+ -+ do { -+ addfname(*p); -+ } while (*++p); -+} -+#else - char *expdir; - - -@@ -1238,6 +1358,7 @@ - if (! atend) - endname[-1] = '/'; - } -+#endif - - - /* -@@ -1260,6 +1381,7 @@ - } - - -+#if !(defined(__GLIBC__) && !defined(GLOB_BROKEN)) - /* - * Sort the results of file name expansion. It calculates the number of - * strings to sort and then calls msort (short for merge sort) to do the -@@ -1321,6 +1443,7 @@ - } - return list; - } -+#endif - - - -@@ -1328,6 +1451,39 @@ - * Returns true if the pattern matches the string. - */ - -+#if defined(__GLIBC__) && !defined(GLOB_BROKEN) -+STATIC int -+patmatch(pattern, string, squoted) -+ char *pattern; -+ char *string; -+ int squoted; /* string might have quote chars */ -+ { -+ const char *p; -+ char *q; -+ -+ p = preglob(pattern); -+ q = squoted ? _rmescapes(string, 1) : string; -+ -+ return !fnmatch(p, q, 0); -+} -+ -+ -+STATIC int -+patmatch2(pattern, string, squoted) -+ char *pattern; -+ char *string; -+ int squoted; /* string might have quote chars */ -+ { -+ char *p; -+ int res; -+ -+ sstrnleft--; -+ p = grabstackstr(expdest); -+ res = patmatch(pattern, string, squoted); -+ ungrabstackstr(p, expdest); -+ return res; -+} -+#else - int - patmatch(pattern, string, squoted) - char *pattern; -@@ -1462,6 +1618,7 @@ - return 0; - return 1; - } -+#endif - - - -@@ -1469,6 +1626,50 @@ - * Remove any CTLESC characters from a string. - */ - -+#if defined(__GLIBC__) && !defined(GLOB_BROKEN) -+void -+rmescapes(str) -+ char *str; -+{ -+ _rmescapes(str, 0); -+} -+ -+ -+STATIC char * -+_rmescapes(str, flag) -+ char *str; -+ int flag; -+{ -+ char *p, *q, *r; -+ -+ p = str; -+ while (*p != CTLESC && *p != CTLQUOTEMARK) { -+ if (*p++ == '\0') -+ return str; -+ } -+ q = p; -+ r = str; -+ if (flag) { -+ size_t len = p - str; -+ q = r = stalloc(strlen(p) + len + 1); -+ if (len > 0) { -+ memcpy(q, str, len); -+ q += len; -+ } -+ } -+ while (*p) { -+ if (*p == CTLQUOTEMARK) { -+ p++; -+ continue; -+ } -+ if (*p == CTLESC) -+ p++; -+ *q++ = *p++; -+ } -+ *q = '\0'; -+ return r; -+} -+#else - void - rmescapes(str) - char *str; -@@ -1492,6 +1693,7 @@ - } - *q = '\0'; - } -+#endif - - - -diff -Nur ash-0.4.0.orig/expand.h ash-0.4.0.fixed/expand.h ---- ash-0.4.0.orig/expand.h 1999-07-09 06:02:06.000000000 -0500 -+++ ash-0.4.0.fixed/expand.h 2003-10-01 21:08:15.000000000 -0500 -@@ -64,7 +64,9 @@ - void expandhere __P((union node *, int)); - void expandarg __P((union node *, struct arglist *, int)); - void expari __P((int)); -+#if !(defined(__GLIBC__) && !defined(GLOB_BROKEN)) - int patmatch __P((char *, char *, int)); -+#endif - void rmescapes __P((char *)); - int casematch __P((union node *, char *)); - -diff -Nur ash-0.4.0.orig/hetio.c ash-0.4.0.fixed/hetio.c ---- ash-0.4.0.orig/hetio.c 1969-12-31 18:00:00.000000000 -0600 -+++ ash-0.4.0.fixed/hetio.c 2003-10-01 21:08:15.000000000 -0500 -@@ -0,0 +1,377 @@ -+/* -+ * Termios command line History and Editting for NetBSD sh (ash) -+ * Copyright (c) 1999 -+ * Main code: Adam Rogoyski -+ * Etc: Dave Cinege -+ * -+ * You may use this code as you wish, so long as the original author(s) -+ * are attributed in any redistributions of the source code. -+ * This code is 'as is' with no warranty. -+ * This code may safely be consumed by a BSD or GPL license. -+ * -+ * v 0.5 19990328 Initial release -+ * -+ * Future plans: Simple file and path name completion. (like BASH) -+ * -+ */ -+ -+/* -+Usage and Known bugs: -+ Terminal key codes are not extensive, and more will probably -+ need to be added. This version was created on Debian GNU/Linux 2.x. -+ Delete, Backspace, Home, End, and the arrow keys were tested -+ to work in an Xterm and console. Ctrl-A also works as Home. -+ Ctrl-E also works as End. The binary size increase is <3K. -+ -+ Editting will not display correctly for lines greater then the -+ terminal width. (more then one line.) However, history will. -+*/ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#include "input.h" -+#include "output.h" -+ -+#ifdef HETIO -+ -+#include "hetio.h" -+ -+ -+#define MAX_HISTORY 15 /* Maximum length of the linked list for the command line history */ -+ -+#define ESC 27 -+#define DEL 127 -+ -+static struct history *his_front = NULL; /* First element in command line list */ -+static struct history *his_end = NULL; /* Last element in command line list */ -+static struct termios old_term, new_term; /* Current termio and the previous termio before starting ash */ -+ -+static int history_counter = 0; /* Number of commands in history list */ -+static int reset_term = 0; /* Set to true if the terminal needs to be reset upon exit */ -+static int hetio_inter = 0; -+ -+struct history -+{ -+ char *s; -+ struct history *p; -+ struct history *n; -+}; -+ -+ -+void input_delete (int); -+void input_home (int *); -+void input_end (int *, int); -+void input_backspace (int *, int *); -+ -+ -+ -+void hetio_init(void) -+{ -+ hetio_inter = 1; -+} -+ -+ -+void hetio_reset_term(void) -+{ -+ if (reset_term) -+ tcsetattr(1, TCSANOW, &old_term); -+} -+ -+ -+void setIO(struct termios *new, struct termios *old) /* Set terminal IO to canonical mode, and save old term settings. */ -+{ -+ tcgetattr(0, old); -+ memcpy(new, old, sizeof(*new)); -+ new->c_cc[VMIN] = 1; -+ new->c_cc[VTIME] = 0; -+ new->c_lflag &= ~ICANON; /* unbuffered input */ -+ new->c_lflag &= ~ECHO; -+ tcsetattr(0, TCSANOW, new); -+} -+ -+void input_home(int *cursor) /* Command line input routines */ -+{ -+ while (*cursor > 0) { -+ out1c('\b'); -+ --*cursor; -+ } -+ flushout(&output); -+} -+ -+ -+void input_delete(int cursor) -+{ -+ int j = 0; -+ -+ memmove(parsenextc + cursor, parsenextc + cursor + 1, -+ BUFSIZ - cursor - 1); -+ for (j = cursor; j < (BUFSIZ - 1); j++) { -+ if (!*(parsenextc + j)) -+ break; -+ else -+ out1c(*(parsenextc + j)); -+ } -+ -+ out1str(" \b"); -+ -+ while (j-- > cursor) -+ out1c('\b'); -+ flushout(&output); -+} -+ -+ -+void input_end(int *cursor, int len) -+{ -+ while (*cursor < len) { -+ out1str("\033[C"); -+ ++*cursor; -+ } -+ flushout(&output); -+} -+ -+ -+void -+input_backspace(int *cursor, int *len) -+{ -+ int j = 0; -+ -+ if (*cursor > 0) { -+ out1str("\b \b"); -+ --*cursor; -+ memmove(parsenextc + *cursor, parsenextc + *cursor + 1, -+ BUFSIZ - *cursor + 1); -+ -+ for (j = *cursor; j < (BUFSIZ - 1); j++) { -+ if (!*(parsenextc + j)) -+ break; -+ else -+ out1c(*(parsenextc + j)); -+ } -+ -+ out1str(" \b"); -+ -+ while (j-- > *cursor) -+ out1c('\b'); -+ -+ --*len; -+ flushout(&output); -+ } -+} -+ -+int hetio_read_input(int fd) -+{ -+ int nr = 0; -+ -+ if (!hetio_inter) { /* Are we an interactive shell? */ -+ return -255; -+ } else { -+ int len = 0; -+ int j = 0; -+ int cursor = 0; -+ int break_out = 0; -+ int ret = 0; -+ char c = 0; -+ struct history *hp = his_end; -+ -+ if (!reset_term) { -+ setIO(&new_term, &old_term); -+ reset_term = 1; -+ } else { -+ tcsetattr(0, TCSANOW, &new_term); -+ } -+ -+ memset(parsenextc, 0, BUFSIZ); -+ -+ while (1) { -+ if ((ret = read(fd, &c, 1)) < 1) -+ return ret; -+ -+ switch (c) { -+ case 1: /* Control-A Beginning of line */ -+ input_home(&cursor); -+ break; -+ case 5: /* Control-E EOL */ -+ input_end(&cursor, len); -+ break; -+ case 4: /* Control-D */ -+#ifndef CTRL_D_DELETE -+ return 0; -+#else -+ if (cursor != len) { -+ input_delete(cursor); -+ len--; -+ } -+ break; -+#endif -+ case '\b': /* Backspace */ -+ case DEL: -+ input_backspace(&cursor, &len); -+ break; -+ case '\n': /* Enter */ -+ *(parsenextc + len++ + 1) = c; -+ out1c(c); -+ flushout(&output); -+ break_out = 1; -+ break; -+ case ESC: /* escape sequence follows */ -+ if ((ret = read(fd, &c, 1)) < 1) -+ return ret; -+ -+ if (c == '[' || c == 'O' ) { /* 91 */ -+ if ((ret = read(fd, &c, 1)) < 1) -+ return ret; -+ -+ switch (c) { -+ case 'A': -+ if (hp && hp->p) { /* Up */ -+ hp = hp->p; -+ goto hop; -+ } -+ break; -+ case 'B': -+ if (hp && hp->n && hp->n->s) { /* Down */ -+ hp = hp->n; -+ goto hop; -+ } -+ break; -+ -+hop: /* hop */ -+ len = strlen(parsenextc); -+ -+ for (; cursor > 0; cursor--) /* return to begining of line */ -+ out1c('\b'); -+ -+ for (j = 0; j < len; j++) /* erase old command */ -+ out1c(' '); -+ -+ for (j = len; j > 0; j--) /* return to begining of line */ -+ out1c('\b'); -+ -+ strcpy (parsenextc, hp->s); /* write new command */ -+ len = strlen (hp->s); -+ out1str(parsenextc); -+ flushout(&output); -+ cursor = len; -+ break; -+ case 'C': /* Right */ -+ if (cursor < len) { -+ out1str("\033[C"); -+ cursor++; -+ flushout(&output); -+ } -+ break; -+ case 'D': /* Left */ -+ if (cursor > 0) { -+ out1str("\033[D"); -+ cursor--; -+ flushout(&output); -+ } -+ break; -+ case '3': /* Delete */ -+ if (cursor != len) { -+ input_delete(cursor); -+ len--; -+ } -+ break; -+ case 'H': /* Home (xterm) */ -+ case '1': /* Home (Ctrl-A) */ -+ input_home(&cursor); -+ break; -+ case 'F': /* End (xterm_ */ -+ case '4': /* End (Ctrl-E) */ -+ input_end(&cursor, len); -+ break; -+ } -+ if (c == '1' || c == '3' || c == '4') -+ if ((ret = read(fd, &c, 1)) < 1) -+ return ret; /* read 126 (~) */ -+ } -+ -+ c = 0; -+ break; -+ -+ default: /* If it's regular input, do the normal thing */ -+ -+ if (!isprint(c)) /* Skip non-printable characters */ -+ break; -+ -+ if (len >= (BUFSIZ - 2)) /* Need to leave space for enter */ -+ break; -+ -+ len++; -+ -+ if (cursor == (len - 1)) { /* Append if at the end of the line */ -+ *(parsenextc + cursor) = c; -+ } else { /* Insert otherwise */ -+ memmove(parsenextc + cursor + 1, parsenextc + cursor, -+ len - cursor - 1); -+ -+ *(parsenextc + cursor) = c; -+ -+ for (j = cursor; j < len; j++) -+ out1c(*(parsenextc + j)); -+ for (; j > cursor; j--) -+ out1str("\033[D"); -+ } -+ -+ cursor++; -+ out1c(c); -+ flushout(&output); -+ break; -+ } -+ -+ if (break_out) /* Enter is the command terminator, no more input. */ -+ break; -+ } -+ -+ nr = len + 1; -+ tcsetattr(0, TCSANOW, &old_term); -+ -+ -+ if (*(parsenextc)) { /* Handle command history log */ -+ struct history *h = his_end; -+ -+ if (!h) { /* No previous history */ -+ h = his_front = malloc(sizeof (struct history)); -+ h->n = malloc(sizeof (struct history)); -+ h->p = NULL; -+ h->s = strdup(parsenextc); -+ -+ h->n->p = h; -+ h->n->n = NULL; -+ h->n->s = NULL; -+ his_end = h->n; -+ history_counter++; -+ } else { /* Add a new history command */ -+ -+ h->n = malloc(sizeof (struct history)); -+ -+ h->n->p = h; -+ h->n->n = NULL; -+ h->n->s = NULL; -+ h->s = strdup(parsenextc); -+ his_end = h->n; -+ -+ if (history_counter >= MAX_HISTORY) { /* After max history, remove the last known command */ -+ struct history *p = his_front->n; -+ -+ p->p = NULL; -+ free(his_front->s); -+ free(his_front); -+ his_front = p; -+ } else { -+ history_counter++; -+ } -+ } -+ } -+ } -+ -+ return nr; -+} -+#endif -diff -Nur ash-0.4.0.orig/hetio.h ash-0.4.0.fixed/hetio.h ---- ash-0.4.0.orig/hetio.h 1969-12-31 18:00:00.000000000 -0600 -+++ ash-0.4.0.fixed/hetio.h 2003-10-01 21:08:15.000000000 -0500 -@@ -0,0 +1,22 @@ -+/* -+ * Termios command line History and Editting for NetBSD sh (ash) -+ * Copyright (c) 1999 -+ * Main code: Adam Rogoyski -+ * Etc: Dave Cinege -+ * -+ * You may use this code as you wish, so long as the original author(s) -+ * are attributed in any redistributions of the source code. -+ * This code is 'as is' with no warranty. -+ * This code may safely be consumed by a BSD or GPL license. -+ * -+ * v 0.5 19990328 Initial release -+ * -+ * Future plans: Simple file and path name completion. (like BASH) -+ * -+ */ -+ -+void hetio_init(void); -+int hetio_read_input(int fd); -+void hetio_reset_term(void); -+ -+extern int hetio_inter; -diff -Nur ash-0.4.0.orig/histedit.c ash-0.4.0.fixed/histedit.c ---- ash-0.4.0.orig/histedit.c 2001-01-12 10:50:35.000000000 -0600 -+++ ash-0.4.0.fixed/histedit.c 2003-10-01 21:08:15.000000000 -0500 -@@ -60,9 +60,9 @@ - #include "main.h" - #include "output.h" - #include "mystring.h" --#include "myhistedit.h" - #include "error.h" - #ifndef SMALL -+#include "myhistedit.h" - #include "eval.h" - #include "memalloc.h" - -@@ -219,7 +219,11 @@ - if (argc == 1) - error("missing history argument"); - -+#ifdef __GLIBC__ -+ optind = 1; -+#else - optreset = 1; optind = 1; /* initialize getopt */ -+#endif - while (not_fcnumber(argv[optind]) && - (ch = getopt(argc, argv, ":e:lnrs")) != -1) - switch ((char)ch) { -diff -Nur ash-0.4.0.orig/input.c ash-0.4.0.fixed/input.c ---- ash-0.4.0.orig/input.c 2000-05-23 05:03:19.000000000 -0500 -+++ ash-0.4.0.fixed/input.c 2003-10-01 21:08:15.000000000 -0500 -@@ -66,7 +66,13 @@ - #include "error.h" - #include "alias.h" - #include "parser.h" -+#ifndef SMALL - #include "myhistedit.h" -+#endif -+ -+#ifdef HETIO -+#include "hetio.h" -+#endif - - #define EOF_NLEFT -99 /* value of parsenleft when EOF pushed back */ - -@@ -108,7 +114,9 @@ - int init_editline = 0; /* editline library initialized? */ - int whichprompt; /* 1 == PS1, 2 == PS2 */ - -+#ifndef SMALL - EditLine *el; /* cookie for editline package */ -+#endif - - STATIC void pushfile __P((void)); - static int preadfd __P((void)); -@@ -198,6 +206,11 @@ - } - } else - #endif -+ -+#ifdef HETIO -+ nr = hetio_read_input(parsefile->fd); -+ if (nr == -255) -+#endif - nr = read(parsefile->fd, buf, BUFSIZ - 1); - - -diff -Nur ash-0.4.0.orig/jobs.c ash-0.4.0.fixed/jobs.c ---- ash-0.4.0.orig/jobs.c 2000-05-23 05:03:19.000000000 -0500 -+++ ash-0.4.0.fixed/jobs.c 2003-10-01 21:08:15.000000000 -0500 -@@ -92,6 +92,7 @@ - int initialpgrp; /* pgrp of shell on invocation */ - short curjob; /* current job */ - #endif -+STATIC int intreceived; - - STATIC void restartjob __P((struct job *)); - STATIC void freejob __P((struct job *)); -@@ -101,8 +102,10 @@ - STATIC int waitproc __P((int, int *)); - STATIC void cmdtxt __P((union node *)); - STATIC void cmdputs __P((const char *)); -+STATIC void waitonint(int); - - -+#if JOBS - /* - * Turn job control on and off. - * -@@ -126,9 +129,9 @@ - if (on) { - do { /* while we are in the background */ - #ifdef OLD_TTY_DRIVER -- if (ioctl(2, TIOCGPGRP, (char *)&initialpgrp) < 0) { -+ if (ioctl(fd2, TIOCGPGRP, (char *)&initialpgrp) < 0) { - #else -- initialpgrp = tcgetpgrp(2); -+ initialpgrp = tcgetpgrp(fd2); - if (initialpgrp < 0) { - #endif - out2str("sh: can't access tty; job control turned off\n"); -@@ -143,7 +146,7 @@ - } - } while (0); - #ifdef OLD_TTY_DRIVER -- if (ioctl(2, TIOCGETD, (char *)&ldisc) < 0 || ldisc != NTTYDISC) { -+ if (ioctl(fd2, TIOCGETD, (char *)&ldisc) < 0 || ldisc != NTTYDISC) { - out2str("sh: need new tty driver to run job control; job control turned off\n"); - mflag = 0; - return; -@@ -154,16 +157,16 @@ - setsignal(SIGTTIN); - setpgid(0, rootpid); - #ifdef OLD_TTY_DRIVER -- ioctl(2, TIOCSPGRP, (char *)&rootpid); -+ ioctl(fd2, TIOCSPGRP, (char *)&rootpid); - #else -- tcsetpgrp(2, rootpid); -+ tcsetpgrp(fd2, rootpid); - #endif - } else { /* turning job control off */ - setpgid(0, initialpgrp); - #ifdef OLD_TTY_DRIVER -- ioctl(2, TIOCSPGRP, (char *)&initialpgrp); -+ ioctl(fd2, TIOCSPGRP, (char *)&initialpgrp); - #else -- tcsetpgrp(2, initialpgrp); -+ tcsetpgrp(fd2, initialpgrp); - #endif - setsignal(SIGTSTP); - setsignal(SIGTTOU); -@@ -171,6 +174,7 @@ - } - jobctl = on; - } -+#endif - - - #ifdef mkinit -@@ -189,6 +193,94 @@ - - #if JOBS - int -+killcmd(argc, argv) -+ int argc; -+ char **argv; -+{ -+ extern char *signal_names[]; -+ int signo = -1; -+ int list = 0; -+ int i; -+ pid_t pid; -+ struct job *jp; -+ -+ if (argc <= 1) { -+ error( -+"Usage: kill [-s sigspec | -signum | -sigspec] [pid | job]... or\n" -+"kill -l [exitstatus]" -+ ); -+ } -+ -+ if (*argv[1] == '-') { -+ signo = decode_signal(argv[1]+1); -+ if (signo < 0) { -+ int c; -+ -+ while ((c = nextopt("ls:")) != '\0') -+ switch (c) { -+ case 'l': -+ list = 1; -+ break; -+ case 's': -+ signo = decode_signal(optarg); -+ break; -+ default: -+ error( -+ "nextopt returned character code 0%o", c); -+ } -+ } else -+ argptr++; -+ } -+ -+ if (!list && signo < 0) -+ signo = SIGTERM; -+ -+ if ((signo < 0 || !*argptr) ^ list) { -+ error( -+"Usage: kill [-s sigspec | -signum | -sigspec] [pid | job]... or\n" -+"kill -l [exitstatus]" -+ ); -+ } -+ -+ if (list) { -+ if (!*argptr) { -+ out1fmt("0\n"); -+ for (i = 1; i < NSIG; i++) { -+ if (strncmp(signal_names[i], "SIGJUNK(", 8) -+ == 0) -+ continue; -+ out1fmt("%s\n", signal_names[i] + 3); -+ } -+ return 0; -+ } -+ signo = atoi(*argptr); -+ if (signo > 128) -+ signo -= 128; -+ if (0 < signo && signo < NSIG) -+ out1fmt("%s\n", signal_names[signo] + 3); -+ else -+ error("invalid signal number or exit status: %s", -+ *argptr); -+ return 0; -+ } -+ -+ do { -+ if (**argptr == '%') { -+ jp = getjob(*argptr); -+ if (jp->jobctl == 0) -+ error("job %s not created under job control", -+ *argptr); -+ pid = -jp->ps[0].pid; -+ } else -+ pid = atoi(*argptr); -+ if (kill(pid, signo) != 0) -+ error("%s: %s", *argptr, strerror(errno)); -+ } while (*++argptr); -+ -+ return 0; -+} -+ -+int - fgcmd(argc, argv) - int argc; - char **argv; -@@ -202,9 +294,9 @@ - error("job not created under job control"); - pgrp = jp->ps[0].pid; - #ifdef OLD_TTY_DRIVER -- ioctl(2, TIOCSPGRP, (char *)&pgrp); -+ ioctl(fd2, TIOCSPGRP, (char *)&pgrp); - #else -- tcsetpgrp(2, pgrp); -+ tcsetpgrp(fd2, pgrp); - #endif - restartjob(jp); - INTOFF; -@@ -594,9 +686,6 @@ - TRACE(("Child shell %d\n", getpid())); - wasroot = rootshell; - rootshell = 0; -- for (i = njobs, p = jobtab ; --i >= 0 ; p++) -- if (p->used) -- freejob(p); - closescript(); - INTON; - clear_traps(); -@@ -611,10 +700,10 @@ - if (mode == FORK_FG) { - /*** this causes superfluous TIOCSPGRPS ***/ - #ifdef OLD_TTY_DRIVER -- if (ioctl(2, TIOCSPGRP, (char *)&pgrp) < 0) -+ if (ioctl(fd2, TIOCSPGRP, (char *)&pgrp) < 0) - error("TIOCSPGRP failed, errno=%d", errno); - #else -- if (tcsetpgrp(2, pgrp) < 0) -+ if (tcsetpgrp(fd2, pgrp) < 0) - error("tcsetpgrp failed, errno=%d", errno); - #endif - } -@@ -623,6 +712,7 @@ - } else if (mode == FORK_BG) { - ignoresig(SIGINT); - ignoresig(SIGQUIT); -+ ignoresig(SIGHUP); - if ((jp == NULL || jp->nprocs == 0) && - ! fd0_redirected_p ()) { - close(0); -@@ -634,6 +724,7 @@ - if (mode == FORK_BG) { - ignoresig(SIGINT); - ignoresig(SIGQUIT); -+ ignoresig(SIGHUP); - if ((jp == NULL || jp->nprocs == 0) && - ! fd0_redirected_p ()) { - close(0); -@@ -642,6 +733,9 @@ - } - } - #endif -+ for (i = njobs, p = jobtab ; --i >= 0 ; p++) -+ if (p->used) -+ freejob(p); - if (wasroot && iflag) { - setsignal(SIGINT); - setsignal(SIGQUIT); -@@ -701,19 +795,39 @@ - #endif - int status; - int st; -+ struct sigaction act, oact; - - INTOFF; -+ intreceived = 0; -+#if JOBS -+ if (!jobctl) { -+#else -+ if (!iflag) { -+#endif -+ sigaction(SIGINT, 0, &act); -+ act.sa_handler = waitonint; -+ sigaction(SIGINT, &act, &oact); -+ } - TRACE(("waitforjob(%%%d) called\n", jp - jobtab + 1)); - while (jp->state == 0) { - dowait(1, jp); - } - #if JOBS -+ if (!jobctl) { -+#else -+ if (!iflag) { -+#endif -+ extern char *trap[]; -+ sigaction(SIGINT, &oact, 0); -+ if (intreceived && trap[SIGINT]) kill(getpid(), SIGINT); -+ } -+#if JOBS - if (jp->jobctl) { - #ifdef OLD_TTY_DRIVER -- if (ioctl(2, TIOCSPGRP, (char *)&mypgrp) < 0) -+ if (ioctl(fd2, TIOCSPGRP, (char *)&mypgrp) < 0) - error("TIOCSPGRP failed, errno=%d\n", errno); - #else -- if (tcsetpgrp(2, mypgrp) < 0) -+ if (tcsetpgrp(fd2, mypgrp) < 0) - error("tcsetpgrp failed, errno=%d\n", errno); - #endif - } -@@ -896,10 +1010,10 @@ - #ifdef BSD - int flags; - --#if JOBS -- flags = WUNTRACED; --#else - flags = 0; -+#if JOBS -+ if (jobctl) -+ flags |= WUNTRACED; - #endif - if (block == 0) - flags |= WNOHANG; -@@ -1068,6 +1182,8 @@ - p = ">>"; i = 1; goto redir; - case NTOFD: - p = ">&"; i = 1; goto redir; -+ case NTOOV: -+ p = ">|"; i = 1; goto redir; - case NFROM: - p = "<"; i = 0; goto redir; - case NFROMFD: -@@ -1140,3 +1256,8 @@ - } - cmdnextc = q; - } -+ -+STATIC void waitonint(int sig) { -+ intreceived = 1; -+ return; -+} -diff -Nur ash-0.4.0.orig/jobs.h ash-0.4.0.fixed/jobs.h ---- ash-0.4.0.orig/jobs.h 2000-05-23 05:03:19.000000000 -0500 -+++ ash-0.4.0.fixed/jobs.h 2003-10-01 21:08:15.000000000 -0500 -@@ -80,6 +80,7 @@ - extern int job_warning; /* user was warned about stopped jobs */ - - void setjobctl __P((int)); -+int killcmd __P((int, char **)); - int fgcmd __P((int, char **)); - int bgcmd __P((int, char **)); - int jobscmd __P((int, char **)); -diff -Nur ash-0.4.0.orig/main.c ash-0.4.0.fixed/main.c ---- ash-0.4.0.orig/main.c 2001-01-12 10:50:36.000000000 -0600 -+++ ash-0.4.0.fixed/main.c 2003-10-01 21:08:15.000000000 -0500 -@@ -79,6 +79,10 @@ - #include "exec.h" - #include "cd.h" - -+#ifdef HETIO -+#include "hetio.h" -+#endif -+ - #define PROFILE 0 - - int rootpid; -@@ -111,10 +115,16 @@ - struct stackmark smark; - volatile int state; - char *shinit; -+ int priviliged; -+ -+ priviliged = getuid() != geteuid() || getgid() != getegid(); - - #if PROFILE - monitor(4, etext, profile_buf, sizeof profile_buf, 50); - #endif -+#if defined(linux) || defined(__GNU__) -+ signal(SIGCHLD, SIG_DFL); -+#endif - state = 0; - if (setjmp(jmploc.loc)) { - /* -@@ -181,11 +191,14 @@ - read_profile("/etc/profile"); - state1: - state = 2; -- read_profile(".profile"); -+ if (priviliged == 0) -+ read_profile(".profile"); -+ else -+ read_profile("/etc/suid_profile"); - } - state2: - state = 3; -- if (getuid() == geteuid() && getgid() == getegid()) { -+ if (iflag && !priviliged) { - if ((shinit = lookupvar("ENV")) != NULL && *shinit != '\0') { - state = 3; - read_profile(shinit); -@@ -239,6 +252,10 @@ - - TRACE(("cmdloop(%d) called\n", top)); - setstackmark(&smark); -+#ifdef HETIO -+ if(iflag && top) -+ hetio_init(); -+#endif - for (;;) { - if (pendingsigs) - dotrap(); -diff -Nur ash-0.4.0.orig/miscbltin.c ash-0.4.0.fixed/miscbltin.c ---- ash-0.4.0.orig/miscbltin.c 2001-01-12 10:50:37.000000000 -0600 -+++ ash-0.4.0.fixed/miscbltin.c 2003-10-01 21:08:15.000000000 -0500 -@@ -70,6 +70,15 @@ - - #undef rflag - -+#ifdef __GLIBC__ -+mode_t getmode(const void *, mode_t); -+void *setmode(const char *); -+ -+#if !defined(__GLIBC__) || __GLIBC__ == 2 && __GLIBC_MINOR__ < 1 -+typedef enum __rlimit_resource rlim_t; -+#endif -+#endif -+ - extern char **argptr; /* argument list for builtin command */ - - -diff -Nur ash-0.4.0.orig/mksignames.c ash-0.4.0.fixed/mksignames.c ---- ash-0.4.0.orig/mksignames.c 1969-12-31 18:00:00.000000000 -0600 -+++ ash-0.4.0.fixed/mksignames.c 2003-10-01 21:08:15.000000000 -0500 -@@ -0,0 +1,400 @@ -+/* signames.c -- Create and write `signames.c', which contains an array of -+ signal names. */ -+ -+/* Copyright (C) 1992 Free Software Foundation, Inc. -+ -+ This file is part of GNU Bash, the Bourne Again SHell. -+ -+ Bash is free software; you can redistribute it and/or modify it under -+ the terms of the GNU General Public License as published by the Free -+ Software Foundation; either version 2, or (at your option) any later -+ version. -+ -+ Bash is distributed in the hope that it will be useful, but WITHOUT ANY -+ WARRANTY; without even the implied warranty of MERCHANTABILITY or -+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -+ for more details. -+ -+ You should have received a copy of the GNU General Public License along -+ with Bash; see the file COPYING. If not, write to the Free Software -+ Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */ -+ -+#include -+#include -+#include -+#include -+ -+#if !defined (NSIG) -+# define NSIG 64 -+#endif -+ -+char *signal_names[2 * NSIG]; -+ -+char *progname; -+ -+#if defined (SIGRTMAX) || defined (SIGRTMIN) -+# define RTLEN 14 -+# define RTLIM 256 -+#endif -+ -+void -+initialize_signames () -+{ -+ register int i; -+#if defined (SIGRTMAX) || defined (SIGRTMIN) -+ int rtmin, rtmax, rtcnt; -+#endif -+ -+ for (i = 1; i < sizeof(signal_names)/sizeof(signal_names[0]); i++) -+ signal_names[i] = (char *)NULL; -+ -+ /* `signal' 0 is what we do on exit. */ -+ signal_names[0] = "EXIT"; -+ -+ /* Place signal names which can be aliases for more common signal -+ names first. This allows (for example) SIGABRT to overwrite SIGLOST. */ -+ -+ /* POSIX 1003.1b-1993 real time signals, but take care of incomplete -+ implementations. Acoording to the standard, both, SIGRTMIN and -+ SIGRTMAX must be defined, SIGRTMIN must be stricly less than -+ SIGRTMAX, and the difference must be at least 7, that is, there -+ must be at least eight distinct real time signals. */ -+ -+ /* The generated signal names are SIGRTMIN, SIGRTMIN+1, ..., -+ SIGRTMIN+x, SIGRTMAX-x, ..., SIGRTMAX-1, SIGRTMAX. If the number -+ of RT signals is odd, there is an extra SIGRTMIN+(x+1). -+ These names are the ones used by ksh and /usr/xpg4/bin/sh on SunOS5. */ -+ -+#if defined (SIGRTMIN) -+ rtmin = SIGRTMIN; -+ signal_names[rtmin] = "SIGRTMIN"; -+#endif -+ -+#if defined (SIGRTMAX) -+ rtmax = SIGRTMAX; -+ signal_names[rtmax] = "SIGRTMAX"; -+#endif -+ -+#if defined (SIGRTMAX) && defined (SIGRTMIN) -+ if (rtmax > rtmin) -+ { -+ rtcnt = (rtmax - rtmin - 1) / 2; -+ /* croak if there are too many RT signals */ -+ if (rtcnt >= RTLIM/2) -+ { -+ rtcnt = RTLIM/2-1; -+ fprintf(stderr, "%s: error: more than %i real time signals, fix `%s'\n", -+ progname, RTLIM, progname); -+ } -+ -+ for (i = 1; i <= rtcnt; i++) -+ { -+ signal_names[rtmin+i] = (char *)malloc(RTLEN); -+ sprintf (signal_names[rtmin+i], "SIGRTMIN+%d", i); -+ signal_names[rtmax-i] = (char *)malloc(RTLEN); -+ sprintf (signal_names[rtmax-i], "SIGRTMAX-%d", i); -+ } -+ -+ if (rtcnt < RTLIM/2-1 && rtcnt != (rtmax-rtmin)/2) -+ { -+ /* Need an extra RTMIN signal */ -+ signal_names[rtmin+rtcnt+1] = (char *)malloc(RTLEN); -+ sprintf (signal_names[rtmin+rtcnt+1], "SIGRTMIN+%d", rtcnt+1); -+ } -+ } -+#endif /* SIGRTMIN && SIGRTMAX */ -+ -+/* AIX */ -+#if defined (SIGLOST) /* resource lost (eg, record-lock lost) */ -+ signal_names[SIGLOST] = "SIGLOST"; -+#endif -+ -+#if defined (SIGMSG) /* HFT input data pending */ -+ signal_names[SIGMSG] = "SIGMSG"; -+#endif -+ -+#if defined (SIGDANGER) /* system crash imminent */ -+ signal_names[SIGDANGER] = "SIGDANGER"; -+#endif -+ -+#if defined (SIGMIGRATE) /* migrate process to another CPU */ -+ signal_names[SIGMIGRATE] = "SIGMIGRATE"; -+#endif -+ -+#if defined (SIGPRE) /* programming error */ -+ signal_names[SIGPRE] = "SIGPRE"; -+#endif -+ -+#if defined (SIGVIRT) /* AIX virtual time alarm */ -+ signal_names[SIGVIRT] = "SIGVIRT"; -+#endif -+ -+#if defined (SIGALRM1) /* m:n condition variables */ -+ signal_names[SIGALRM1] = "SIGALRM1"; -+#endif -+ -+#if defined (SIGWAITING) /* m:n scheduling */ -+ signal_names[SIGWAITING] = "SIGWAITING"; -+#endif -+ -+#if defined (SIGGRANT) /* HFT monitor mode granted */ -+ signal_names[SIGGRANT] = "SIGGRANT"; -+#endif -+ -+#if defined (SIGKAP) /* keep alive poll from native keyboard */ -+ signal_names[SIGKAP] = "SIGKAP"; -+#endif -+ -+#if defined (SIGRETRACT) /* HFT monitor mode retracted */ -+ signal_names[SIGRETRACT] = "SIGRETRACT"; -+#endif -+ -+#if defined (SIGSOUND) /* HFT sound sequence has completed */ -+ signal_names[SIGSOUND] = "SIGSOUND"; -+#endif -+ -+#if defined (SIGSAK) /* Secure Attention Key */ -+ signal_names[SIGSAK] = "SIGSAK"; -+#endif -+ -+/* SunOS5 */ -+#if defined (SIGLWP) /* special signal used by thread library */ -+ signal_names[SIGLWP] = "SIGLWP"; -+#endif -+ -+#if defined (SIGFREEZE) /* special signal used by CPR */ -+ signal_names[SIGFREEZE] = "SIGFREEZE"; -+#endif -+ -+#if defined (SIGTHAW) /* special signal used by CPR */ -+ signal_names[SIGTHAW] = "SIGTHAW"; -+#endif -+ -+#if defined (SIGCANCEL) /* thread cancellation signal used by libthread */ -+ signal_names[SIGCANCEL] = "SIGCANCEL"; -+#endif -+ -+/* HP-UX */ -+#if defined (SIGDIL) /* DIL signal (?) */ -+ signal_names[SIGDIL] = "SIGDIL"; -+#endif -+ -+/* System V */ -+#if defined (SIGCLD) /* Like SIGCHLD. */ -+ signal_names[SIGCLD] = "SIGCLD"; -+#endif -+ -+#if defined (SIGPWR) /* power state indication */ -+ signal_names[SIGPWR] = "SIGPWR"; -+#endif -+ -+#if defined (SIGPOLL) /* Pollable event (for streams) */ -+ signal_names[SIGPOLL] = "SIGPOLL"; -+#endif -+ -+/* Unknown */ -+#if defined (SIGWINDOW) -+ signal_names[SIGWINDOW] = "SIGWINDOW"; -+#endif -+ -+/* Common */ -+#if defined (SIGHUP) /* hangup */ -+ signal_names[SIGHUP] = "SIGHUP"; -+#endif -+ -+#if defined (SIGINT) /* interrupt */ -+ signal_names[SIGINT] = "SIGINT"; -+#endif -+ -+#if defined (SIGQUIT) /* quit */ -+ signal_names[SIGQUIT] = "SIGQUIT"; -+#endif -+ -+#if defined (SIGILL) /* illegal instruction (not reset when caught) */ -+ signal_names[SIGILL] = "SIGILL"; -+#endif -+ -+#if defined (SIGTRAP) /* trace trap (not reset when caught) */ -+ signal_names[SIGTRAP] = "SIGTRAP"; -+#endif -+ -+#if defined (SIGIOT) /* IOT instruction */ -+ signal_names[SIGIOT] = "SIGIOT"; -+#endif -+ -+#if defined (SIGABRT) /* Cause current process to dump core. */ -+ signal_names[SIGABRT] = "SIGABRT"; -+#endif -+ -+#if defined (SIGEMT) /* EMT instruction */ -+ signal_names[SIGEMT] = "SIGEMT"; -+#endif -+ -+#if defined (SIGFPE) /* floating point exception */ -+ signal_names[SIGFPE] = "SIGFPE"; -+#endif -+ -+#if defined (SIGKILL) /* kill (cannot be caught or ignored) */ -+ signal_names[SIGKILL] = "SIGKILL"; -+#endif -+ -+#if defined (SIGBUS) /* bus error */ -+ signal_names[SIGBUS] = "SIGBUS"; -+#endif -+ -+#if defined (SIGSEGV) /* segmentation violation */ -+ signal_names[SIGSEGV] = "SIGSEGV"; -+#endif -+ -+#if defined (SIGSYS) /* bad argument to system call */ -+ signal_names[SIGSYS] = "SIGSYS"; -+#endif -+ -+#if defined (SIGPIPE) /* write on a pipe with no one to read it */ -+ signal_names[SIGPIPE] = "SIGPIPE"; -+#endif -+ -+#if defined (SIGALRM) /* alarm clock */ -+ signal_names[SIGALRM] = "SIGALRM"; -+#endif -+ -+#if defined (SIGTERM) /* software termination signal from kill */ -+ signal_names[SIGTERM] = "SIGTERM"; -+#endif -+ -+#if defined (SIGURG) /* urgent condition on IO channel */ -+ signal_names[SIGURG] = "SIGURG"; -+#endif -+ -+#if defined (SIGSTOP) /* sendable stop signal not from tty */ -+ signal_names[SIGSTOP] = "SIGSTOP"; -+#endif -+ -+#if defined (SIGTSTP) /* stop signal from tty */ -+ signal_names[SIGTSTP] = "SIGTSTP"; -+#endif -+ -+#if defined (SIGCONT) /* continue a stopped process */ -+ signal_names[SIGCONT] = "SIGCONT"; -+#endif -+ -+#if defined (SIGCHLD) /* to parent on child stop or exit */ -+ signal_names[SIGCHLD] = "SIGCHLD"; -+#endif -+ -+#if defined (SIGTTIN) /* to readers pgrp upon background tty read */ -+ signal_names[SIGTTIN] = "SIGTTIN"; -+#endif -+ -+#if defined (SIGTTOU) /* like TTIN for output if (tp->t_local<OSTOP) */ -+ signal_names[SIGTTOU] = "SIGTTOU"; -+#endif -+ -+#if defined (SIGIO) /* input/output possible signal */ -+ signal_names[SIGIO] = "SIGIO"; -+#endif -+ -+#if defined (SIGXCPU) /* exceeded CPU time limit */ -+ signal_names[SIGXCPU] = "SIGXCPU"; -+#endif -+ -+#if defined (SIGXFSZ) /* exceeded file size limit */ -+ signal_names[SIGXFSZ] = "SIGXFSZ"; -+#endif -+ -+#if defined (SIGVTALRM) /* virtual time alarm */ -+ signal_names[SIGVTALRM] = "SIGVTALRM"; -+#endif -+ -+#if defined (SIGPROF) /* profiling time alarm */ -+ signal_names[SIGPROF] = "SIGPROF"; -+#endif -+ -+#if defined (SIGWINCH) /* window changed */ -+ signal_names[SIGWINCH] = "SIGWINCH"; -+#endif -+ -+/* 4.4 BSD */ -+#if defined (SIGINFO) && !defined (_SEQUENT_) /* information request */ -+ signal_names[SIGINFO] = "SIGINFO"; -+#endif -+ -+#if defined (SIGUSR1) /* user defined signal 1 */ -+ signal_names[SIGUSR1] = "SIGUSR1"; -+#endif -+ -+#if defined (SIGUSR2) /* user defined signal 2 */ -+ signal_names[SIGUSR2] = "SIGUSR2"; -+#endif -+ -+#if defined (SIGKILLTHR) /* BeOS: Kill Thread */ -+ signal_names[SIGKILLTHR] = "SIGKILLTHR"; -+#endif -+ -+ for (i = 0; i < NSIG; i++) -+ if (signal_names[i] == (char *)NULL) -+ { -+ signal_names[i] = (char *)malloc (18); -+ sprintf (signal_names[i], "SIGJUNK(%d)", i); -+ } -+ -+ signal_names[NSIG] = "DEBUG"; -+} -+ -+void -+write_signames (stream) -+ FILE *stream; -+{ -+ register int i; -+ -+ fprintf (stream, "/* This file was automatically created by %s.\n", -+ progname); -+ fprintf (stream, " Do not edit. Edit support/mksignames.c instead. */\n\n"); -+ fprintf (stream, "#include \n\n"); -+ fprintf (stream, -+ "/* A translation list so we can be polite to our users. */\n"); -+ fprintf (stream, "char *signal_names[NSIG + 2] = {\n"); -+ -+ for (i = 0; i <= NSIG; i++) -+ fprintf (stream, " \"%s\",\n", signal_names[i]); -+ -+ fprintf (stream, " (char *)0x0,\n"); -+ fprintf (stream, "};\n"); -+} -+ -+int -+main (argc, argv) -+ int argc; -+ char **argv; -+{ -+ char *stream_name; -+ FILE *stream; -+ -+ progname = argv[0]; -+ -+ if (argc == 1) -+ { -+ stream_name = "signames.c"; -+ } -+ else if (argc == 2) -+ { -+ stream_name = argv[1]; -+ } -+ else -+ { -+ fprintf (stderr, "Usage: %s [output-file]\n", progname); -+ exit (1); -+ } -+ -+ stream = fopen (stream_name, "w"); -+ if (!stream) -+ { -+ fprintf (stderr, "%s: %s: cannot open for writing\n", -+ progname, stream_name); -+ exit (2); -+ } -+ -+ initialize_signames (); -+ write_signames (stream); -+ exit (0); -+} -diff -Nur ash-0.4.0.orig/mksyntax.c ash-0.4.0.fixed/mksyntax.c ---- ash-0.4.0.orig/mksyntax.c 2001-01-12 10:50:38.000000000 -0600 -+++ ash-0.4.0.fixed/mksyntax.c 2003-10-01 21:08:15.000000000 -0500 -@@ -238,14 +238,14 @@ - add("$", "CVAR"); - add("}", "CENDVAR"); - /* ':/' for tilde expansion, '-' for [a\-x] pattern ranges */ -- add("!*?[=~:/-", "CCTL"); -+ add("!*?[=~:/-]", "CCTL"); - print("dqsyntax"); - init(); - fputs("\n/* syntax table used when in single quotes */\n", cfile); - add("\n", "CNL"); - add("'", "CENDQUOTE"); - /* ':/' for tilde expansion, '-' for [a\-x] pattern ranges */ -- add("!*?[=~:/-", "CCTL"); -+ add("!*?[=~:/-]\\", "CCTL"); - print("sqsyntax"); - init(); - fputs("\n/* syntax table used when in arithmetic */\n", cfile); -diff -Nur ash-0.4.0.orig/nodetypes ash-0.4.0.fixed/nodetypes ---- ash-0.4.0.orig/nodetypes 1999-02-05 06:04:52.000000000 -0600 -+++ ash-0.4.0.fixed/nodetypes 2003-10-01 21:08:15.000000000 -0500 -@@ -119,6 +119,7 @@ - NFROM nfile # fd< fname - NFROMTO nfile # fd<> fname - NAPPEND nfile # fd>> fname -+NTOOV nfile # fd>| fname - type int - next nodeptr # next redirection in list - fd int # file descriptor being redirected -diff -Nur ash-0.4.0.orig/options.c ash-0.4.0.fixed/options.c ---- ash-0.4.0.orig/options.c 1999-07-09 06:02:07.000000000 -0500 -+++ ash-0.4.0.fixed/options.c 2003-10-01 21:08:15.000000000 -0500 -@@ -79,7 +79,7 @@ - STATIC void options __P((int)); - STATIC void minus_o __P((char *, int)); - STATIC void setoption __P((int, int)); --STATIC int getopts __P((char *, char *, char **, char ***, char **)); -+STATIC int getopts __P((char *, char *, char **, int *, int *)); - - - /* -@@ -118,7 +118,8 @@ - arg0 = *argptr++; - - shellparam.p = argptr; -- shellparam.reset = 1; -+ shellparam.optind = 1; -+ shellparam.optoff = -1; - /* assert(shellparam.malloc == 0 && shellparam.nparam == 0); */ - while (*argptr) { - shellparam.nparam++; -@@ -282,7 +283,8 @@ - shellparam.malloc = 1; - shellparam.nparam = nparam; - shellparam.p = newparam; -- shellparam.optnext = NULL; -+ shellparam.optind = 1; -+ shellparam.optoff = -1; - } - - -@@ -330,7 +332,8 @@ - } - ap2 = shellparam.p; - while ((*ap2++ = *ap1++) != NULL); -- shellparam.optnext = NULL; -+ shellparam.optind = 1; -+ shellparam.optoff = -1; - INTON; - return 0; - } -@@ -363,10 +366,8 @@ - getoptsreset(value) - const char *value; - { -- if (number(value) == 1) { -- shellparam.optnext = NULL; -- shellparam.reset = 1; -- } -+ shellparam.optind = number(value); -+ shellparam.optoff = -1; - } - - /* -@@ -385,50 +386,58 @@ - - if (argc < 3) - error("Usage: getopts optstring var [arg]"); -- else if (argc == 3) -+ else if (argc == 3) { - optbase = shellparam.p; -- else -+ if (shellparam.optind > shellparam.nparam + 1) { -+ shellparam.optind = 1; -+ shellparam.optoff = -1; -+ } -+ } -+ else { - optbase = &argv[3]; -- -- if (shellparam.reset == 1) { -- shellparam.optnext = optbase; -- shellparam.optptr = NULL; -- shellparam.reset = 0; -+ if (shellparam.optind > argc - 2) { -+ shellparam.optind = 1; -+ shellparam.optoff = -1; -+ } - } - -- return getopts(argv[1], argv[2], optbase, &shellparam.optnext, -- &shellparam.optptr); -+ return getopts(argv[1], argv[2], optbase, &shellparam.optind, -+ &shellparam.optoff); - } - - STATIC int --getopts(optstr, optvar, optfirst, optnext, optpptr) -+getopts(optstr, optvar, optfirst, optind, optoff) - char *optstr; - char *optvar; - char **optfirst; -- char ***optnext; -- char **optpptr; -+ int *optind; -+ int *optoff; - { - char *p, *q; - char c = '?'; - int done = 0; -- int ind = 0; - int err = 0; - char s[10]; -+ char **optnext = optfirst + *optind - 1; - -- if ((p = *optpptr) == NULL || *p == '\0') { -+ if (*optind <= 1 || *optoff < 0 || !(*(optnext - 1)) || -+ strlen(*(optnext - 1)) < *optoff) -+ p = NULL; -+ else -+ p = *(optnext - 1) + *optoff; -+ if (p == NULL || *p == '\0') { - /* Current word is done, advance */ -- if (*optnext == NULL) -+ if (optnext == NULL) - return 1; -- p = **optnext; -+ p = *optnext; - if (p == NULL || *p != '-' || *++p == '\0') { - atend: -- ind = *optnext - optfirst + 1; -- *optnext = NULL; -+ *optind = optnext - optfirst + 1; - p = NULL; - done = 1; - goto out; - } -- (*optnext)++; -+ optnext++; - if (p[0] == '-' && p[1] == '\0') /* check for "--" */ - goto atend; - } -@@ -453,7 +462,7 @@ - } - - if (*++q == ':') { -- if (*p == '\0' && (p = **optnext) == NULL) { -+ if (*p == '\0' && (p = *optnext) == NULL) { - if (optstr[0] == ':') { - s[0] = c; - s[1] = '\0'; -@@ -468,30 +477,29 @@ - goto bad; - } - -- if (p == **optnext) -- (*optnext)++; -+ if (p == *optnext) -+ optnext++; - setvarsafe("OPTARG", p, 0); - p = NULL; - } - else - setvarsafe("OPTARG", "", 0); -- ind = *optnext - optfirst + 1; -+ *optind = optnext - optfirst + 1; - goto out; - - bad: -- ind = 1; -- *optnext = NULL; -+ *optind = 1; - p = NULL; - out: -- *optpptr = p; -- fmtstr(s, sizeof(s), "%d", ind); -+ *optoff = p ? p - *(optnext - 1) : -1; -+ fmtstr(s, sizeof(s), "%d", *optind); - err |= setvarsafe("OPTIND", s, VNOFUNC); - s[0] = c; - s[1] = '\0'; - err |= setvarsafe(optvar, s, 0); - if (err) { -- *optnext = NULL; -- *optpptr = NULL; -+ *optind = 1; -+ *optoff = -1; - flushall(); - exraise(EXERROR); - } -diff -Nur ash-0.4.0.orig/options.h ash-0.4.0.fixed/options.h ---- ash-0.4.0.orig/options.h 1999-07-09 06:02:07.000000000 -0500 -+++ ash-0.4.0.fixed/options.h 2003-10-01 21:08:15.000000000 -0500 -@@ -41,10 +41,9 @@ - struct shparam { - int nparam; /* # of positional parameters (without $0) */ - unsigned char malloc; /* if parameter list dynamically allocated */ -- unsigned char reset; /* if getopts has been reset */ - char **p; /* parameter list */ -- char **optnext; /* next parameter to be processed by getopts */ -- char *optptr; /* used by getopts */ -+ int optind; /* next parameter to be processed by getopts */ -+ int optoff; /* used by getopts */ - }; - - -diff -Nur ash-0.4.0.orig/output.c ash-0.4.0.fixed/output.c ---- ash-0.4.0.orig/output.c 2001-01-12 10:50:39.000000000 -0600 -+++ ash-0.4.0.fixed/output.c 2003-10-01 21:08:15.000000000 -0500 -@@ -65,6 +65,10 @@ - #include - #include - #include -+#if defined(_GNU_SOURCE) && !defined(__UCLIBC__) -+#undef CEOF /* get rid of the redefine warning */ -+#include -+#endif - - #include "shell.h" - #include "syntax.h" -@@ -79,9 +83,15 @@ - #define OUTPUT_ERR 01 /* error occurred on output */ - - -+#if defined(_GNU_SOURCE) && !defined(__UCLIBC__) -+struct output output = {NULL, NULL, 0, NULL, 0, 1, 0}; -+struct output errout = {NULL, NULL, 0, NULL, 0, 2, 0}; -+struct output memout = {NULL, NULL, 0, NULL, 0, MEM_OUT, 0}; -+#else - struct output output = {NULL, 0, NULL, OUTBUFSIZ, 1, 0}; - struct output errout = {NULL, 0, NULL, 100, 2, 0}; - struct output memout = {NULL, 0, NULL, 0, MEM_OUT, 0}; -+#endif - struct output *out1 = &output; - struct output *out2 = &errout; - -@@ -92,9 +102,19 @@ - INCLUDE "output.h" - INCLUDE "memalloc.h" - -+INIT { -+#if defined(_GNU_SOURCE) && !defined(__UCLIBC__) -+ initstreams(); -+#endif -+} -+ - RESET { - out1 = &output; - out2 = &errout; -+#if defined(_GNU_SOURCE) && !defined(__UCLIBC__) -+ if (memout.stream != NULL) -+ closememout(); -+#endif - if (memout.buf != NULL) { - ckfree(memout.buf); - memout.buf = NULL; -@@ -124,33 +144,22 @@ - - - void --out1str(p) -- const char *p; -- { -- outstr(p, out1); --} -- -- --void --out2str(p) -- const char *p; -- { -- outstr(p, out2); --} -- -- --void - outstr(p, file) - const char *p; - struct output *file; - { -+#if defined(_GNU_SOURCE) && !defined(__UCLIBC__) -+ fputs(p, file->stream); -+#else - while (*p) - outc(*p++, file); -+#endif - if (file == out2) - flushout(file); - } - - -+#if !defined(_GNU_SOURCE) || defined(__UCLIBC__) - char out_junk[16]; - - -@@ -183,6 +192,7 @@ - } - dest->nleft--; - } -+#endif - - - void -@@ -192,11 +202,11 @@ - } - - -+#if !defined(_GNU_SOURCE) || defined(__UCLIBC__) - void - flushout(dest) - struct output *dest; - { -- - if (dest->buf == NULL || dest->nextc == dest->buf || dest->fd < 0) - return; - if (xwrite(dest->fd, dest->buf, dest->nextc - dest->buf) < 0) -@@ -204,6 +214,7 @@ - dest->nextc = dest->buf; - dest->nleft = dest->bufsize; - } -+#endif - - - void -@@ -264,6 +275,7 @@ - va_end(ap); - } - -+#if !defined(__GLIBC__) && !defined(__UCLIBC__) - void - #ifdef __STDC__ - dprintf(const char *fmt, ...) -@@ -285,6 +297,7 @@ - va_end(ap); - flushout(out2); - } -+#endif - - void - #ifdef __STDC__ -@@ -295,7 +308,9 @@ - #endif - { - va_list ap; -+#if !defined(_GNU_SOURCE) || defined(__UCLIBC__) - struct output strout; -+#endif - #ifndef __STDC__ - char *outbuf; - size_t length; -@@ -308,6 +323,9 @@ - #else - va_start(ap, fmt); - #endif -+#if defined(_GNU_SOURCE) && !defined(__UCLIBC__) -+ vsnprintf(outbuf, length, fmt, ap); -+#else - strout.nextc = outbuf; - strout.nleft = length; - strout.fd = BLOCK_OUT; -@@ -316,8 +334,10 @@ - outc('\0', &strout); - if (strout.flags & OUTPUT_ERR) - outbuf[length - 1] = '\0'; -+#endif - } - -+#if !defined(_GNU_SOURCE) || defined(__UCLIBC__) - /* - * Formatted output. This routine handles a subset of the printf formats: - * - Formats supported: d, u, o, p, X, s, and c. -@@ -534,7 +554,7 @@ - } - #endif /* !HAVE_VASPRINTF */ - } -- -+#endif - - - /* -@@ -544,7 +564,7 @@ - int - xwrite(fd, buf, nbytes) - int fd; -- char *buf; -+ const char *buf; - int nbytes; - { - int ntry; -@@ -570,6 +590,8 @@ - } - - -+ -+#ifdef notdef - /* - * Version of ioctl that retries after a signal is caught. - * XXX unused function -@@ -586,3 +608,27 @@ - while ((i = ioctl(fd, request, arg)) == -1 && errno == EINTR); - return i; - } -+#endif -+ -+ -+#if defined(_GNU_SOURCE) && !defined(__UCLIBC__) -+void initstreams() { -+ output.stream = stdout; -+ errout.stream = stderr; -+} -+ -+ -+void -+openmemout() { -+ memout.stream = open_memstream(&memout.buf, &memout.bufsize); -+} -+ -+ -+void -+closememout() { -+ INTOFF; -+ fclose(memout.stream); -+ memout.stream = NULL; -+ INTON; -+} -+#endif -diff -Nur ash-0.4.0.orig/output.h ash-0.4.0.fixed/output.h ---- ash-0.4.0.orig/output.h 1998-01-31 12:28:11.000000000 -0600 -+++ ash-0.4.0.fixed/output.h 2003-10-01 21:08:15.000000000 -0500 -@@ -45,13 +45,19 @@ - #else - #include - #endif -+#if defined(_GNU_SOURCE) && !defined(__UCLIBC__) -+#include -+#endif - - struct output { -+#if defined(_GNU_SOURCE) && !defined(__UCLIBC__) -+ FILE *stream; -+#endif - char *nextc; - int nleft; - char *buf; - int bufsize; -- short fd; -+ int fd; - short flags; - }; - -@@ -61,29 +67,44 @@ - extern struct output *out1; - extern struct output *out2; - --void open_mem __P((char *, int, struct output *)); --void out1str __P((const char *)); --void out2str __P((const char *)); - void outstr __P((const char *, struct output *)); -+#ifndef _GNU_SOURCE - void emptyoutbuf __P((struct output *)); -+#endif - void flushall __P((void)); -+#ifndef _GNU_SOURCE - void flushout __P((struct output *)); -+#endif - void freestdout __P((void)); - void outfmt __P((struct output *, const char *, ...)) - __attribute__((__format__(__printf__,2,3))); - void out1fmt __P((const char *, ...)) - __attribute__((__format__(__printf__,1,2))); -+#if !defined(__GLIBC__) && !defined(__UCLIBC__) - void dprintf __P((const char *, ...)) - __attribute__((__format__(__printf__,1,2))); -+#endif - void fmtstr __P((char *, size_t, const char *, ...)) - __attribute__((__format__(__printf__,3,4))); -+#ifndef _GNU_SOURCE - void doformat __P((struct output *, const char *, va_list)); --int xwrite __P((int, char *, int)); --int xioctl __P((int, unsigned long, char *)); -+#endif -+int xwrite __P((int, const char *, int)); -+#if defined(_GNU_SOURCE) && !defined(__UCLIBC__) -+void initstreams __P((void)); -+void openmemout __P((void)); -+void closememout __P((void)); - -+#define outc(c, o) putc(c, (o)->stream) -+#define flushout(o) fflush((o)->stream) -+#define doformat(d, f, a) vfprintf((d)->stream, f, a) -+#else - #define outc(c, file) (--(file)->nleft < 0? (emptyoutbuf(file), *(file)->nextc++ = (c)) : (*(file)->nextc++ = (c))) --#define out1c(c) outc(c, out1); --#define out2c(c) outc(c, out2); -+#endif -+#define out1c(c) outc(c, out1) -+#define out2c(c) outc(c, out2) -+#define out1str(s) outstr(s, out1) -+#define out2str(s) outstr(s, out2) - - #define OUTPUT_INCL - #endif -diff -Nur ash-0.4.0.orig/parser.c ash-0.4.0.fixed/parser.c ---- ash-0.4.0.orig/parser.c 2001-01-12 10:50:39.000000000 -0600 -+++ ash-0.4.0.fixed/parser.c 2003-10-01 21:08:15.000000000 -0500 -@@ -221,6 +221,7 @@ - union node *n1, *n2, *n3; - int t; - -+ checkkwd = 1; - n1 = pipeline(); - for (;;) { - if ((t = readtoken()) == TAND) { -@@ -231,6 +232,7 @@ - tokpushback++; - return n1; - } -+ checkkwd = 2; - n2 = pipeline(); - n3 = (union node *)stalloc(sizeof (struct nbinary)); - n3->type = t; -@@ -250,9 +252,11 @@ - - negate = 0; - TRACE(("pipeline: entered\n")); -- while (readtoken() == TNOT) -+ if (readtoken() == TNOT) { - negate = !negate; -- tokpushback++; -+ checkkwd = 1; -+ } else -+ tokpushback++; - n1 = command(); - if (readtoken() == TPIPE) { - pipenode = (union node *)stalloc(sizeof (struct npipe)); -@@ -264,6 +268,7 @@ - do { - prev = lp; - lp = (struct nodelist *)stalloc(sizeof (struct nodelist)); -+ checkkwd = 2; - lp->n = command(); - prev->next = lp; - } while (readtoken() == TPIPE); -@@ -288,9 +293,8 @@ - union node *ap, **app; - union node *cp, **cpp; - union node *redir, **rpp; -- int t, negate = 0; -+ int t; - -- checkkwd = 2; - redir = NULL; - n1 = NULL; - rpp = &redir; -@@ -303,12 +307,6 @@ - } - tokpushback++; - -- while (readtoken() == TNOT) { -- TRACE(("command: TNOT recognized\n")); -- negate = !negate; -- } -- tokpushback++; -- - switch (readtoken()) { - case TIF: - n1 = (union node *)stalloc(sizeof (struct nif)); -@@ -417,6 +415,8 @@ - cpp = &n1->ncase.cases; - checkkwd = 2, readtoken(); - do { -+ if (lasttoken == TLP) -+ readtoken(); - *cpp = cp = (union node *)stalloc(sizeof (struct nclist)); - cp->type = NCLIST; - app = &cp->nclist.pattern; -@@ -464,21 +464,22 @@ - break; - /* Handle an empty command like other simple commands. */ - case TSEMI: -+ case TAND: -+ case TOR: -+ case TNL: -+ case TEOF: -+ case TRP: -+ case TBACKGND: - /* - * An empty command before a ; doesn't make much sense, and - * should certainly be disallowed in the case of `if ;'. - */ - if (!redir) - synexpect(-1); -- case TAND: -- case TOR: -- case TNL: -- case TEOF: - case TWORD: -- case TRP: - tokpushback++; - n1 = simplecmd(rpp, redir); -- goto checkneg; -+ return n1; - default: - synexpect(-1); - /* NOTREACHED */ -@@ -502,15 +503,7 @@ - n1->nredir.redirect = redir; - } - --checkneg: -- if (negate) { -- n2 = (union node *)stalloc(sizeof (struct nnot)); -- n2->type = NNOT; -- n2->nnot.com = n1; -- return n2; -- } -- else -- return n1; -+ return n1; - } - - -@@ -520,8 +513,7 @@ - { - union node *args, **app; - union node **orig_rpp = rpp; -- union node *n = NULL, *n2; -- int negate = 0; -+ union node *n = NULL; - - /* If we don't have any redirections already, then we must reset */ - /* rpp to be the address of the local redir variable. */ -@@ -537,12 +529,6 @@ - */ - orig_rpp = rpp; - -- while (readtoken() == TNOT) { -- TRACE(("command: TNOT recognized\n")); -- negate = !negate; -- } -- tokpushback++; -- - for (;;) { - if (readtoken() == TWORD) { - n = (union node *)stalloc(sizeof (struct narg)); -@@ -565,8 +551,9 @@ - synerror("Bad function name"); - #endif - n->type = NDEFUN; -+ checkkwd = 2; - n->narg.next = command(); -- goto checkneg; -+ return n; - } else { - tokpushback++; - break; -@@ -579,16 +566,7 @@ - n->ncmd.backgnd = 0; - n->ncmd.args = args; - n->ncmd.redirect = redir; -- --checkneg: -- if (negate) { -- n2 = (union node *)stalloc(sizeof (struct nnot)); -- n2->type = NNOT; -- n2->nnot.com = n; -- return n2; -- } -- else -- return n; -+ return n; - } - - STATIC union node * -@@ -743,7 +721,7 @@ - } - } - out: -- checkkwd = (t == TNOT) ? savecheckkwd : 0; -+ checkkwd = 0; - } - #ifdef DEBUG - if (!alreadyseen) -@@ -882,6 +860,7 @@ - int varnest; /* levels of variables expansion */ - int arinest; /* levels of arithmetic expansion */ - int parenlevel; /* levels of parens in arithmetic */ -+ int dqvarnest; /* levels of variables expansion within double quotes */ - int oldstyle; - char const *prevsyntax; /* syntax before arithmetic */ - #if __GNUC__ -@@ -892,6 +871,7 @@ - (void) &varnest; - (void) &arinest; - (void) &parenlevel; -+ (void) &dqvarnest; - (void) &oldstyle; - (void) &prevsyntax; - (void) &syntax; -@@ -906,6 +886,7 @@ - varnest = 0; - arinest = 0; - parenlevel = 0; -+ dqvarnest = 0; - - STARTSTACKSTR(out); - loop: { /* for each line, until end of word */ -@@ -938,7 +919,8 @@ - USTPUTC(c, out); - break; - case CCTL: -- if (eofmark == NULL || dblquote) -+ if ((eofmark == NULL || dblquote) && -+ dqvarnest == 0) - USTPUTC(CTLESC, out); - USTPUTC(c, out); - break; -@@ -983,7 +965,8 @@ - if (arinest) { - syntax = ARISYNTAX; - dblquote = 0; -- } else if (eofmark == NULL) { -+ } else if (eofmark == NULL && -+ dqvarnest == 0) { - syntax = BASESYNTAX; - dblquote = 0; - } -@@ -996,6 +979,9 @@ - case CENDVAR: /* '}' */ - if (varnest > 0) { - varnest--; -+ if (dqvarnest > 0) { -+ dqvarnest--; -+ } - USTPUTC(CTLENDVAR, out); - } else { - USTPUTC(c, out); -@@ -1125,6 +1111,8 @@ - np->type = NAPPEND; - else if (c == '&') - np->type = NTOFD; -+ else if (c == '|') -+ np->type = NTOOV; - else { - np->type = NTO; - pungetc(); -@@ -1260,8 +1248,12 @@ - if (dblquote || arinest) - flags |= VSQUOTE; - *(stackblock() + typeloc) = subtype | flags; -- if (subtype != VSNORMAL) -+ if (subtype != VSNORMAL) { - varnest++; -+ if (dblquote) { -+ dqvarnest++; -+ } -+ } - } - goto parsesub_return; - } -diff -Nur ash-0.4.0.orig/redir.c ash-0.4.0.fixed/redir.c ---- ash-0.4.0.orig/redir.c 2000-05-23 05:03:19.000000000 -0500 -+++ ash-0.4.0.fixed/redir.c 2003-10-01 21:08:15.000000000 -0500 -@@ -45,6 +45,7 @@ - #endif - #endif /* not lint */ - -+#include - #include - #include /* PIPE_BUF */ - #include -@@ -66,6 +67,7 @@ - #include "output.h" - #include "memalloc.h" - #include "error.h" -+#include "options.h" - - - #define EMPTY -2 /* marks an unused slot in redirtab */ -@@ -92,8 +94,15 @@ - */ - int fd0_redirected = 0; - --STATIC void openredirect __P((union node *, char[10 ])); -+/* -+ * We also keep track of where fd2 goes. -+ */ -+int fd2 = 2; -+ -+STATIC int openredirect __P((union node *)); -+STATIC void dupredirect __P((union node *, int, char[10 ])); - STATIC int openhere __P((union node *)); -+STATIC int noclobberopen __P((const char *)); - - - /* -@@ -113,6 +122,7 @@ - struct redirtab *sv = NULL; - int i; - int fd; -+ int newfd; - int try; - char memory[10]; /* file descriptors to write to memory */ - -@@ -133,36 +143,47 @@ - n->ndup.dupfd == fd) - continue; /* redirect from/to same file descriptor */ - -- if ((flags & REDIR_PUSH) && sv->renamed[fd] == EMPTY) { -- INTOFF; --again: -- if ((i = fcntl(fd, F_DUPFD, 10)) == -1) { -+ INTOFF; -+ newfd = openredirect(n); -+ if (((flags & REDIR_PUSH) && sv->renamed[fd] == EMPTY) || -+ (fd == fd2)) { -+ if (newfd == fd) { -+ try++; -+ } else if ((i = fcntl(fd, F_DUPFD, 10)) == -1) { - switch (errno) { - case EBADF: - if (!try) { -- openredirect(n, memory); -+ dupredirect(n, newfd, memory); - try++; -- goto again; -+ break; - } - /* FALLTHROUGH*/ - default: -+ if (newfd >= 0) { -+ close(newfd); -+ } - INTON; - error("%d: %s", fd, strerror(errno)); - /* NOTREACHED */ - } - } - if (!try) { -- sv->renamed[fd] = i; - close(fd); -+ if (flags & REDIR_PUSH) { -+ sv->renamed[fd] = i; -+ } -+ if (fd == fd2) { -+ fd2 = i; -+ } - } -- INTON; -- } else { -+ } else if (fd != newfd) { - close(fd); - } - if (fd == 0) - fd0_redirected++; - if (!try) -- openredirect(n, memory); -+ dupredirect(n, newfd, memory); -+ INTON; - } - if (memory[1]) - out1 = &memout; -@@ -171,22 +192,13 @@ - } - - --STATIC void --openredirect(redir, memory) -+STATIC int -+openredirect(redir) - union node *redir; -- char memory[10]; - { -- int fd = redir->nfile.fd; - char *fname; - int f; - -- /* -- * We suppress interrupts so that we won't leave open file -- * descriptors around. This may not be such a good idea because -- * an open of a device or a fifo can block indefinitely. -- */ -- INTOFF; -- memory[fd] = 0; - switch (redir->nfile.type) { - case NFROM: - fname = redir->nfile.expfname; -@@ -199,6 +211,14 @@ - goto ecreate; - break; - case NTO: -+ /* Take care of noclobber mode. */ -+ if (Cflag) { -+ fname = redir->nfile.expfname; -+ if ((f = noclobberopen(fname)) < 0) -+ goto ecreate; -+ break; -+ } -+ case NTOOV: - fname = redir->nfile.expfname; - #ifdef O_CREAT - if ((f = open(fname, O_WRONLY|O_CREAT|O_TRUNC, 0666)) < 0) -@@ -222,32 +242,48 @@ - break; - case NTOFD: - case NFROMFD: -+ f = -1; -+ break; -+ case NHERE: -+ case NXHERE: -+ f = openhere(redir); -+ break; -+ default: -+ abort(); -+ } -+ -+ return f; -+ecreate: -+ error("cannot create %s: %s", fname, errmsg(errno, E_CREAT)); -+eopen: -+ error("cannot open %s: %s", fname, errmsg(errno, E_OPEN)); -+} -+ -+ -+STATIC void -+dupredirect(redir, f, memory) -+ union node *redir; -+ int f; -+ char memory[10]; -+ { -+ int fd = redir->nfile.fd; -+ -+ memory[fd] = 0; -+ if (redir->nfile.type == NTOFD || redir->nfile.type == NFROMFD) { - if (redir->ndup.dupfd >= 0) { /* if not ">&-" */ - if (memory[redir->ndup.dupfd]) - memory[fd] = 1; - else - copyfd(redir->ndup.dupfd, fd); - } -- INTON; - return; -- case NHERE: -- case NXHERE: -- f = openhere(redir); -- break; -- default: -- abort(); - } - - if (f != fd) { - copyfd(f, fd); - close(f); - } -- INTON; - return; --ecreate: -- error("cannot create %s: %s", fname, errmsg(errno, E_CREAT)); --eopen: -- error("cannot open %s: %s", fname, errmsg(errno, E_OPEN)); - } - - -@@ -304,6 +340,7 @@ - struct redirtab *rp = redirlist; - int i; - -+ INTOFF; - for (i = 0 ; i < 10 ; i++) { - if (rp->renamed[i] != EMPTY) { - if (i == 0) -@@ -313,9 +350,11 @@ - copyfd(rp->renamed[i], i); - close(rp->renamed[i]); - } -+ if (rp->renamed[i] == fd2) { -+ fd2 = i; -+ } - } - } -- INTOFF; - redirlist = rp->next; - ckfree(rp); - INTON; -@@ -359,6 +398,9 @@ - for (i = 0 ; i < 10 ; i++) { - if (rp->renamed[i] >= 0) { - close(rp->renamed[i]); -+ if (rp->renamed[i] == fd2) { -+ fd2 = -1; -+ } - } - rp->renamed[i] = EMPTY; - } -@@ -389,3 +431,62 @@ - } - return newfd; - } -+ -+/* -+ * Open a file in noclobber mode. -+ * The code was copied from bash. -+ */ -+int -+noclobberopen(fname) -+ const char *fname; -+{ -+ int r, fd; -+ struct stat finfo, finfo2; -+ -+ /* -+ * If the file exists and is a regular file, return an error -+ * immediately. -+ */ -+ r = stat(fname, &finfo); -+ if (r == 0 && S_ISREG(finfo.st_mode)) { -+ errno = EEXIST; -+ return -1; -+ } -+ -+ /* -+ * If the file was not present (r != 0), make sure we open it -+ * exclusively so that if it is created before we open it, our open -+ * will fail. Make sure that we do not truncate an existing file. -+ * Note that we don't turn on O_EXCL unless the stat failed -- if the -+ * file was not a regular file, we leave O_EXCL off. -+ */ -+ if (r != 0) -+ return open(fname, O_WRONLY|O_CREAT|O_EXCL, 0666); -+ fd = open(fname, O_WRONLY|O_CREAT, 0666); -+ -+ /* If the open failed, return the file descriptor right away. */ -+ if (fd < 0) -+ return fd; -+ -+ /* -+ * OK, the open succeeded, but the file may have been changed from a -+ * non-regular file to a regular file between the stat and the open. -+ * We are assuming that the O_EXCL open handles the case where FILENAME -+ * did not exist and is symlinked to an existing file between the stat -+ * and open. -+ */ -+ -+ /* -+ * If we can open it and fstat the file descriptor, and neither check -+ * revealed that it was a regular file, and the file has not been -+ * replaced, return the file descriptor. -+ */ -+ if (fstat(fd, &finfo2) == 0 && !S_ISREG(finfo2.st_mode) && -+ finfo.st_dev == finfo2.st_dev && finfo.st_ino == finfo2.st_ino) -+ return fd; -+ -+ /* The file has been replaced. badness. */ -+ close(fd); -+ errno = EEXIST; -+ return -1; -+} -diff -Nur ash-0.4.0.orig/redir.h ash-0.4.0.fixed/redir.h ---- ash-0.4.0.orig/redir.h 2000-05-23 05:03:19.000000000 -0500 -+++ ash-0.4.0.fixed/redir.h 2003-10-01 21:08:15.000000000 -0500 -@@ -42,6 +42,8 @@ - #define REDIR_PUSH 01 /* save previous values of file descriptors */ - #define REDIR_BACKQ 02 /* save the command output in memory */ - -+extern int fd2; -+ - union node; - void redirect __P((union node *, int)); - void popredir __P((void)); -diff -Nur ash-0.4.0.orig/setmode.c ash-0.4.0.fixed/setmode.c ---- ash-0.4.0.orig/setmode.c 1969-12-31 18:00:00.000000000 -0600 -+++ ash-0.4.0.fixed/setmode.c 2003-10-01 21:08:15.000000000 -0500 -@@ -0,0 +1,486 @@ -+/* $NetBSD: setmode.c,v 1.28 2000/01/25 15:43:43 enami Exp $ */ -+ -+/* -+ * Copyright (c) 1989, 1993, 1994 -+ * The Regents of the University of California. All rights reserved. -+ * -+ * This code is derived from software contributed to Berkeley by -+ * Dave Borman at Cray Research, Inc. -+ * -+ * Redistribution and use in source and binary forms, with or without -+ * modification, are permitted provided that the following conditions -+ * are met: -+ * 1. Redistributions of source code must retain the above copyright -+ * notice, this list of conditions and the following disclaimer. -+ * 2. Redistributions in binary form must reproduce the above copyright -+ * notice, this list of conditions and the following disclaimer in the -+ * documentation and/or other materials provided with the distribution. -+ * 3. All advertising materials mentioning features or use of this software -+ * must display the following acknowledgement: -+ * This product includes software developed by the University of -+ * California, Berkeley and its contributors. -+ * 4. Neither the name of the University nor the names of its contributors -+ * may be used to endorse or promote products derived from this software -+ * without specific prior written permission. -+ * -+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -+ * SUCH DAMAGE. -+ */ -+ -+#include -+#if defined(LIBC_SCCS) && !defined(lint) -+#if 0 -+static char sccsid[] = "@(#)setmode.c 8.2 (Berkeley) 3/25/94"; -+#else -+__RCSID("$NetBSD: setmode.c,v 1.28 2000/01/25 15:43:43 enami Exp $"); -+#endif -+#endif /* LIBC_SCCS and not lint */ -+ -+#include -+#include -+ -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#ifdef SETMODE_DEBUG -+#include -+#endif -+ -+#ifdef __weak_alias -+__weak_alias(getmode,_getmode) -+__weak_alias(setmode,_setmode) -+#endif -+ -+#ifdef __GLIBC__ -+#define S_ISTXT __S_ISVTX -+#endif -+ -+#define SET_LEN 6 /* initial # of bitcmd struct to malloc */ -+#define SET_LEN_INCR 4 /* # of bitcmd structs to add as needed */ -+ -+typedef struct bitcmd { -+ char cmd; -+ char cmd2; -+ mode_t bits; -+} BITCMD; -+ -+#define CMD2_CLR 0x01 -+#define CMD2_SET 0x02 -+#define CMD2_GBITS 0x04 -+#define CMD2_OBITS 0x08 -+#define CMD2_UBITS 0x10 -+ -+static BITCMD *addcmd __P((BITCMD *, int, int, int, u_int)); -+static void compress_mode __P((BITCMD *)); -+#ifdef SETMODE_DEBUG -+static void dumpmode __P((BITCMD *)); -+#endif -+ -+/* -+ * Given the old mode and an array of bitcmd structures, apply the operations -+ * described in the bitcmd structures to the old mode, and return the new mode. -+ * Note that there is no '=' command; a strict assignment is just a '-' (clear -+ * bits) followed by a '+' (set bits). -+ */ -+mode_t -+getmode(bbox, omode) -+ const void *bbox; -+ mode_t omode; -+{ -+ const BITCMD *set; -+ mode_t clrval, newmode, value; -+ -+ _DIAGASSERT(bbox != NULL); -+ -+ set = (const BITCMD *)bbox; -+ newmode = omode; -+ for (value = 0;; set++) -+ switch(set->cmd) { -+ /* -+ * When copying the user, group or other bits around, we "know" -+ * where the bits are in the mode so that we can do shifts to -+ * copy them around. If we don't use shifts, it gets real -+ * grundgy with lots of single bit checks and bit sets. -+ */ -+ case 'u': -+ value = (newmode & S_IRWXU) >> 6; -+ goto common; -+ -+ case 'g': -+ value = (newmode & S_IRWXG) >> 3; -+ goto common; -+ -+ case 'o': -+ value = newmode & S_IRWXO; -+common: if (set->cmd2 & CMD2_CLR) { -+ clrval = -+ (set->cmd2 & CMD2_SET) ? S_IRWXO : value; -+ if (set->cmd2 & CMD2_UBITS) -+ newmode &= ~((clrval<<6) & set->bits); -+ if (set->cmd2 & CMD2_GBITS) -+ newmode &= ~((clrval<<3) & set->bits); -+ if (set->cmd2 & CMD2_OBITS) -+ newmode &= ~(clrval & set->bits); -+ } -+ if (set->cmd2 & CMD2_SET) { -+ if (set->cmd2 & CMD2_UBITS) -+ newmode |= (value<<6) & set->bits; -+ if (set->cmd2 & CMD2_GBITS) -+ newmode |= (value<<3) & set->bits; -+ if (set->cmd2 & CMD2_OBITS) -+ newmode |= value & set->bits; -+ } -+ break; -+ -+ case '+': -+ newmode |= set->bits; -+ break; -+ -+ case '-': -+ newmode &= ~set->bits; -+ break; -+ -+ case 'X': -+ if (omode & (S_IFDIR|S_IXUSR|S_IXGRP|S_IXOTH)) -+ newmode |= set->bits; -+ break; -+ -+ case '\0': -+ default: -+#ifdef SETMODE_DEBUG -+ (void)printf("getmode:%04o -> %04o\n", omode, newmode); -+#endif -+ return (newmode); -+ } -+} -+ -+#define ADDCMD(a, b, c, d) do { \ -+ if (set >= endset) { \ -+ BITCMD *newset; \ -+ setlen += SET_LEN_INCR; \ -+ newset = realloc(saveset, sizeof(BITCMD) * setlen); \ -+ if (newset == NULL) { \ -+ free(saveset); \ -+ return (NULL); \ -+ } \ -+ set = newset + (set - saveset); \ -+ saveset = newset; \ -+ endset = newset + (setlen - 2); \ -+ } \ -+ set = addcmd(set, (a), (b), (c), (d)); \ -+} while (/*CONSTCOND*/0) -+ -+#define STANDARD_BITS (S_ISUID|S_ISGID|S_IRWXU|S_IRWXG|S_IRWXO) -+ -+void * -+setmode(p) -+ const char *p; -+{ -+ int perm, who; -+ char op, *ep; -+ BITCMD *set, *saveset, *endset; -+ sigset_t sigset, sigoset; -+ mode_t mask; -+ int equalopdone = 0; /* pacify gcc */ -+ int permXbits, setlen; -+ -+ if (!*p) -+ return (NULL); -+ -+ /* -+ * Get a copy of the mask for the permissions that are mask relative. -+ * Flip the bits, we want what's not set. Since it's possible that -+ * the caller is opening files inside a signal handler, protect them -+ * as best we can. -+ */ -+ sigfillset(&sigset); -+ (void)sigprocmask(SIG_BLOCK, &sigset, &sigoset); -+ (void)umask(mask = umask(0)); -+ mask = ~mask; -+ (void)sigprocmask(SIG_SETMASK, &sigoset, NULL); -+ -+ setlen = SET_LEN + 2; -+ -+ if ((set = malloc((u_int)(sizeof(BITCMD) * setlen))) == NULL) -+ return (NULL); -+ saveset = set; -+ endset = set + (setlen - 2); -+ -+ /* -+ * If an absolute number, get it and return; disallow non-octal digits -+ * or illegal bits. -+ */ -+ if (isdigit((unsigned char)*p)) { -+ perm = (mode_t)strtol(p, &ep, 8); -+ if (*ep || perm & ~(STANDARD_BITS|S_ISTXT)) { -+ free(saveset); -+ return (NULL); -+ } -+ ADDCMD('=', (STANDARD_BITS|S_ISTXT), perm, mask); -+ set->cmd = 0; -+ return (saveset); -+ } -+ -+ /* -+ * Build list of structures to set/clear/copy bits as described by -+ * each clause of the symbolic mode. -+ */ -+ for (;;) { -+ /* First, find out which bits might be modified. */ -+ for (who = 0;; ++p) { -+ switch (*p) { -+ case 'a': -+ who |= STANDARD_BITS; -+ break; -+ case 'u': -+ who |= S_ISUID|S_IRWXU; -+ break; -+ case 'g': -+ who |= S_ISGID|S_IRWXG; -+ break; -+ case 'o': -+ who |= S_IRWXO; -+ break; -+ default: -+ goto getop; -+ } -+ } -+ -+getop: if ((op = *p++) != '+' && op != '-' && op != '=') { -+ free(saveset); -+ return (NULL); -+ } -+ if (op == '=') -+ equalopdone = 0; -+ -+ who &= ~S_ISTXT; -+ for (perm = 0, permXbits = 0;; ++p) { -+ switch (*p) { -+ case 'r': -+ perm |= S_IRUSR|S_IRGRP|S_IROTH; -+ break; -+ case 's': -+ /* -+ * If specific bits where requested and -+ * only "other" bits ignore set-id. -+ */ -+ if (who == 0 || (who & ~S_IRWXO)) -+ perm |= S_ISUID|S_ISGID; -+ break; -+ case 't': -+ /* -+ * If specific bits where requested and -+ * only "other" bits ignore set-id. -+ */ -+ if (who == 0 || (who & ~S_IRWXO)) { -+ who |= S_ISTXT; -+ perm |= S_ISTXT; -+ } -+ break; -+ case 'w': -+ perm |= S_IWUSR|S_IWGRP|S_IWOTH; -+ break; -+ case 'X': -+ permXbits = S_IXUSR|S_IXGRP|S_IXOTH; -+ break; -+ case 'x': -+ perm |= S_IXUSR|S_IXGRP|S_IXOTH; -+ break; -+ case 'u': -+ case 'g': -+ case 'o': -+ /* -+ * When ever we hit 'u', 'g', or 'o', we have -+ * to flush out any partial mode that we have, -+ * and then do the copying of the mode bits. -+ */ -+ if (perm) { -+ ADDCMD(op, who, perm, mask); -+ perm = 0; -+ } -+ if (op == '=') -+ equalopdone = 1; -+ if (op == '+' && permXbits) { -+ ADDCMD('X', who, permXbits, mask); -+ permXbits = 0; -+ } -+ ADDCMD(*p, who, op, mask); -+ break; -+ -+ default: -+ /* -+ * Add any permissions that we haven't already -+ * done. -+ */ -+ if (perm || (op == '=' && !equalopdone)) { -+ if (op == '=') -+ equalopdone = 1; -+ ADDCMD(op, who, perm, mask); -+ perm = 0; -+ } -+ if (permXbits) { -+ ADDCMD('X', who, permXbits, mask); -+ permXbits = 0; -+ } -+ goto apply; -+ } -+ } -+ -+apply: if (!*p) -+ break; -+ if (*p != ',') -+ goto getop; -+ ++p; -+ } -+ set->cmd = 0; -+#ifdef SETMODE_DEBUG -+ (void)printf("Before compress_mode()\n"); -+ dumpmode(saveset); -+#endif -+ compress_mode(saveset); -+#ifdef SETMODE_DEBUG -+ (void)printf("After compress_mode()\n"); -+ dumpmode(saveset); -+#endif -+ return (saveset); -+} -+ -+static BITCMD * -+addcmd(set, op, who, oparg, mask) -+ BITCMD *set; -+ int oparg, who; -+ int op; -+ u_int mask; -+{ -+ -+ _DIAGASSERT(set != NULL); -+ -+ switch (op) { -+ case '=': -+ set->cmd = '-'; -+ set->bits = who ? who : STANDARD_BITS; -+ set++; -+ -+ op = '+'; -+ /* FALLTHROUGH */ -+ case '+': -+ case '-': -+ case 'X': -+ set->cmd = op; -+ set->bits = (who ? who : mask) & oparg; -+ break; -+ -+ case 'u': -+ case 'g': -+ case 'o': -+ set->cmd = op; -+ if (who) { -+ set->cmd2 = ((who & S_IRUSR) ? CMD2_UBITS : 0) | -+ ((who & S_IRGRP) ? CMD2_GBITS : 0) | -+ ((who & S_IROTH) ? CMD2_OBITS : 0); -+ set->bits = (mode_t)~0; -+ } else { -+ set->cmd2 = CMD2_UBITS | CMD2_GBITS | CMD2_OBITS; -+ set->bits = mask; -+ } -+ -+ if (oparg == '+') -+ set->cmd2 |= CMD2_SET; -+ else if (oparg == '-') -+ set->cmd2 |= CMD2_CLR; -+ else if (oparg == '=') -+ set->cmd2 |= CMD2_SET|CMD2_CLR; -+ break; -+ } -+ return (set + 1); -+} -+ -+#ifdef SETMODE_DEBUG -+static void -+dumpmode(set) -+ BITCMD *set; -+{ -+ -+ _DIAGASSERT(set != NULL); -+ -+ for (; set->cmd; ++set) -+ (void)printf("cmd: '%c' bits %04o%s%s%s%s%s%s\n", -+ set->cmd, set->bits, set->cmd2 ? " cmd2:" : "", -+ set->cmd2 & CMD2_CLR ? " CLR" : "", -+ set->cmd2 & CMD2_SET ? " SET" : "", -+ set->cmd2 & CMD2_UBITS ? " UBITS" : "", -+ set->cmd2 & CMD2_GBITS ? " GBITS" : "", -+ set->cmd2 & CMD2_OBITS ? " OBITS" : ""); -+} -+#endif -+ -+/* -+ * Given an array of bitcmd structures, compress by compacting consecutive -+ * '+', '-' and 'X' commands into at most 3 commands, one of each. The 'u', -+ * 'g' and 'o' commands continue to be separate. They could probably be -+ * compacted, but it's not worth the effort. -+ */ -+static void -+compress_mode(set) -+ BITCMD *set; -+{ -+ BITCMD *nset; -+ int setbits, clrbits, Xbits, op; -+ -+ _DIAGASSERT(set != NULL); -+ -+ for (nset = set;;) { -+ /* Copy over any 'u', 'g' and 'o' commands. */ -+ while ((op = nset->cmd) != '+' && op != '-' && op != 'X') { -+ *set++ = *nset++; -+ if (!op) -+ return; -+ } -+ -+ for (setbits = clrbits = Xbits = 0;; nset++) { -+ if ((op = nset->cmd) == '-') { -+ clrbits |= nset->bits; -+ setbits &= ~nset->bits; -+ Xbits &= ~nset->bits; -+ } else if (op == '+') { -+ setbits |= nset->bits; -+ clrbits &= ~nset->bits; -+ Xbits &= ~nset->bits; -+ } else if (op == 'X') -+ Xbits |= nset->bits & ~setbits; -+ else -+ break; -+ } -+ if (clrbits) { -+ set->cmd = '-'; -+ set->cmd2 = 0; -+ set->bits = clrbits; -+ set++; -+ } -+ if (setbits) { -+ set->cmd = '+'; -+ set->cmd2 = 0; -+ set->bits = setbits; -+ set++; -+ } -+ if (Xbits) { -+ set->cmd = 'X'; -+ set->cmd2 = 0; -+ set->bits = Xbits; -+ set++; -+ } -+ } -+} -diff -Nur ash-0.4.0.orig/sh.1 ash-0.4.0.fixed/sh.1 ---- ash-0.4.0.orig/sh.1 2001-01-12 10:50:40.000000000 -0600 -+++ ash-0.4.0.fixed/sh.1 2003-10-01 21:08:15.000000000 -0500 -@@ -649,7 +649,7 @@ - they were one program: - .Pp - .Bd -literal -offset indent --{ echo -n \*q hello \*q ; echo \*q world" } > greeting -+{ echo \*q hello \\c\*q ; echo \*q world" } > greeting - .Ed - .Pp - .Ss Functions -@@ -1306,14 +1306,16 @@ - will continue to print the old name for the directory. - .It Xo read Op Fl p Ar prompt - .Op Fl r --.Op Ar variable... -+.Ar variable... - .Xc - The prompt is printed if the - .Fl p - option is specified and the standard input is a terminal. Then a line is - read from the standard input. The trailing newline is deleted from the - line and the line is split as described in the section on word splitting --above, and the pieces are assigned to the variables in order. If there are -+above, and the pieces are assigned to the variables in order. -+At least one variable must be specified. -+If there are - more pieces than variables, the remaining pieces (along with the - characters in - .Ev IFS -@@ -1394,6 +1396,9 @@ - by one. If there are zero positional parameters, - .Ic shift - does nothing. -+.It times -+Print the accumulated user and system times for the shell and for processes -+run from the shell. The return status is 0. - .It Xo trap - .Op Ar action - .Ar signal... -diff -Nur ash-0.4.0.orig/show.c ash-0.4.0.fixed/show.c ---- ash-0.4.0.orig/show.c 1999-10-09 06:02:09.000000000 -0500 -+++ ash-0.4.0.fixed/show.c 2003-10-01 21:08:15.000000000 -0500 -@@ -155,6 +155,7 @@ - case NTO: s = ">"; dftfd = 1; break; - case NAPPEND: s = ">>"; dftfd = 1; break; - case NTOFD: s = ">&"; dftfd = 1; break; -+ case NTOOV: s = ">|"; dftfd = 1; break; - case NFROM: s = "<"; dftfd = 0; break; - case NFROMFD: s = "<&"; dftfd = 0; break; - case NFROMTO: s = "<>"; dftfd = 0; break; -diff -Nur ash-0.4.0.orig/trap.c ash-0.4.0.fixed/trap.c ---- ash-0.4.0.orig/trap.c 2000-05-23 05:03:19.000000000 -0500 -+++ ash-0.4.0.fixed/trap.c 2003-10-01 21:08:15.000000000 -0500 -@@ -62,7 +62,11 @@ - #include "error.h" - #include "trap.h" - #include "mystring.h" -+#include "mail.h" - -+#ifdef HETIO -+#include "hetio.h" -+#endif - - /* - * Sigmode records the current value of the signal handlers for the various -@@ -84,7 +88,7 @@ - char gotsig[NSIG]; /* indicates specified signal received */ - int pendingsigs; /* indicates some signal received */ - --static int getsigaction __P((int, sig_t *)); -+extern char *signal_names[]; - - /* - * The trap builtin. -@@ -107,16 +111,20 @@ - return 0; - } - ap = argv + 1; -- if (is_number(*ap)) -+ if (argc == 2) - action = NULL; - else - action = *ap++; - while (*ap) { -- if ((signo = number(*ap)) < 0 || signo > NSIG) -+ if ((signo = decode_signal(*ap)) < 0) - error("%s: bad trap", *ap); - INTOFF; -- if (action) -- action = savestr(action); -+ if (action) { -+ if (action[0] == '-' && action[1] == '\0') -+ action = NULL; -+ else -+ action = savestr(action); -+ } - if (trap[signo]) - ckfree(trap[signo]); - trap[signo] = action; -@@ -157,13 +165,13 @@ - * out what it should be set to. - */ - --long -+void - setsignal(signo) - int signo; - { - int action; -- sig_t sigact = SIG_DFL; - char *t; -+ struct sigaction act; - - if ((t = trap[signo]) == NULL) - action = S_DFL; -@@ -206,15 +214,15 @@ - /* - * current setting unknown - */ -- if (!getsigaction(signo, &sigact)) { -+ if (sigaction(signo, 0, &act) == -1) { - /* - * Pretend it worked; maybe we should give a warning - * here, but other shells don't. We don't alter - * sigmode, so that we retry every time. - */ -- return 0; -+ return; - } -- if (sigact == SIG_IGN) { -+ if (act.sa_handler == SIG_IGN) { - if (mflag && (signo == SIGTSTP || - signo == SIGTTIN || signo == SIGTTOU)) { - *t = S_IGN; /* don't hard ignore these */ -@@ -225,31 +233,21 @@ - } - } - if (*t == S_HARD_IGN || *t == action) -- return 0; -+ return; - switch (action) { -- case S_DFL: sigact = SIG_DFL; break; -- case S_CATCH: sigact = onsig; break; -- case S_IGN: sigact = SIG_IGN; break; -+ case S_CATCH: -+ act.sa_handler = onsig; -+ break; -+ case S_IGN: -+ act.sa_handler = SIG_IGN; -+ break; -+ default: -+ act.sa_handler = SIG_DFL; - } - *t = action; -- siginterrupt(signo, 1); -- return (long)signal(signo, sigact); --} -- --/* -- * Return the current setting for sig w/o changing it. -- */ --static int --getsigaction(signo, sigact) -- int signo; -- sig_t *sigact; --{ -- struct sigaction sa; -- -- if (sigaction(signo, (struct sigaction *)0, &sa) == -1) -- return 0; -- *sigact = (sig_t) sa.sa_handler; -- return 1; -+ act.sa_flags = 0; -+ sigemptyset(&act.sa_mask); -+ sigaction(signo, &act, 0); - } - - /* -@@ -347,6 +345,7 @@ - setsignal(SIGINT); - setsignal(SIGQUIT); - setsignal(SIGTERM); -+ chkmail(1); - is_interactive = on; - } - -@@ -364,6 +363,9 @@ - char *p; - - TRACE(("exitshell(%d) pid=%d\n", status, getpid())); -+#ifdef HETIO -+ hetio_reset_term(); -+#endif - if (setjmp(loc1.loc)) { - goto l1; - } -@@ -383,3 +385,17 @@ - l2: _exit(status); - /* NOTREACHED */ - } -+ -+int decode_signal(const char *string) -+{ -+ int signo; -+ -+ if (is_number(string)) return atoi(string); -+ -+ for (signo=0; signo < NSIG; signo++) -+ if (strcasecmp(string, signal_names[signo]) == 0 || -+ strcasecmp(string, &(signal_names[signo])[3]) == 0) -+ return signo; -+ -+ return -1; -+} -diff -Nur ash-0.4.0.orig/trap.h ash-0.4.0.fixed/trap.h ---- ash-0.4.0.orig/trap.h 2000-05-23 05:03:19.000000000 -0500 -+++ ash-0.4.0.fixed/trap.h 2003-10-01 21:08:15.000000000 -0500 -@@ -42,9 +42,10 @@ - - int trapcmd __P((int, char **)); - void clear_traps __P((void)); --long setsignal __P((int)); -+void setsignal __P((int)); - void ignoresig __P((int)); - void onsig __P((int)); - void dotrap __P((void)); - void setinteractive __P((int)); - void exitshell __P((int)) __attribute__((noreturn)); -+int decode_signal __P((const char *)); -diff -Nur ash-0.4.0.orig/var.c ash-0.4.0.fixed/var.c ---- ash-0.4.0.orig/var.c 2001-01-12 10:50:40.000000000 -0600 -+++ ash-0.4.0.fixed/var.c 2003-10-01 21:08:15.000000000 -0500 -@@ -114,7 +114,7 @@ - NULL }, - { &vmpath, VSTRFIXED|VTEXTFIXED|VUNSET, "MAILPATH=", - NULL }, -- { &vpath, VSTRFIXED|VTEXTFIXED, "PATH=" _PATH_DEFPATH, -+ { &vpath, VSTRFIXED|VTEXTFIXED, "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", - changepath }, - /* - * vps1 depends on uid -@@ -138,13 +138,16 @@ - - /* - * Initialize the varable symbol tables and import the environment -+ * Setting PWD added by herbert - */ - - #ifdef mkinit -+INCLUDE "cd.h" - INCLUDE "var.h" - INIT { - char **envp; - extern char **environ; -+ extern char *curdir; - - initvar(); - for (envp = environ ; *envp ; envp++) { -@@ -152,6 +155,9 @@ - setvareq(*envp, VEXPORT|VTEXTFIXED); - } - } -+ -+ getpwd(); -+ setvar("PWD", curdir, VEXPORT|VTEXTFIXED); - } - #endif - -@@ -166,6 +172,7 @@ - const struct varinit *ip; - struct var *vp; - struct var **vpp; -+ char ppid[30]; - - for (ip = varinit ; (vp = ip->var) != NULL ; ip++) { - if ((vp->flags & VEXPORT) == 0) { -@@ -187,6 +194,9 @@ - vps1.text = strdup(geteuid() ? "PS1=$ " : "PS1=# "); - vps1.flags = VSTRFIXED|VTEXTFIXED; - } -+ -+ snprintf(ppid, 29, "%ld", (long)getppid()); -+ setvar("PPID", ppid, VREADONLY|VNOFUNC); - } - - /* -@@ -283,6 +293,7 @@ - struct var *vp, **vpp; - - vpp = hashvar(s); -+ flags |= (VEXPORT & (((unsigned) (1 - aflag)) - 1)); - for (vp = *vpp ; vp ; vp = vp->next) { - if (varequal(s, vp->text)) { - if (vp->flags & VREADONLY) { -@@ -305,7 +316,8 @@ - * We could roll this to a function, to handle it as - * a regular variable function callback, but why bother? - */ -- if (vp == &vmpath || (vp == &vmail && ! mpathset())) -+ if (iflag && -+ (vp == &vmpath || (vp == &vmail && ! mpathset()))) - chkmail(1); - INTON; - return; rmfile ./source/apps/ash/ash-0.4.0.diff } From boobaa at frugalware.org Sun Jun 3 22:03:19 2007 From: boobaa at frugalware.org (CSÉCSY László) Date: Sun Jun 3 22:03:22 2007 Subject: [Frugalware-darcs] frugalware-current: kernel-2.6.21-2-i686 Message-ID: <20070603200320.0F2781768137@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070603195723-60d9d-af8f22587f76dc4ed97c63f920db0024343a9e13.gz; [kernel-2.6.21-2-i686 CSÉCSY László **20070603195723 added boot support for Promise SuperTrak EX HW RAID cards ] { hunk ./source/base/kernel/config 1313 -CONFIG_SCSI_STEX=m +CONFIG_SCSI_STEX=y } From boobaa at frugalware.org Sun Jun 3 22:27:29 2007 From: boobaa at frugalware.org (CSÉCSY László) Date: Sun Jun 3 22:27:32 2007 Subject: [Frugalware-darcs] frugalware-current: kernel-xen0-2.6.19-2-i686 Message-ID: <20070603202729.8E38F1768138@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070603201956-60d9d-16bb524200d882009dcad970b0cd7e96234d8b0f.gz; [kernel-xen0-2.6.19-2-i686 CSÉCSY László **20070603201956 added boot support for Promise SuperTrak EX HW RAID cards ] { hunk ./source/base-extra/kernel-xen0/config 1195 -# CONFIG_SCSI_STEX is not set +CONFIG_SCSI_STEX=y } From vmiklos at frugalware.org Sun Jun 3 22:34:21 2007 From: vmiklos at frugalware.org (VMiklos) Date: Sun Jun 3 22:34:25 2007 Subject: [Frugalware-darcs] frugalware-current: docs/makepkg.txt: a note about the 100k limit Message-ID: <20070603203422.62EE21868007@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070603203011-e2957-e6234882a16765091a928a90d31cfd7c5436f4b9.gz; [docs/makepkg.txt: a note about the 100k limit VMiklos **20070603203011] { hunk ./docs/makepkg.txt 293 + +A few words about the size of the sources. If you use an URL then the size is +almost unlimited, but if the source is not an url then the source will be added +to the FST when the package will be accepted. We don't allow files bigger than +100KB in FST. To solve this problem, the sources for a given package are placed +in the /pub/other/sources/pkgname dir for each package. If the source is not +compressed, we use gzip or bzip2 to compess it first. After this one can use a +`http://ftp.frugalware.org/pub/other/sources/pkgname/foo`-styled URL for those +big sources. } From pootle at frugalware.org Sun Jun 3 23:07:40 2007 From: pootle at frugalware.org (Pootle) Date: Sun Jun 3 23:07:44 2007 Subject: [Frugalware-darcs] translations: Commit from Pootle by user hermier. 1525 of 1531 messages translated (0 fuzzy). Message-ID: <20070603210740.DF3FE1768138@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=translations;a=darcs_commitdiff;h=20070603210723-635f8-2834b56c6bc7a32b3844bce24213b99313c46f9d.gz; [Commit from Pootle by user hermier. 1525 of 1531 messages translated (0 fuzzy). Pootle **20070603210723] { hunk ./po/docs/fr/docs.po 9 -"POT-Creation-Date: 2007-05-31 05:11+0200\n" -"PO-Revision-Date: 2007-05-31 08:23+0200\n" +"POT-Creation-Date: 2007-06-03 05:15+0200\n" +"PO-Revision-Date: 2007-06-03 23:07+0200\n" hunk ./po/docs/fr/docs.po 6061 +"GNU Classpath et l'implémentation de sécurité de la libgcj est en cour de " +"développement, mais ne sont pas prêt pour etre déclarer sûr. " +"Particulièrement, ils ne peuvent pas exécuter de façcon sûre des applets non " +"certifiées." hunk ./po/docs/fr/docs.po 6081 -msgstr "" +msgstr "- http et DNS peuvent être détourné ce qui veut dire que l'on ne peut avoir " +"confience en l'URL visible dans la boite de dialogue.\n" hunk ./po/docs/fr/docs.po 6113 +"ACTUELLEMENT GCJWEBPLUGIN FONCTIONNE SANS GESTIONNAIRE DE SÉCURITÉ. CELA " +"SIGNIFIE QUE LES APPLETS PEUVENT FAIRE TOUT CE QUE LES APPLICATIONS JAVA, " +"QUE VOUS TÉLÉCHARGEZ ET EXÉCUTEZ, PEUVENT FAIRE. FAITES *TRÈS* ATTENTION AUX " +"APPLETS QUE VOUS EXÉCUTEZ. N'UTILISEZ PAS GCJWEBPLUGIN SUR VOTRE SYSTÈME SI " +"IL CONTIENT DES DONNÉES SENSIBLES. CES DONNES PEUVENT ÊTRE DÉTRUITES OU " +"VOLÉES." hunk ./po/docs/fr/docs.po 6182 -msgstr "" +msgstr "ensuite dans la console de GDB, tapez" hunk ./po/docs/fr/docs.po 8714 +"Après avoir installé trac vous devez effectué quelques étapes supplémentaire " +"pour la configuré. Tout d'abord, n'oubliez pas d'installer " +"postgresql/mysql/sqlite en fonction de la base de données que vous voulez " +"utiliser." hunk ./po/docs/fr/docs.po 8763 +"Puis, démarrez votre navigateur internet favori et visitez " +"http://localhost:8000" hunk ./po/docs/fr/docs.po 8772 +"Pour plus de documentation sur trac, pour savoir comment le configurer avec " +"différents démons HTTP allez consulté le " +"http://trac.edgewall.org/wiki/TracGuide[Guide de Trac]" } From vmiklos at frugalware.org Mon Jun 4 00:45:50 2007 From: vmiklos at frugalware.org (VMiklos) Date: Mon Jun 4 00:45:59 2007 Subject: [Frugalware-darcs] frugalware-current: gcc-4.2.0-4-i686 Message-ID: <20070603224550.894FD1768138@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070603204457-e2957-6ffcb54a3831e7499770e5fd9c16072b310ae2b8.gz; [gcc-4.2.0-4-i686 VMiklos **20070603204457 moved 125227.diff to ftp ] { hunk ./source/devel/gcc/125227.diff 1 -2007-05-27 Daniel Berlin - - Fix PR/30052 - Backport PTA solver from mainline - - * pointer-set.c: Copy from mainline - * pointer-set.h: Ditto. - * tree-ssa-structalias.c: Copy solver portions from mainline. - * Makefile.in (tree-ssa-structalias.o): Update dependencies - -Index: gcc/pointer-set.c -=================================================================== ---- a/gcc/pointer-set.c (revision 125226) -+++ b/gcc/pointer-set.c (revision 125227) -@@ -22,13 +22,12 @@ - #include "system.h" - #include "pointer-set.h" - --/* A pointer sets is represented as a simple open-addressing hash -+/* A pointer set is represented as a simple open-addressing hash - table. Simplifications: The hash code is based on the value of the - pointer, not what it points to. The number of buckets is always a - power of 2. Null pointers are a reserved value. Deletion is not -- supported. There is no mechanism for user control of hash -- function, equality comparison, initial size, or resizing policy. --*/ -+ supported (yet). There is no mechanism for user control of hash -+ function, equality comparison, initial size, or resizing policy. */ - - struct pointer_set_t - { -@@ -114,22 +113,16 @@ - } - } - --/* Subroutine of pointer_set_insert. Inserts P into an empty -- element of SLOTS, an array of length N_SLOTS. Returns nonzero -- if P was already present in N_SLOTS. */ --static int -+/* Subroutine of pointer_set_insert. Return the insertion slot for P into -+ an empty element of SLOTS, an array of length N_SLOTS. */ -+static inline size_t - insert_aux (void *p, void **slots, size_t n_slots, size_t log_slots) - { - size_t n = hash1 (p, n_slots, log_slots); - while (true) - { -- if (slots[n] == p) -- return 1; -- else if (slots[n] == 0) -- { -- slots[n] = p; -- return 0; -- } -+ if (slots[n] == p || slots[n] == 0) -+ return n; - else - { - ++n; -@@ -144,12 +137,10 @@ - int - pointer_set_insert (struct pointer_set_t *pset, void *p) - { -- if (insert_aux (p, pset->slots, pset->n_slots, pset->log_slots)) -- return 1; -- -- /* We've inserted a new element. Expand the table if necessary to keep -- the load factor small. */ -- ++pset->n_elements; -+ size_t n; -+ -+ /* For simplicity, expand the set even if P is already there. This can be -+ superfluous but can happen at most once. */ - if (pset->n_elements > pset->n_slots / 4) - { - size_t new_log_slots = pset->log_slots + 1; -@@ -158,9 +149,10 @@ - size_t i; - - for (i = 0; i < pset->n_slots; ++i) -- { -- if (pset->slots[i]) -- insert_aux (pset->slots[i], new_slots, new_n_slots, new_log_slots); -+ { -+ void *value = pset->slots[i]; -+ n = insert_aux (value, new_slots, new_n_slots, new_log_slots); -+ new_slots[n] = value; - } - - XDELETEVEC (pset->slots); -@@ -169,5 +161,144 @@ - pset->slots = new_slots; - } - -+ n = insert_aux (p, pset->slots, pset->n_slots, pset->log_slots); -+ if (pset->slots[n]) -+ return 1; -+ -+ pset->slots[n] = p; -+ ++pset->n_elements; - return 0; - } -+ -+/* Pass each pointer in PSET to the function in FN, together with the fixed -+ parameter DATA. If FN returns false, the iteration stops. */ -+ -+void pointer_set_traverse (struct pointer_set_t *pset, -+ bool (*fn) (void *, void *), void *data) -+{ -+ size_t i; -+ for (i = 0; i < pset->n_slots; ++i) -+ if (pset->slots[i] && !fn (pset->slots[i], data)) -+ break; -+} -+ -+ -+/* A pointer map is represented the same way as a pointer_set, so -+ the hash code is based on the address of the key, rather than -+ its contents. Null keys are a reserved value. Deletion is not -+ supported (yet). There is no mechanism for user control of hash -+ function, equality comparison, initial size, or resizing policy. */ -+ -+struct pointer_map_t -+{ -+ size_t log_slots; -+ size_t n_slots; /* n_slots = 2^log_slots */ -+ size_t n_elements; -+ -+ void **keys; -+ void **values; -+}; -+ -+/* Allocate an empty pointer map. */ -+struct pointer_map_t * -+pointer_map_create (void) -+{ -+ struct pointer_map_t *result = XNEW (struct pointer_map_t); -+ -+ result->n_elements = 0; -+ result->log_slots = 8; -+ result->n_slots = (size_t) 1 << result->log_slots; -+ -+ result->keys = XCNEWVEC (void *, result->n_slots); -+ result->values = XCNEWVEC (void *, result->n_slots); -+ return result; -+} -+ -+/* Reclaims all memory associated with PMAP. */ -+void pointer_map_destroy (struct pointer_map_t *pmap) -+{ -+ XDELETEVEC (pmap->keys); -+ XDELETEVEC (pmap->values); -+ XDELETE (pmap); -+} -+ -+/* Returns a pointer to the value to which P maps, if PMAP contains P. P -+ must be nonnull. Return NULL if PMAP does not contain P. -+ -+ Collisions are resolved by linear probing. */ -+void ** -+pointer_map_contains (struct pointer_map_t *pmap, void *p) -+{ -+ size_t n = hash1 (p, pmap->n_slots, pmap->log_slots); -+ -+ while (true) -+ { -+ if (pmap->keys[n] == p) -+ return &pmap->values[n]; -+ else if (pmap->keys[n] == 0) -+ return NULL; -+ else -+ { -+ ++n; -+ if (n == pmap->n_slots) -+ n = 0; -+ } -+ } -+} -+ -+/* Inserts P into PMAP if it wasn't already there. Returns a pointer -+ to the value. P must be nonnull. */ -+void ** -+pointer_map_insert (struct pointer_map_t *pmap, void *p) -+{ -+ size_t n; -+ -+ /* For simplicity, expand the map even if P is already there. This can be -+ superfluous but can happen at most once. */ -+ if (pmap->n_elements > pmap->n_slots / 4) -+ { -+ size_t new_log_slots = pmap->log_slots + 1; -+ size_t new_n_slots = pmap->n_slots * 2; -+ void **new_keys = XCNEWVEC (void *, new_n_slots); -+ void **new_values = XCNEWVEC (void *, new_n_slots); -+ size_t i; -+ -+ for (i = 0; i < pmap->n_slots; ++i) -+ if (pmap->keys[i]) -+ { -+ void *key = pmap->keys[i]; -+ n = insert_aux (key, new_keys, new_n_slots, new_log_slots); -+ new_keys[n] = key; -+ new_values[n] = pmap->values[i]; -+ } -+ -+ XDELETEVEC (pmap->keys); -+ XDELETEVEC (pmap->values); -+ pmap->n_slots = new_n_slots; -+ pmap->log_slots = new_log_slots; -+ pmap->keys = new_keys; -+ pmap->values = new_values; -+ } -+ -+ n = insert_aux (p, pmap->keys, pmap->n_slots, pmap->log_slots); -+ if (!pmap->keys[n]) -+ { -+ ++pmap->n_elements; -+ pmap->keys[n] = p; -+ } -+ -+ return &pmap->values[n]; -+} -+ -+/* Pass each pointer in PMAP to the function in FN, together with the pointer -+ to the value and the fixed parameter DATA. If FN returns false, the -+ iteration stops. */ -+ -+void pointer_map_traverse (struct pointer_map_t *pmap, -+ bool (*fn) (void *, void **, void *), void *data) -+{ -+ size_t i; -+ for (i = 0; i < pmap->n_slots; ++i) -+ if (pmap->keys[i] && !fn (pmap->keys[i], &pmap->values[i], data)) -+ break; -+} -Index: gcc/pointer-set.h -=================================================================== ---- a/gcc/pointer-set.h (revision 125226) -+++ b/gcc/pointer-set.h (revision 125227) -@@ -22,11 +22,21 @@ - #define POINTER_SET_H - - struct pointer_set_t; -- - struct pointer_set_t *pointer_set_create (void); - void pointer_set_destroy (struct pointer_set_t *pset); - - int pointer_set_contains (struct pointer_set_t *pset, void *p); - int pointer_set_insert (struct pointer_set_t *pset, void *p); -+void pointer_set_traverse (struct pointer_set_t *, bool (*) (void *, void *), -+ void *); - -+struct pointer_map_t; -+struct pointer_map_t *pointer_map_create (void); -+void pointer_map_destroy (struct pointer_map_t *pmap); -+ -+void **pointer_map_contains (struct pointer_map_t *pmap, void *p); -+void **pointer_map_insert (struct pointer_map_t *pmap, void *p); -+void pointer_map_traverse (struct pointer_map_t *, -+ bool (*) (void *, void **, void *), void *); -+ - #endif /* POINTER_SET_H */ -Index: gcc/Makefile.in -=================================================================== ---- a/gcc/Makefile.in (revision 125226) -+++ b/gcc/Makefile.in (revision 125227) -@@ -1839,7 +1839,7 @@ - tree-ssa-structalias.o: tree-ssa-structalias.c tree-ssa-structalias.h \ - $(SYSTEM_H) $(CONFIG_H) $(GGC_H) $(TREE_H) $(TREE_FLOW_H) \ - $(TM_H) coretypes.h $(CGRAPH_H) tree-pass.h $(TIMEVAR_H) \ -- gt-tree-ssa-structalias.h $(PARAMS_H) -+ gt-tree-ssa-structalias.h $(PARAMS_H) pointer-set.h - tree-ssa.o : tree-ssa.c $(TREE_FLOW_H) $(CONFIG_H) $(SYSTEM_H) \ - $(RTL_H) $(TREE_H) $(TM_P_H) $(EXPR_H) output.h $(DIAGNOSTIC_H) \ - toplev.h $(FUNCTION_H) $(TIMEVAR_H) $(TM_H) coretypes.h \ -Index: gcc/tree-ssa-structalias.c -=================================================================== ---- a/gcc/tree-ssa-structalias.c (revision 125226) -+++ b/gcc/tree-ssa-structalias.c (revision 125227) -@@ -51,10 +51,11 @@ - #include "params.h" - #include "tree-ssa-structalias.h" - #include "cgraph.h" -+#include "pointer-set.h" - - /* The idea behind this analyzer is to generate set constraints from the - program, then solve the resulting constraints in order to generate the -- points-to sets. -+ points-to sets. - - Set constraints are a way of modeling program analysis problems that - involve sets. They consist of an inclusion constraint language, -@@ -70,33 +71,33 @@ - - Also see "Ultra-fast Aliasing Analysis using CLA: A Million Lines - of C Code in a Second" by ""Nevin Heintze and Olivier Tardieu" at -- http://citeseer.ist.psu.edu/heintze01ultrafast.html -+ http://citeseer.ist.psu.edu/heintze01ultrafast.html - -- There are three types of constraint expressions, DEREF, ADDRESSOF, and -- SCALAR. Each constraint expression consists of a constraint type, -- a variable, and an offset. -- -+ There are three types of real constraint expressions, DEREF, -+ ADDRESSOF, and SCALAR. Each constraint expression consists -+ of a constraint type, a variable, and an offset. -+ - SCALAR is a constraint expression type used to represent x, whether - it appears on the LHS or the RHS of a statement. - DEREF is a constraint expression type used to represent *x, whether -- it appears on the LHS or the RHS of a statement. -+ it appears on the LHS or the RHS of a statement. - ADDRESSOF is a constraint expression used to represent &x, whether - it appears on the LHS or the RHS of a statement. -- -+ - Each pointer variable in the program is assigned an integer id, and - each field of a structure variable is assigned an integer id as well. -- -+ - Structure variables are linked to their list of fields through a "next - field" in each variable that points to the next field in offset -- order. -- Each variable for a structure field has -+ order. -+ Each variable for a structure field has - - 1. "size", that tells the size in bits of that field. - 2. "fullsize, that tells the size in bits of the entire structure. - 3. "offset", that tells the offset in bits from the beginning of the - structure to this field. - -- Thus, -+ Thus, - struct f - { - int a; -@@ -110,50 +111,51 @@ - foo.b -> id 2, size 32, offset 32, fullsize 64, next NULL - bar -> id 3, size 32, offset 0, fullsize 32, next NULL - -- -+ - In order to solve the system of set constraints, the following is - done: - - 1. Each constraint variable x has a solution set associated with it, - Sol(x). -- -+ - 2. Constraints are separated into direct, copy, and complex. - Direct constraints are ADDRESSOF constraints that require no extra - processing, such as P = &Q - Copy constraints are those of the form P = Q. -- Complex constraints are all the constraints involving dereferences. -- -+ Complex constraints are all the constraints involving dereferences -+ and offsets (including offsetted copies). -+ - 3. All direct constraints of the form P = &Q are processed, such -- that Q is added to Sol(P) -+ that Q is added to Sol(P) - - 4. All complex constraints for a given constraint variable are stored in a -- linked list attached to that variable's node. -+ linked list attached to that variable's node. - - 5. A directed graph is built out of the copy constraints. Each -- constraint variable is a node in the graph, and an edge from -+ constraint variable is a node in the graph, and an edge from - Q to P is added for each copy constraint of the form P = Q -- -+ - 6. The graph is then walked, and solution sets are - propagated along the copy edges, such that an edge from Q to P - causes Sol(P) <- Sol(P) union Sol(Q). -- -+ - 7. As we visit each node, all complex constraints associated with - that node are processed by adding appropriate copy edges to the graph, or the -- appropriate variables to the solution set. -+ appropriate variables to the solution set. - - 8. The process of walking the graph is iterated until no solution - sets change. - - Prior to walking the graph in steps 6 and 7, We perform static -- cycle elimination on the constraint graph, as well -+ cycle elimination on the constraint graph, as well - as off-line variable substitution. -- -+ - TODO: Adding offsets to pointer-to-structures can be handled (IE not punted - on and turned into anything), but isn't. You can just see what offset - inside the pointed-to struct it's going to access. -- -+ - TODO: Constant bounded arrays can be handled as if they were structs of the -- same number of elements. -+ same number of elements. - - TODO: Modeling heap and incoming pointers becomes much better if we - add fields to them as we discover them, which we could do. -@@ -161,20 +163,29 @@ - TODO: We could handle unions, but to be honest, it's probably not - worth the pain or slowdown. */ - --static GTY ((if_marked ("tree_map_marked_p"), param_is (struct tree_map))) --htab_t heapvar_for_stmt; -+static GTY ((if_marked ("tree_map_marked_p"), param_is (struct tree_map))) htab_t heapvar_for_stmt; - - /* One variable to represent all non-local accesses. */ - tree nonlocal_all; - - static bool use_field_sensitive = true; - static int in_ipa_mode = 0; -+ -+/* Used for predecessor bitmaps. */ - static bitmap_obstack predbitmap_obstack; --static bitmap_obstack ptabitmap_obstack; -+ -+/* Used for points-to sets. */ -+static bitmap_obstack pta_obstack; -+ -+/* Used for oldsolution members of variables. */ -+static bitmap_obstack oldpta_obstack; -+ -+/* Used for per-solver-iteration bitmaps. */ - static bitmap_obstack iteration_obstack; - - static unsigned int create_variable_info_for (tree, const char *); --static void build_constraint_graph (void); -+typedef struct constraint_graph *constraint_graph_t; -+static void unify_nodes (constraint_graph_t, unsigned int, unsigned int, bool); - - DEF_VEC_P(constraint_t); - DEF_VEC_ALLOC_P(constraint_t,heap); -@@ -186,11 +197,13 @@ - static struct constraint_stats - { - unsigned int total_vars; -- unsigned int collapsed_vars; -+ unsigned int nonpointer_vars; - unsigned int unified_vars_static; - unsigned int unified_vars_dynamic; - unsigned int iterations; - unsigned int num_edges; -+ unsigned int num_implicit_edges; -+ unsigned int points_to_sets_created; - } stats; - - struct variable_info -@@ -205,7 +218,7 @@ - tree decl; - - /* Offset of this variable, in bits, from the base variable */ -- unsigned HOST_WIDE_INT offset; -+ unsigned HOST_WIDE_INT offset; - - /* Size of the variable, in bits. */ - unsigned HOST_WIDE_INT size; -@@ -216,34 +229,21 @@ - /* A link to the variable for the next field in this structure. */ - struct variable_info *next; - -- /* Node in the graph that represents the constraints and points-to -- solution for the variable. */ -- unsigned int node; -- -- /* True if the address of this variable is taken. Needed for -- variable substitution. */ -- unsigned int address_taken:1; -- -- /* True if this variable is the target of a dereference. Needed for -- variable substitution. */ -- unsigned int indirect_target:1; -- - /* True if the variable is directly the target of a dereference. - This is used to track which variables are *actually* dereferenced -- so we can prune their points to listed. This is equivalent to the -- indirect_target flag when no merging of variables happens. */ -+ so we can prune their points to listed. */ - unsigned int directly_dereferenced:1; - - /* True if this is a variable created by the constraint analysis, such as - heap variables and constraints we had to break up. */ - unsigned int is_artificial_var:1; -- -+ - /* True if this is a special variable whose solution set should not be - changed. */ - unsigned int is_special_var:1; - - /* True for variables whose size is not known or variable. */ -- unsigned int is_unknown_size_var:1; -+ unsigned int is_unknown_size_var:1; - - /* True for variables that have unions somewhere in them. */ - unsigned int has_union:1; -@@ -254,16 +254,15 @@ - /* Points-to set for this variable. */ - bitmap solution; - -+ /* Old points-to set for this variable. */ -+ bitmap oldsolution; -+ - /* Variable ids represented by this node. */ - bitmap variables; - -- /* Vector of complex constraints for this node. Complex -- constraints are those involving dereferences. */ -- VEC(constraint_t,heap) *complex; -- -- /* Variable id this was collapsed to due to type unsafety. -- This should be unused completely after build_constraint_graph, or -- something is broken. */ -+ /* Variable id this was collapsed to due to type unsafety. This -+ should be unused completely after build_succ_graph, or something -+ is broken. */ - struct variable_info *collapsed_to; - }; - typedef struct variable_info *varinfo_t; -@@ -277,8 +276,8 @@ - - DEF_VEC_ALLOC_P(varinfo_t, heap); - --/* Table of variable info structures for constraint variables. Indexed directly -- by variable info id. */ -+/* Table of variable info structures for constraint variables. -+ Indexed directly by variable info id. */ - static VEC(varinfo_t,heap) *varmap; - - /* Return the varmap element N */ -@@ -286,7 +285,7 @@ - static inline varinfo_t - get_varinfo (unsigned int n) - { -- return VEC_index(varinfo_t, varmap, n); -+ return VEC_index (varinfo_t, varmap, n); - } - - /* Return the varmap element N, following the collapsed_to link. */ -@@ -294,7 +293,7 @@ - static inline varinfo_t - get_varinfo_fc (unsigned int n) - { -- varinfo_t v = VEC_index(varinfo_t, varmap, n); -+ varinfo_t v = VEC_index (varinfo_t, varmap, n); - - if (v->collapsed_to) - return v->collapsed_to; -@@ -331,10 +330,9 @@ - /* Variable that represents non-local variables before we expand it to - one for each type. */ - static unsigned int nonlocal_vars_id; -- - /* Lookup a heap var for FROM, and return it if we find one. */ - --static tree -+static tree - heapvar_lookup (tree from) - { - struct tree_map *h, in; -@@ -367,25 +365,21 @@ - named NAME, and using constraint graph node NODE. */ - - static varinfo_t --new_var_info (tree t, unsigned int id, const char *name, unsigned int node) -+new_var_info (tree t, unsigned int id, const char *name) - { - varinfo_t ret = pool_alloc (variable_info_pool); - - ret->id = id; - ret->name = name; - ret->decl = t; -- ret->node = node; -- ret->address_taken = false; -- ret->indirect_target = false; - ret->directly_dereferenced = false; - ret->is_artificial_var = false; - ret->is_heap_var = false; - ret->is_special_var = false; - ret->is_unknown_size_var = false; - ret->has_union = false; -- ret->solution = BITMAP_ALLOC (&ptabitmap_obstack); -- ret->variables = BITMAP_ALLOC (&ptabitmap_obstack); -- ret->complex = NULL; -+ ret->solution = BITMAP_ALLOC (&pta_obstack); -+ ret->oldsolution = BITMAP_ALLOC (&oldpta_obstack); - ret->next = NULL; - ret->collapsed_to = NULL; - return ret; -@@ -395,7 +389,7 @@ - - /* An expression that appears in a constraint. */ - --struct constraint_expr -+struct constraint_expr - { - /* Constraint type. */ - constraint_expr_type type; -@@ -418,7 +412,7 @@ - static void do_deref (VEC (ce_s, heap) **); - - /* Our set constraints are made up of two constraint expressions, one -- LHS, and one RHS. -+ LHS, and one RHS. - - As described in the introduction, our set constraints each represent an - operation between set valued variables. -@@ -434,63 +428,98 @@ - static VEC(constraint_t,heap) *constraints; - static alloc_pool constraint_pool; - --/* An edge in the weighted constraint graph. The edges are weighted, -- with a bit set in weights meaning their is an edge with that -- weight. -- We don't keep the src in the edge, because we always know what it -- is. */ - --struct constraint_edge -+DEF_VEC_I(int); -+DEF_VEC_ALLOC_I(int, heap); -+ -+/* The constraint graph is represented as an array of bitmaps -+ containing successor nodes. */ -+ -+struct constraint_graph - { -- unsigned int dest; -- bitmap weights; --}; -+ /* Size of this graph, which may be different than the number of -+ nodes in the variable map. */ -+ unsigned int size; - --typedef struct constraint_edge *constraint_edge_t; --static alloc_pool constraint_edge_pool; -+ /* Explicit successors of each node. */ -+ bitmap *succs; - --/* Return a new constraint edge from SRC to DEST. */ -+ /* Implicit predecessors of each node (Used for variable -+ substitution). */ -+ bitmap *implicit_preds; - --static constraint_edge_t --new_constraint_edge (unsigned int dest) --{ -- constraint_edge_t ret = pool_alloc (constraint_edge_pool); -- ret->dest = dest; -- ret->weights = NULL; -- return ret; --} -+ /* Explicit predecessors of each node (Used for variable substitution). */ -+ bitmap *preds; - --DEF_VEC_P(constraint_edge_t); --DEF_VEC_ALLOC_P(constraint_edge_t,heap); -+ /* Indirect cycle representatives, or -1 if the node has no indirect -+ cycles. */ -+ int *indirect_cycles; - -+ /* Representative node for a node. rep[a] == a unless the node has -+ been unified. */ -+ unsigned int *rep; - --/* The constraint graph is represented internally in two different -- ways. The overwhelming majority of edges in the constraint graph -- are zero weigh edges, and thus, using a vector of contrainst_edge_t -- is a waste of time and memory, since they have no weights. We -- simply use a bitmap to store the preds and succs for each node. -- The weighted edges are stored as a set of adjacency vectors, one -- per variable. succs[x] is the vector of successors for variable x, -- and preds[x] is the vector of predecessors for variable x. IOW, -- all edges are "forward" edges, which is not like our CFG. So -- remember that preds[x]->src == x, and succs[x]->src == x. */ -+ /* Equivalence class representative for a node. This is used for -+ variable substitution. */ -+ int *eq_rep; - --struct constraint_graph --{ -- bitmap *zero_weight_succs; -- bitmap *zero_weight_preds; -- VEC(constraint_edge_t,heap) **succs; -- VEC(constraint_edge_t,heap) **preds; -+ /* Label for each node, used during variable substitution. */ -+ unsigned int *label; -+ -+ /* Bitmap of nodes where the bit is set if the node is a direct -+ node. Used for variable substitution. */ -+ sbitmap direct_nodes; -+ -+ /* Vector of complex constraints for each graph node. Complex -+ constraints are those involving dereferences or offsets that are -+ not 0. */ -+ VEC(constraint_t,heap) **complex; - }; - --typedef struct constraint_graph *constraint_graph_t; -- - static constraint_graph_t graph; --static int graph_size; - -+/* During variable substitution and the offline version of indirect -+ cycle finding, we create nodes to represent dereferences and -+ address taken constraints. These represent where these start and -+ end. */ -+#define FIRST_REF_NODE (VEC_length (varinfo_t, varmap)) -+#define LAST_REF_NODE (FIRST_REF_NODE + (FIRST_REF_NODE - 1)) -+#define FIRST_ADDR_NODE (LAST_REF_NODE + 1) -+ -+/* Return the representative node for NODE, if NODE has been unioned -+ with another NODE. -+ This function performs path compression along the way to finding -+ the representative. */ -+ -+static unsigned int -+find (unsigned int node) -+{ -+ gcc_assert (node < graph->size); -+ if (graph->rep[node] != node) -+ return graph->rep[node] = find (graph->rep[node]); -+ return node; -+} -+ -+/* Union the TO and FROM nodes to the TO nodes. -+ Note that at some point in the future, we may want to do -+ union-by-rank, in which case we are going to have to return the -+ node we unified to. */ -+ -+static bool -+unite (unsigned int to, unsigned int from) -+{ -+ gcc_assert (to < graph->size && from < graph->size); -+ if (to != from && graph->rep[from] != to) -+ { -+ graph->rep[from] = to; -+ return true; -+ } -+ return false; -+} -+ - /* Create a new constraint consisting of LHS and RHS expressions. */ - --static constraint_t -+static constraint_t - new_constraint (const struct constraint_expr lhs, - const struct constraint_expr rhs) - { -@@ -508,7 +537,7 @@ - if (c->lhs.type == ADDRESSOF) - fprintf (file, "&"); - else if (c->lhs.type == DEREF) -- fprintf (file, "*"); -+ fprintf (file, "*"); - fprintf (file, "%s", get_varinfo_fc (c->lhs.var)->name); - if (c->lhs.offset != 0) - fprintf (file, " + " HOST_WIDE_INT_PRINT_DEC, c->lhs.offset); -@@ -550,23 +579,24 @@ - dump_constraints (stderr); - } - --/* SOLVER FUNCTIONS -+/* SOLVER FUNCTIONS - - The solver is a simple worklist solver, that works on the following - algorithm: -- -- sbitmap changed_nodes = all ones; -- changed_count = number of nodes; -- For each node that was already collapsed: -- changed_count--; - -+ sbitmap changed_nodes = all zeroes; -+ changed_count = 0; -+ For each node that is not already collapsed: -+ changed_count++; -+ set bit in changed nodes -+ - while (changed_count > 0) - { - compute topological ordering for constraint graph -- -+ - find and collapse cycles in the constraint graph (updating - changed if necessary) -- -+ - for each node (n) in the graph in topological order: - changed_count--; - -@@ -619,11 +649,11 @@ - } - - /* Return true if two constraints A and B are equal. */ -- -+ - static bool - constraint_equal (struct constraint a, struct constraint b) - { -- return constraint_expr_equal (a.lhs, b.lhs) -+ return constraint_expr_equal (a.lhs, b.lhs) - && constraint_expr_equal (a.rhs, b.rhs); - } - -@@ -634,7 +664,7 @@ - constraint_vec_find (VEC(constraint_t,heap) *vec, - struct constraint lookfor) - { -- unsigned int place; -+ unsigned int place; - constraint_t found; - - if (vec == NULL) -@@ -684,7 +714,7 @@ - /* If this is a properly sized variable, only add offset if it's - less than end. Otherwise, it is globbed to a single - variable. */ -- -+ - if ((get_varinfo (i)->offset + offset) < get_varinfo (i)->fullsize) - { - unsigned HOST_WIDE_INT fieldoffset = get_varinfo (i)->offset + offset; -@@ -693,15 +723,15 @@ - continue; - bitmap_set_bit (result, v->id); - } -- else if (get_varinfo (i)->is_artificial_var -+ else if (get_varinfo (i)->is_artificial_var - || get_varinfo (i)->has_union - || get_varinfo (i)->is_unknown_size_var) - { - bitmap_set_bit (result, i); - } - } -- -- bitmap_copy (set, result); -+ -+ bitmap_copy (set, result); - BITMAP_FREE (result); - } - -@@ -727,397 +757,149 @@ - } - } - --/* Insert constraint C into the list of complex constraints for VAR. */ -+/* Insert constraint C into the list of complex constraints for graph -+ node VAR. */ - - static void --insert_into_complex (unsigned int var, constraint_t c) -+insert_into_complex (constraint_graph_t graph, -+ unsigned int var, constraint_t c) - { -- varinfo_t vi = get_varinfo (var); -- unsigned int place = VEC_lower_bound (constraint_t, vi->complex, c, -+ VEC (constraint_t, heap) *complex = graph->complex[var]; -+ unsigned int place = VEC_lower_bound (constraint_t, complex, c, - constraint_less); -- VEC_safe_insert (constraint_t, heap, vi->complex, place, c); --} - -- --/* Compare two constraint edges A and B, return true if they are equal. */ -- --static bool --constraint_edge_equal (struct constraint_edge a, struct constraint_edge b) --{ -- return a.dest == b.dest; -+ /* Only insert constraints that do not already exist. */ -+ if (place >= VEC_length (constraint_t, complex) -+ || !constraint_equal (*c, *VEC_index (constraint_t, complex, place))) -+ VEC_safe_insert (constraint_t, heap, graph->complex[var], place, c); - } - --/* Compare two constraint edges, return true if A is less than B */ - --static bool --constraint_edge_less (const constraint_edge_t a, const constraint_edge_t b) --{ -- if (a->dest < b->dest) -- return true; -- return false; --} -- --/* Find the constraint edge that matches LOOKFOR, in VEC. -- Return the edge, if found, NULL otherwise. */ -- --static constraint_edge_t --constraint_edge_vec_find (VEC(constraint_edge_t,heap) *vec, -- struct constraint_edge lookfor) --{ -- unsigned int place; -- constraint_edge_t edge = NULL; -- -- place = VEC_lower_bound (constraint_edge_t, vec, &lookfor, -- constraint_edge_less); -- if (place >= VEC_length (constraint_edge_t, vec)) -- return NULL; -- edge = VEC_index (constraint_edge_t, vec, place); -- if (!constraint_edge_equal (*edge, lookfor)) -- return NULL; -- return edge; --} -- - /* Condense two variable nodes into a single variable node, by moving - all associated info from SRC to TO. */ - --static void --condense_varmap_nodes (unsigned int to, unsigned int src) -+static void -+merge_node_constraints (constraint_graph_t graph, unsigned int to, -+ unsigned int from) - { -- varinfo_t tovi = get_varinfo (to); -- varinfo_t srcvi = get_varinfo (src); - unsigned int i; - constraint_t c; -- bitmap_iterator bi; -- -- /* the src node, and all its variables, are now the to node. */ -- srcvi->node = to; -- EXECUTE_IF_SET_IN_BITMAP (srcvi->variables, 0, i, bi) -- get_varinfo (i)->node = to; -- -- /* Merge the src node variables and the to node variables. */ -- bitmap_set_bit (tovi->variables, src); -- bitmap_ior_into (tovi->variables, srcvi->variables); -- bitmap_clear (srcvi->variables); -- -+ -+ gcc_assert (find (from) == to); -+ - /* Move all complex constraints from src node into to node */ -- for (i = 0; VEC_iterate (constraint_t, srcvi->complex, i, c); i++) -+ for (i = 0; VEC_iterate (constraint_t, graph->complex[from], i, c); i++) - { - /* In complex constraints for node src, we may have either -- a = *src, and *src = a. */ -- -+ a = *src, and *src = a, or an offseted constraint which are -+ always added to the rhs node's constraints. */ -+ - if (c->rhs.type == DEREF) - c->rhs.var = to; -+ else if (c->lhs.type == DEREF) -+ c->lhs.var = to; - else -- c->lhs.var = to; -+ c->rhs.var = to; - } -- constraint_set_union (&tovi->complex, &srcvi->complex); -- VEC_free (constraint_t, heap, srcvi->complex); -- srcvi->complex = NULL; -+ constraint_set_union (&graph->complex[to], &graph->complex[from]); -+ VEC_free (constraint_t, heap, graph->complex[from]); -+ graph->complex[from] = NULL; - } - --/* Erase an edge from SRC to SRC from GRAPH. This routine only -- handles self-edges (e.g. an edge from a to a). */ - --static void --erase_graph_self_edge (constraint_graph_t graph, unsigned int src) --{ -- VEC(constraint_edge_t,heap) *predvec = graph->preds[src]; -- VEC(constraint_edge_t,heap) *succvec = graph->succs[src]; -- struct constraint_edge edge; -- unsigned int place; -- -- edge.dest = src; -- -- /* Remove from the successors. */ -- place = VEC_lower_bound (constraint_edge_t, succvec, &edge, -- constraint_edge_less); -- -- /* Make sure we found the edge. */ --#ifdef ENABLE_CHECKING -- { -- constraint_edge_t tmp = VEC_index (constraint_edge_t, succvec, place); -- gcc_assert (constraint_edge_equal (*tmp, edge)); -- } --#endif -- VEC_ordered_remove (constraint_edge_t, succvec, place); -- -- /* Remove from the predecessors. */ -- place = VEC_lower_bound (constraint_edge_t, predvec, &edge, -- constraint_edge_less); -- -- /* Make sure we found the edge. */ --#ifdef ENABLE_CHECKING -- { -- constraint_edge_t tmp = VEC_index (constraint_edge_t, predvec, place); -- gcc_assert (constraint_edge_equal (*tmp, edge)); -- } --#endif -- VEC_ordered_remove (constraint_edge_t, predvec, place); --} -- - /* Remove edges involving NODE from GRAPH. */ - - static void - clear_edges_for_node (constraint_graph_t graph, unsigned int node) - { -- VEC(constraint_edge_t,heap) *succvec = graph->succs[node]; -- VEC(constraint_edge_t,heap) *predvec = graph->preds[node]; -- bitmap_iterator bi; -- unsigned int j; -- constraint_edge_t c = NULL; -- int i; -- -- /* Walk the successors, erase the associated preds. */ -- -- EXECUTE_IF_IN_NONNULL_BITMAP (graph->zero_weight_succs[node], 0, j, bi) -- if (j != node) -- bitmap_clear_bit (graph->zero_weight_preds[j], node); -- -- for (i = 0; VEC_iterate (constraint_edge_t, succvec, i, c); i++) -- if (c->dest != node) -- { -- unsigned int place; -- struct constraint_edge lookfor; -- constraint_edge_t result; -- -- lookfor.dest = node; -- place = VEC_lower_bound (constraint_edge_t, graph->preds[c->dest], -- &lookfor, constraint_edge_less); -- result = VEC_ordered_remove (constraint_edge_t, -- graph->preds[c->dest], place); -- pool_free (constraint_edge_pool, result); -- } -- -- /* Walk the preds, erase the associated succs. */ -- -- EXECUTE_IF_IN_NONNULL_BITMAP (graph->zero_weight_preds[node], 0, j, bi) -- if (j != node) -- bitmap_clear_bit (graph->zero_weight_succs[j], node); -- -- for (i =0; VEC_iterate (constraint_edge_t, predvec, i, c); i++) -- if (c->dest != node) -- { -- unsigned int place; -- struct constraint_edge lookfor; -- constraint_edge_t result; -- -- lookfor.dest = node; -- place = VEC_lower_bound (constraint_edge_t, graph->succs[c->dest], -- &lookfor, constraint_edge_less); -- result = VEC_ordered_remove (constraint_edge_t, -- graph->succs[c->dest], place); -- pool_free (constraint_edge_pool, result); -- -- } -- -- if (graph->zero_weight_preds[node]) -- { -- BITMAP_FREE (graph->zero_weight_preds[node]); -- graph->zero_weight_preds[node] = NULL; -- } -- -- if (graph->zero_weight_succs[node]) -- { -- BITMAP_FREE (graph->zero_weight_succs[node]); -- graph->zero_weight_succs[node] = NULL; -- } -- -- VEC_free (constraint_edge_t, heap, graph->preds[node]); -- VEC_free (constraint_edge_t, heap, graph->succs[node]); -- graph->preds[node] = NULL; -- graph->succs[node] = NULL; -+ if (graph->succs[node]) -+ BITMAP_FREE (graph->succs[node]); - } - --static bool edge_added = false; -- --/* Add edge (src, dest) to the graph. */ -- --static bool --add_graph_edge (constraint_graph_t graph, unsigned int src, unsigned int dest) --{ -- unsigned int place; -- VEC(constraint_edge_t,heap) *vec; -- struct constraint_edge newe; -- newe.dest = dest; -- -- vec = graph->preds[src]; -- place = VEC_lower_bound (constraint_edge_t, vec, &newe, -- constraint_edge_less); -- if (place == VEC_length (constraint_edge_t, vec) -- || VEC_index (constraint_edge_t, vec, place)->dest != dest) -- { -- constraint_edge_t edge = new_constraint_edge (dest); -- -- VEC_safe_insert (constraint_edge_t, heap, graph->preds[src], -- place, edge); -- edge = new_constraint_edge (src); -- -- place = VEC_lower_bound (constraint_edge_t, graph->succs[dest], -- edge, constraint_edge_less); -- VEC_safe_insert (constraint_edge_t, heap, graph->succs[dest], -- place, edge); -- edge_added = true; -- stats.num_edges++; -- return true; -- } -- else -- return false; --} -- -- --/* Return the bitmap representing the weights of edge (SRC, DEST). */ -- --static bitmap * --get_graph_weights (constraint_graph_t graph, unsigned int src, -- unsigned int dest) --{ -- constraint_edge_t edge; -- VEC(constraint_edge_t,heap) *vec; -- struct constraint_edge lookfor; -- -- lookfor.dest = dest; -- -- vec = graph->preds[src]; -- edge = constraint_edge_vec_find (vec, lookfor); -- gcc_assert (edge != NULL); -- return &edge->weights; --} -- --/* Allocate graph weight bitmap for the edges associated with SRC and -- DEST in GRAPH. Both the pred and the succ edges share a single -- bitmap, so we need to set both edges to that bitmap. */ -- --static bitmap --allocate_graph_weights (constraint_graph_t graph, unsigned int src, -- unsigned int dest) --{ -- bitmap result; -- constraint_edge_t edge; -- VEC(constraint_edge_t,heap) *vec; -- struct constraint_edge lookfor; -- -- result = BITMAP_ALLOC (&ptabitmap_obstack); -- -- /* Set the pred weight. */ -- lookfor.dest = dest; -- vec = graph->preds[src]; -- edge = constraint_edge_vec_find (vec, lookfor); -- gcc_assert (edge != NULL); -- edge->weights = result; -- -- /* Set the succ weight. */ -- lookfor.dest = src; -- vec = graph->succs[dest]; -- edge = constraint_edge_vec_find (vec, lookfor); -- gcc_assert (edge != NULL); -- edge->weights = result; -- -- return result; --} -- -- - /* Merge GRAPH nodes FROM and TO into node TO. */ - - static void --merge_graph_nodes (constraint_graph_t graph, unsigned int to, -+merge_graph_nodes (constraint_graph_t graph, unsigned int to, - unsigned int from) - { -- VEC(constraint_edge_t,heap) *succvec = graph->succs[from]; -- VEC(constraint_edge_t,heap) *predvec = graph->preds[from]; -- int i; -- constraint_edge_t c; -- unsigned int j; -- bitmap_iterator bi; -- -- /* Merge all the zero weighted predecessor edges. */ -- if (graph->zero_weight_preds[from]) -+ if (graph->indirect_cycles[from] != -1) - { -- if (!graph->zero_weight_preds[to]) -- graph->zero_weight_preds[to] = BITMAP_ALLOC (&predbitmap_obstack); -- -- EXECUTE_IF_SET_IN_BITMAP (graph->zero_weight_preds[from], 0, j, bi) -+ /* If we have indirect cycles with the from node, and we have -+ none on the to node, the to node has indirect cycles from the -+ from node now that they are unified. -+ If indirect cycles exist on both, unify the nodes that they -+ are in a cycle with, since we know they are in a cycle with -+ each other. */ -+ if (graph->indirect_cycles[to] == -1) - { -- if (j != to) -- { -- bitmap_clear_bit (graph->zero_weight_succs[j], from); -- bitmap_set_bit (graph->zero_weight_succs[j], to); -- } -+ graph->indirect_cycles[to] = graph->indirect_cycles[from]; - } -- bitmap_ior_into (graph->zero_weight_preds[to], -- graph->zero_weight_preds[from]); -- } -+ else -+ { -+ unsigned int tonode = find (graph->indirect_cycles[to]); -+ unsigned int fromnode = find (graph->indirect_cycles[from]); - -- /* Merge all the zero weighted successor edges. */ -- if (graph->zero_weight_succs[from]) -- { -- if (!graph->zero_weight_succs[to]) -- graph->zero_weight_succs[to] = BITMAP_ALLOC (&ptabitmap_obstack); -- EXECUTE_IF_SET_IN_BITMAP (graph->zero_weight_succs[from], 0, j, bi) -- { -- bitmap_clear_bit (graph->zero_weight_preds[j], from); -- bitmap_set_bit (graph->zero_weight_preds[j], to); -+ if (unite (tonode, fromnode)) -+ unify_nodes (graph, tonode, fromnode, true); - } -- bitmap_ior_into (graph->zero_weight_succs[to], -- graph->zero_weight_succs[from]); - } - -- /* Merge all the nonzero weighted predecessor edges. */ -- for (i = 0; VEC_iterate (constraint_edge_t, predvec, i, c); i++) -+ /* Merge all the successor edges. */ -+ if (graph->succs[from]) - { -- unsigned int d = c->dest; -- bitmap temp; -- bitmap *weights; -+ if (!graph->succs[to]) -+ graph->succs[to] = BITMAP_ALLOC (&pta_obstack); -+ bitmap_ior_into (graph->succs[to], -+ graph->succs[from]); -+ } - -- if (c->dest == from) -- d = to; -+ clear_edges_for_node (graph, from); -+} - -- add_graph_edge (graph, to, d); - -- temp = *(get_graph_weights (graph, from, c->dest)); -- if (temp) -- { -- weights = get_graph_weights (graph, to, d); -- if (!*weights) -- *weights = allocate_graph_weights (graph, to, d); -- -- bitmap_ior_into (*weights, temp); -- } -- -- } -- -- /* Merge all the nonzero weighted successor edges. */ -- for (i = 0; VEC_iterate (constraint_edge_t, succvec, i, c); i++) -- { -- unsigned int d = c->dest; -- bitmap temp; -- bitmap *weights; -+/* Add an indirect graph edge to GRAPH, going from TO to FROM if -+ it doesn't exist in the graph already. */ - -- if (c->dest == from) -- d = to; -+static void -+add_implicit_graph_edge (constraint_graph_t graph, unsigned int to, -+ unsigned int from) -+{ -+ if (to == from) -+ return; - -- add_graph_edge (graph, d, to); -+ if (!graph->implicit_preds[to]) -+ graph->implicit_preds[to] = BITMAP_ALLOC (&predbitmap_obstack); - -- temp = *(get_graph_weights (graph, c->dest, from)); -- if (temp) -- { -- weights = get_graph_weights (graph, d, to); -- if (!*weights) -- *weights = allocate_graph_weights (graph, d, to); -- bitmap_ior_into (*weights, temp); -- } -+ if (!bitmap_bit_p (graph->implicit_preds[to], from)) -+ { -+ stats.num_implicit_edges++; -+ bitmap_set_bit (graph->implicit_preds[to], from); - } -- clear_edges_for_node (graph, from); - } - --/* Add a graph edge to GRAPH, going from TO to FROM, with WEIGHT, if -+/* Add a predecessor graph edge to GRAPH, going from TO to FROM if - it doesn't exist in the graph already. - Return false if the edge already existed, true otherwise. */ - -+static void -+add_pred_graph_edge (constraint_graph_t graph, unsigned int to, -+ unsigned int from) -+{ -+ if (!graph->preds[to]) -+ graph->preds[to] = BITMAP_ALLOC (&predbitmap_obstack); -+ if (!bitmap_bit_p (graph->preds[to], from)) -+ bitmap_set_bit (graph->preds[to], from); -+} -+ -+/* Add a graph edge to GRAPH, going from FROM to TO if -+ it doesn't exist in the graph already. -+ Return false if the edge already existed, true otherwise. */ -+ - static bool --int_add_graph_edge (constraint_graph_t graph, unsigned int to, -- unsigned int from, unsigned HOST_WIDE_INT weight) -+add_graph_edge (constraint_graph_t graph, unsigned int to, -+ unsigned int from) - { -- if (to == from && weight == 0) -+ if (to == from) - { - return false; - } -@@ -1125,41 +907,15 @@ - { - bool r = false; - -- if (weight == 0) -+ if (!graph->succs[from]) -+ graph->succs[from] = BITMAP_ALLOC (&pta_obstack); -+ if (!bitmap_bit_p (graph->succs[from], to)) - { -- if (!graph->zero_weight_preds[to]) -- graph->zero_weight_preds[to] = BITMAP_ALLOC (&predbitmap_obstack); -- if (!graph->zero_weight_succs[from]) -- graph->zero_weight_succs[from] = BITMAP_ALLOC (&ptabitmap_obstack); -- if (!bitmap_bit_p (graph->zero_weight_succs[from], to)) -- { -- edge_added = true; -- r = true; -- stats.num_edges++; -- bitmap_set_bit (graph->zero_weight_preds[to], from); -- bitmap_set_bit (graph->zero_weight_succs[from], to); -- } -+ r = true; -+ if (to < FIRST_REF_NODE && from < FIRST_REF_NODE) -+ stats.num_edges++; -+ bitmap_set_bit (graph->succs[from], to); - } -- else -- { -- bitmap *weights; -- -- r = add_graph_edge (graph, to, from); -- weights = get_graph_weights (graph, to, from); -- -- if (!*weights) -- { -- r = true; -- *weights = allocate_graph_weights (graph, to, from); -- bitmap_set_bit (*weights, weight); -- } -- else -- { -- r |= !bitmap_bit_p (*weights, weight); -- bitmap_set_bit (*weights, weight); -- } -- } -- - return r; - } - } -@@ -1168,46 +924,51 @@ - /* Return true if {DEST.SRC} is an existing graph edge in GRAPH. */ - - static bool --valid_graph_edge (constraint_graph_t graph, unsigned int src, -+valid_graph_edge (constraint_graph_t graph, unsigned int src, - unsigned int dest) - { -- struct constraint_edge lookfor; -- lookfor.dest = src; -- -- return (graph->zero_weight_succs[dest] -- && bitmap_bit_p (graph->zero_weight_succs[dest], src)) -- || constraint_edge_vec_find (graph->succs[dest], lookfor) != NULL; -+ return (graph->succs[dest] -+ && bitmap_bit_p (graph->succs[dest], src)); - } - --/* Return true if {DEST, SRC} is an existing weighted graph edge (IE has -- a weight other than 0) in GRAPH. */ --static bool --valid_weighted_graph_edge (constraint_graph_t graph, unsigned int src, -- unsigned int dest) --{ -- struct constraint_edge lookfor; -- lookfor.dest = src; -- -- return graph->preds[src] -- && constraint_edge_vec_find (graph->succs[dest], lookfor) != NULL; --} -+/* Build the constraint graph, adding only predecessor edges right now. */ - -- --/* Build the constraint graph. */ -- - static void --build_constraint_graph (void) -+build_pred_graph (void) - { -- int i = 0; -+ int i; - constraint_t c; -+ unsigned int j; - - graph = XNEW (struct constraint_graph); -- graph_size = VEC_length (varinfo_t, varmap) + 1; -- graph->succs = XCNEWVEC (VEC(constraint_edge_t,heap) *, graph_size); -- graph->preds = XCNEWVEC (VEC(constraint_edge_t,heap) *, graph_size); -- graph->zero_weight_succs = XCNEWVEC (bitmap, graph_size); -- graph->zero_weight_preds = XCNEWVEC (bitmap, graph_size); -+ graph->size = (VEC_length (varinfo_t, varmap)) * 3; -+ graph->succs = XCNEWVEC (bitmap, graph->size); -+ graph->implicit_preds = XCNEWVEC (bitmap, graph->size); -+ graph->preds = XCNEWVEC (bitmap, graph->size); -+ graph->indirect_cycles = XNEWVEC (int, VEC_length (varinfo_t, varmap)); -+ graph->label = XCNEWVEC (unsigned int, graph->size); -+ graph->rep = XNEWVEC (unsigned int, graph->size); -+ graph->eq_rep = XNEWVEC (int, graph->size); -+ graph->complex = XCNEWVEC (VEC(constraint_t, heap) *, -+ VEC_length (varinfo_t, varmap)); -+ graph->direct_nodes = sbitmap_alloc (graph->size); -+ sbitmap_zero (graph->direct_nodes); - -+ for (j = 0; j < FIRST_REF_NODE; j++) -+ { -+ if (!get_varinfo (j)->is_special_var) -+ SET_BIT (graph->direct_nodes, j); -+ } -+ -+ for (j = 0; j < graph->size; j++) -+ { -+ graph->rep[j] = j; -+ graph->eq_rep[j] = -1; -+ } -+ -+ for (j = 0; j < VEC_length (varinfo_t, varmap); j++) -+ graph->indirect_cycles[j] = -1; -+ - for (i = 0; VEC_iterate (constraint_t, constraints, i, c); i++) - { - struct constraint_expr lhs = c->lhs; -@@ -1217,31 +978,92 @@ - - if (lhs.type == DEREF) - { -- /* *x = y or *x = &y (complex) */ -- if (rhs.type == ADDRESSOF || rhsvar > anything_id) -- insert_into_complex (lhsvar, c); -+ /* *x = y. */ -+ if (rhs.offset == 0 && lhs.offset == 0 && rhs.type == SCALAR) -+ add_pred_graph_edge (graph, FIRST_REF_NODE + lhsvar, rhsvar); -+ if (rhs.type == ADDRESSOF) -+ RESET_BIT (graph->direct_nodes, rhsvar); - } - else if (rhs.type == DEREF) - { -- /* !special var= *y */ -- if (!(get_varinfo (lhsvar)->is_special_var)) -- insert_into_complex (rhsvar, c); -+ /* x = *y */ -+ if (rhs.offset == 0 && lhs.offset == 0 && lhs.type == SCALAR) -+ add_pred_graph_edge (graph, lhsvar, FIRST_REF_NODE + rhsvar); -+ else -+ RESET_BIT (graph->direct_nodes, lhsvar); - } - else if (rhs.type == ADDRESSOF) - { - /* x = &y */ -+ add_pred_graph_edge (graph, lhsvar, FIRST_ADDR_NODE + rhsvar); -+ /* Implicitly, *x = y */ -+ add_implicit_graph_edge (graph, FIRST_REF_NODE + lhsvar, rhsvar); -+ -+ RESET_BIT (graph->direct_nodes, rhsvar); -+ } -+ else if (lhsvar > anything_id -+ && lhsvar != rhsvar && lhs.offset == 0 && rhs.offset == 0) -+ { -+ /* x = y */ -+ add_pred_graph_edge (graph, lhsvar, rhsvar); -+ /* Implicitly, *x = *y */ -+ add_implicit_graph_edge (graph, FIRST_REF_NODE + lhsvar, -+ FIRST_REF_NODE + rhsvar); -+ } -+ else if (lhs.offset != 0 || rhs.offset != 0) -+ { -+ if (rhs.offset != 0) -+ RESET_BIT (graph->direct_nodes, lhs.var); -+ if (lhs.offset != 0) -+ RESET_BIT (graph->direct_nodes, rhs.var); -+ } -+ } -+} -+ -+/* Build the constraint graph, adding successor edges. */ -+ -+static void -+build_succ_graph (void) -+{ -+ int i; -+ constraint_t c; -+ -+ for (i = 0; VEC_iterate (constraint_t, constraints, i, c); i++) -+ { -+ struct constraint_expr lhs; -+ struct constraint_expr rhs; -+ unsigned int lhsvar; -+ unsigned int rhsvar; -+ -+ if (!c) -+ continue; -+ -+ lhs = c->lhs; -+ rhs = c->rhs; -+ lhsvar = find (get_varinfo_fc (lhs.var)->id); -+ rhsvar = find (get_varinfo_fc (rhs.var)->id); -+ -+ if (lhs.type == DEREF) -+ { -+ if (rhs.offset == 0 && lhs.offset == 0 && rhs.type == SCALAR) -+ add_graph_edge (graph, FIRST_REF_NODE + lhsvar, rhsvar); -+ } -+ else if (rhs.type == DEREF) -+ { -+ if (rhs.offset == 0 && lhs.offset == 0 && lhs.type == SCALAR) -+ add_graph_edge (graph, lhsvar, FIRST_REF_NODE + rhsvar); -+ } -+ else if (rhs.type == ADDRESSOF) -+ { -+ /* x = &y */ -+ gcc_assert (find (get_varinfo_fc (rhs.var)->id) -+ == get_varinfo_fc (rhs.var)->id); - bitmap_set_bit (get_varinfo (lhsvar)->solution, rhsvar); - } -- else if (lhsvar > anything_id) -+ else if (lhsvar > anything_id -+ && lhsvar != rhsvar && lhs.offset == 0 && rhs.offset == 0) - { -- /* Ignore 0 weighted self edges, as they can't possibly contribute -- anything */ -- if (lhsvar != rhsvar || rhs.offset != 0 || lhs.offset != 0) -- { -- /* x = y (simple) */ -- int_add_graph_edge (graph, lhs.var, rhs.var, rhs.offset); -- } -- -+ add_graph_edge (graph, lhsvar, rhsvar); - } - } - } -@@ -1260,20 +1082,20 @@ - struct scc_info - { - sbitmap visited; -- sbitmap in_component; -+ sbitmap roots; -+ unsigned int *dfs; -+ unsigned int *node_mapping; - int current_index; -- unsigned int *visited_index; - VEC(unsigned,heap) *scc_stack; -- VEC(unsigned,heap) *unification_queue; - }; - - - /* Recursive routine to find strongly connected components in GRAPH. - SI is the SCC info to store the information in, and N is the id of current - graph node we are processing. -- -+ - This is Tarjan's strongly connected component finding algorithm, as -- modified by Nuutila to keep only non-root nodes on the stack. -+ modified by Nuutila to keep only non-root nodes on the stack. - The algorithm can be found in "On finding the strongly connected - connected components in a directed graph" by Esko Nuutila and Eljas - Soisalon-Soininen, in Information Processing Letters volume 49, -@@ -1284,188 +1106,144 @@ - { - unsigned int i; - bitmap_iterator bi; -+ unsigned int my_dfs; - -- gcc_assert (get_varinfo (n)->node == n); - SET_BIT (si->visited, n); -- RESET_BIT (si->in_component, n); -- si->visited_index[n] = si->current_index ++; -- -+ si->dfs[n] = si->current_index ++; -+ my_dfs = si->dfs[n]; -+ - /* Visit all the successors. */ -- EXECUTE_IF_IN_NONNULL_BITMAP (graph->zero_weight_succs[n], 0, i, bi) -+ EXECUTE_IF_IN_NONNULL_BITMAP (graph->succs[n], 0, i, bi) - { -- unsigned int w = i; -+ unsigned int w; -+ -+ if (i > LAST_REF_NODE) -+ break; -+ -+ w = find (i); -+ if (TEST_BIT (si->roots, w)) -+ continue; -+ - if (!TEST_BIT (si->visited, w)) - scc_visit (graph, si, w); -- if (!TEST_BIT (si->in_component, w)) -- { -- unsigned int t = get_varinfo (w)->node; -- unsigned int nnode = get_varinfo (n)->node; -- if (si->visited_index[t] < si->visited_index[nnode]) -- get_varinfo (n)->node = t; -- } -+ { -+ unsigned int t = find (w); -+ unsigned int nnode = find (n); -+ gcc_assert (nnode == n); -+ -+ if (si->dfs[t] < si->dfs[nnode]) -+ si->dfs[n] = si->dfs[t]; -+ } - } -- -+ - /* See if any components have been identified. */ -- if (get_varinfo (n)->node == n) -+ if (si->dfs[n] == my_dfs) - { -- unsigned int t = si->visited_index[n]; -- SET_BIT (si->in_component, n); -- while (VEC_length (unsigned, si->scc_stack) != 0 -- && t < si->visited_index[VEC_last (unsigned, si->scc_stack)]) -+ if (VEC_length (unsigned, si->scc_stack) > 0 -+ && si->dfs[VEC_last (unsigned, si->scc_stack)] >= my_dfs) - { -- unsigned int w = VEC_pop (unsigned, si->scc_stack); -- get_varinfo (w)->node = n; -- SET_BIT (si->in_component, w); -- /* Mark this node for collapsing. */ -- VEC_safe_push (unsigned, heap, si->unification_queue, w); -- } -- } -- else -- VEC_safe_push (unsigned, heap, si->scc_stack, n); --} -+ bitmap scc = BITMAP_ALLOC (NULL); -+ bool have_ref_node = n >= FIRST_REF_NODE; -+ unsigned int lowest_node; -+ bitmap_iterator bi; - -+ bitmap_set_bit (scc, n); - --/* Collapse two variables into one variable. */ -+ while (VEC_length (unsigned, si->scc_stack) != 0 -+ && si->dfs[VEC_last (unsigned, si->scc_stack)] >= my_dfs) -+ { -+ unsigned int w = VEC_pop (unsigned, si->scc_stack); - --static void --collapse_nodes (constraint_graph_t graph, unsigned int to, unsigned int from) --{ -- bitmap tosol, fromsol; -+ bitmap_set_bit (scc, w); -+ if (w >= FIRST_REF_NODE) -+ have_ref_node = true; -+ } - -- condense_varmap_nodes (to, from); -- tosol = get_varinfo (to)->solution; -- fromsol = get_varinfo (from)->solution; -- bitmap_ior_into (tosol, fromsol); -- merge_graph_nodes (graph, to, from); -- -- if (valid_graph_edge (graph, to, to)) -- { -- if (graph->zero_weight_preds[to]) -- { -- bitmap_clear_bit (graph->zero_weight_preds[to], to); -- bitmap_clear_bit (graph->zero_weight_succs[to], to); -+ lowest_node = bitmap_first_set_bit (scc); -+ gcc_assert (lowest_node < FIRST_REF_NODE); -+ EXECUTE_IF_SET_IN_BITMAP (scc, 0, i, bi) -+ { -+ if (i < FIRST_REF_NODE) -+ { -+ /* Mark this node for collapsing. */ -+ if (unite (lowest_node, i)) -+ unify_nodes (graph, lowest_node, i, false); -+ } -+ else -+ { -+ unite (lowest_node, i); -+ graph->indirect_cycles[i - FIRST_REF_NODE] = lowest_node; -+ } -+ } - } -- if (valid_weighted_graph_edge (graph, to, to)) -- { -- bitmap weights = *(get_graph_weights (graph, to, to)); -- if (!weights || bitmap_empty_p (weights)) -- erase_graph_self_edge (graph, to); -- } -+ SET_BIT (si->roots, n); - } -- BITMAP_FREE (fromsol); -- get_varinfo (to)->address_taken |= get_varinfo (from)->address_taken; -- get_varinfo (to)->indirect_target |= get_varinfo (from)->indirect_target; -+ else -+ VEC_safe_push (unsigned, heap, si->scc_stack, n); - } - -+/* Unify node FROM into node TO, updating the changed count if -+ necessary when UPDATE_CHANGED is true. */ - --/* Unify nodes in GRAPH that we have found to be part of a cycle. -- SI is the Strongly Connected Components information structure that tells us -- what components to unify. -- UPDATE_CHANGED should be set to true if the changed sbitmap and changed -- count should be updated to reflect the unification. */ -- - static void --process_unification_queue (constraint_graph_t graph, struct scc_info *si, -- bool update_changed) -+unify_nodes (constraint_graph_t graph, unsigned int to, unsigned int from, -+ bool update_changed) - { -- size_t i = 0; -- bitmap tmp = BITMAP_ALLOC (update_changed ? &iteration_obstack : NULL); -- bitmap_clear (tmp); - -- /* We proceed as follows: -+ gcc_assert (to != from && find (to) == to); -+ if (dump_file && (dump_flags & TDF_DETAILS)) -+ fprintf (dump_file, "Unifying %s to %s\n", -+ get_varinfo (from)->name, -+ get_varinfo (to)->name); - -- For each component in the queue (components are delineated by -- when current_queue_element->node != next_queue_element->node): -+ if (update_changed) -+ stats.unified_vars_dynamic++; -+ else -+ stats.unified_vars_static++; - -- rep = representative node for component -+ merge_graph_nodes (graph, to, from); -+ merge_node_constraints (graph, to, from); - -- For each node (tounify) to be unified in the component, -- merge the solution for tounify into tmp bitmap -- -- clear solution for tounify -- -- merge edges from tounify into rep -- -- merge complex constraints from tounify into rep -- -- update changed count to note that tounify will never change -- again -- -- Merge tmp into solution for rep, marking rep changed if this -- changed rep's solution. -- -- Delete any 0 weighted self-edges we now have for rep. */ -- while (i != VEC_length (unsigned, si->unification_queue)) -+ if (update_changed && TEST_BIT (changed, from)) - { -- unsigned int tounify = VEC_index (unsigned, si->unification_queue, i); -- unsigned int n = get_varinfo (tounify)->node; -- -- if (dump_file && (dump_flags & TDF_DETAILS)) -- fprintf (dump_file, "Unifying %s to %s\n", -- get_varinfo (tounify)->name, -- get_varinfo (n)->name); -- if (update_changed) -- stats.unified_vars_dynamic++; -+ RESET_BIT (changed, from); -+ if (!TEST_BIT (changed, to)) -+ SET_BIT (changed, to); - else -- stats.unified_vars_static++; -- bitmap_ior_into (tmp, get_varinfo (tounify)->solution); -- merge_graph_nodes (graph, n, tounify); -- condense_varmap_nodes (n, tounify); -- -- if (update_changed && TEST_BIT (changed, tounify)) - { -- RESET_BIT (changed, tounify); -- if (!TEST_BIT (changed, n)) -- SET_BIT (changed, n); -- else -- { -- gcc_assert (changed_count > 0); -- changed_count--; -- } -+ gcc_assert (changed_count > 0); -+ changed_count--; - } -+ } - -- bitmap_clear (get_varinfo (tounify)->solution); -- ++i; -- -- /* If we've either finished processing the entire queue, or -- finished processing all nodes for component n, update the solution for -- n. */ -- if (i == VEC_length (unsigned, si->unification_queue) -- || get_varinfo (VEC_index (unsigned, si->unification_queue, i))->node != n) -+ /* If the solution changes because of the merging, we need to mark -+ the variable as changed. */ -+ if (bitmap_ior_into (get_varinfo (to)->solution, -+ get_varinfo (from)->solution)) -+ { -+ if (update_changed && !TEST_BIT (changed, to)) - { -- /* If the solution changes because of the merging, we need to mark -- the variable as changed. */ -- if (bitmap_ior_into (get_varinfo (n)->solution, tmp)) -- { -- if (update_changed && !TEST_BIT (changed, n)) -- { -- SET_BIT (changed, n); -- changed_count++; -- } -- } -- bitmap_clear (tmp); -- -- if (valid_graph_edge (graph, n, n)) -- { -- if (graph->zero_weight_succs[n]) -- { -- if (graph->zero_weight_preds[n]) -- bitmap_clear_bit (graph->zero_weight_preds[n], n); -- bitmap_clear_bit (graph->zero_weight_succs[n], n); -- } -- if (valid_weighted_graph_edge (graph, n, n)) -- { -- bitmap weights = *(get_graph_weights (graph, n, n)); -- if (!weights || bitmap_empty_p (weights)) -- erase_graph_self_edge (graph, n); -- } -- } -+ SET_BIT (changed, to); -+ changed_count++; - } - } -- BITMAP_FREE (tmp); -+ -+ BITMAP_FREE (get_varinfo (from)->solution); -+ BITMAP_FREE (get_varinfo (from)->oldsolution); -+ -+ if (stats.iterations > 0) -+ { -+ BITMAP_FREE (get_varinfo (to)->oldsolution); -+ get_varinfo (to)->oldsolution = BITMAP_ALLOC (&oldpta_obstack); -+ } -+ -+ if (valid_graph_edge (graph, to, to)) -+ { -+ if (graph->succs[to]) -+ bitmap_clear_bit (graph->succs[to], to); -+ } - } - -- - /* Information needed to compute the topological ordering of a graph. */ - - struct topo_info -@@ -1509,37 +1287,24 @@ - topo_visit (constraint_graph_t graph, struct topo_info *ti, - unsigned int n) - { -- VEC(constraint_edge_t,heap) *succs = graph->succs[n]; -- bitmap temp; - bitmap_iterator bi; -- constraint_edge_t c; -- int i; - unsigned int j; - - SET_BIT (ti->visited, n); -- if (VEC_length (constraint_edge_t, succs) != 0) -- { -- temp = BITMAP_ALLOC (&iteration_obstack); -- if (graph->zero_weight_succs[n]) -- bitmap_ior_into (temp, graph->zero_weight_succs[n]); -- for (i = 0; VEC_iterate (constraint_edge_t, succs, i, c); i++) -- bitmap_set_bit (temp, c->dest); -- } -- else -- temp = graph->zero_weight_succs[n]; - -- if (temp) -- EXECUTE_IF_SET_IN_BITMAP (temp, 0, j, bi) -+ if (graph->succs[n]) -+ EXECUTE_IF_SET_IN_BITMAP (graph->succs[n], 0, j, bi) - { - if (!TEST_BIT (ti->visited, j)) - topo_visit (graph, ti, j); - } -+ - VEC_safe_push (unsigned, heap, ti->topo_order, n); - } - - /* Return true if variable N + OFFSET is a legal field of N. */ - --static bool -+static bool - type_safe (unsigned int n, unsigned HOST_WIDE_INT *offset) - { - varinfo_t ninfo = get_varinfo (n); -@@ -1582,10 +1347,10 @@ - v = first_vi_for_offset (get_varinfo (j), fieldoffset); - if (!v) - continue; -- t = v->node; -+ t = find (v->id); - sol = get_varinfo (t)->solution; - if (!bitmap_bit_p (sol, rhs)) -- { -+ { - bitmap_set_bit (sol, rhs); - if (!TEST_BIT (changed, t)) - { -@@ -1596,7 +1361,7 @@ - } - else if (0 && dump_file && !(get_varinfo (j)->is_special_var)) - fprintf (dump_file, "Untypesafe usage in do_da_constraint.\n"); -- -+ - } - } - -@@ -1607,7 +1372,7 @@ - do_sd_constraint (constraint_graph_t graph, constraint_t c, - bitmap delta) - { -- unsigned int lhs = get_varinfo (c->lhs.var)->node; -+ unsigned int lhs = find (c->lhs.var); - bool flag = false; - bitmap sol = get_varinfo (lhs)->solution; - unsigned int j; -@@ -1620,7 +1385,7 @@ - bitmap_set_bit (sol, anything_id); - goto done; - } -- /* For each variable j in delta (Sol(y)), add -+ /* For each variable j in delta (Sol(y)), add - an edge in the graph from j to x, and union Sol(j) into Sol(x). */ - EXECUTE_IF_SET_IN_BITMAP (delta, 0, j, bi) - { -@@ -1634,18 +1399,18 @@ - v = first_vi_for_offset (get_varinfo (j), fieldoffset); - if (!v) - continue; -- t = v->node; -+ t = find (v->id); - - /* Adding edges from the special vars is pointless. - They don't have sets that can change. */ - if (get_varinfo (t) ->is_special_var) - flag |= bitmap_ior_into (sol, get_varinfo (t)->solution); -- else if (int_add_graph_edge (graph, lhs, t, 0)) -+ else if (add_graph_edge (graph, lhs, t)) - flag |= bitmap_ior_into (sol, get_varinfo (t)->solution); - } - else if (0 && dump_file && !(get_varinfo (j)->is_special_var)) - fprintf (dump_file, "Untypesafe usage in do_sd_constraint\n"); -- -+ - } - - done: -@@ -1658,15 +1423,15 @@ - SET_BIT (changed, lhs); - changed_count++; - } -- } -+ } - } - - /* Process a constraint C that represents *x = y. */ - - static void --do_ds_constraint (constraint_graph_t graph, constraint_t c, bitmap delta) -+do_ds_constraint (constraint_t c, bitmap delta) - { -- unsigned int rhs = get_varinfo (c->rhs.var)->node; -+ unsigned int rhs = find (c->rhs.var); - unsigned HOST_WIDE_INT roff = c->rhs.offset; - bitmap sol = get_varinfo (rhs)->solution; - unsigned int j; -@@ -1685,8 +1450,8 @@ - v = first_vi_for_offset (get_varinfo (j), fieldoffset); - if (!v) - continue; -- t = v->node; -- -+ t = find (v->id); -+ - if (!bitmap_bit_p (get_varinfo (t)->solution, anything_id)) - { - bitmap_set_bit (get_varinfo (t)->solution, anything_id); -@@ -1705,40 +1470,39 @@ - EXECUTE_IF_SET_IN_BITMAP (delta, 0, j, bi) - { - unsigned HOST_WIDE_INT loff = c->lhs.offset; -- if (type_safe (j, &loff) && !(get_varinfo(j)->is_special_var)) -+ if (type_safe (j, &loff) && !(get_varinfo (j)->is_special_var)) - { - varinfo_t v; - unsigned int t; - unsigned HOST_WIDE_INT fieldoffset = get_varinfo (j)->offset + loff; -+ bitmap tmp; - - v = first_vi_for_offset (get_varinfo (j), fieldoffset); - if (!v) - continue; -- t = v->node; -- if (int_add_graph_edge (graph, t, rhs, roff)) -+ t = find (v->id); -+ tmp = get_varinfo (t)->solution; -+ -+ if (set_union_with_increment (tmp, sol, roff)) - { -- bitmap tmp = get_varinfo (t)->solution; -- if (set_union_with_increment (tmp, sol, roff)) -+ get_varinfo (t)->solution = tmp; -+ if (t == rhs) -+ sol = get_varinfo (rhs)->solution; -+ if (!TEST_BIT (changed, t)) - { -- get_varinfo (t)->solution = tmp; -- if (t == rhs) -- sol = get_varinfo (rhs)->solution; -- if (!TEST_BIT (changed, t)) -- { -- SET_BIT (changed, t); -- changed_count++; -- } -+ SET_BIT (changed, t); -+ changed_count++; - } - } -- } -+ } - else if (0 && dump_file && !(get_varinfo (j)->is_special_var)) - fprintf (dump_file, "Untypesafe usage in do_ds_constraint\n"); - } - } - --/* Handle a non-simple (simple meaning requires no iteration), non-copy -- constraint (IE *x = &y, x = *y, and *x = y). */ -- -+/* Handle a non-simple (simple meaning requires no iteration), -+ constraint (IE *x = &y, x = *y, *x = y, and x = y with offsets involved). */ -+ - static void - do_complex_constraint (constraint_graph_t graph, constraint_t c, bitmap delta) - { -@@ -1752,33 +1516,62 @@ - else - { - /* *x = y */ -- do_ds_constraint (graph, c, delta); -+ do_ds_constraint (c, delta); - } - } -- else -+ else if (c->rhs.type == DEREF) - { - /* x = *y */ - if (!(get_varinfo (c->lhs.var)->is_special_var)) - do_sd_constraint (graph, c, delta); - } -+ else -+ { -+ bitmap tmp; -+ bitmap solution; -+ bool flag = false; -+ unsigned int t; -+ -+ gcc_assert (c->rhs.type == SCALAR && c->lhs.type == SCALAR); -+ t = find (c->rhs.var); -+ solution = get_varinfo (t)->solution; -+ t = find (c->lhs.var); -+ tmp = get_varinfo (t)->solution; -+ -+ flag = set_union_with_increment (tmp, solution, c->rhs.offset); -+ -+ if (flag) -+ { -+ get_varinfo (t)->solution = tmp; -+ if (!TEST_BIT (changed, t)) -+ { -+ SET_BIT (changed, t); -+ changed_count++; -+ } -+ } -+ } - } - - /* Initialize and return a new SCC info structure. */ - - static struct scc_info * --init_scc_info (void) -+init_scc_info (size_t size) - { - struct scc_info *si = XNEW (struct scc_info); -- size_t size = VEC_length (varinfo_t, varmap); -+ size_t i; - - si->current_index = 0; - si->visited = sbitmap_alloc (size); - sbitmap_zero (si->visited); -- si->in_component = sbitmap_alloc (size); -- sbitmap_ones (si->in_component); -- si->visited_index = XCNEWVEC (unsigned int, size + 1); -+ si->roots = sbitmap_alloc (size); -+ sbitmap_zero (si->roots); -+ si->node_mapping = XNEWVEC (unsigned int, size); -+ si->dfs = XCNEWVEC (unsigned int, size); -+ -+ for (i = 0; i < size; i++) -+ si->node_mapping[i] = i; -+ - si->scc_stack = VEC_alloc (unsigned, heap, 1); -- si->unification_queue = VEC_alloc (unsigned, heap, 1); - return si; - } - -@@ -1786,209 +1579,430 @@ - - static void - free_scc_info (struct scc_info *si) --{ -+{ - sbitmap_free (si->visited); -- sbitmap_free (si->in_component); -- free (si->visited_index); -+ sbitmap_free (si->roots); -+ free (si->node_mapping); -+ free (si->dfs); - VEC_free (unsigned, heap, si->scc_stack); -- VEC_free (unsigned, heap, si->unification_queue); -- free(si); -+ free (si); - } - - --/* Find cycles in GRAPH that occur, using strongly connected components, and -- collapse the cycles into a single representative node. if UPDATE_CHANGED -- is true, then update the changed sbitmap to note those nodes whose -- solutions have changed as a result of collapsing. */ -+/* Find indirect cycles in GRAPH that occur, using strongly connected -+ components, and note them in the indirect cycles map. - -+ This technique comes from Ben Hardekopf and Calvin Lin, -+ "It Pays to be Lazy: Fast and Accurate Pointer Analysis for Millions of -+ Lines of Code", submitted to PLDI 2007. */ -+ - static void --find_and_collapse_graph_cycles (constraint_graph_t graph, bool update_changed) -+find_indirect_cycles (constraint_graph_t graph) - { - unsigned int i; -- unsigned int size = VEC_length (varinfo_t, varmap); -- struct scc_info *si = init_scc_info (); -+ unsigned int size = graph->size; -+ struct scc_info *si = init_scc_info (size); - -- for (i = 0; i != size; ++i) -- if (!TEST_BIT (si->visited, i) && get_varinfo (i)->node == i) -+ for (i = 0; i < MIN (LAST_REF_NODE, size); i ++ ) -+ if (!TEST_BIT (si->visited, i) && find (i) == i) - scc_visit (graph, si, i); -- -- process_unification_queue (graph, si, update_changed); -+ - free_scc_info (si); - } - - /* Compute a topological ordering for GRAPH, and store the result in the - topo_info structure TI. */ - --static void -+static void - compute_topo_order (constraint_graph_t graph, - struct topo_info *ti) - { - unsigned int i; - unsigned int size = VEC_length (varinfo_t, varmap); -- -+ - for (i = 0; i != size; ++i) -- if (!TEST_BIT (ti->visited, i) && get_varinfo (i)->node == i) -+ if (!TEST_BIT (ti->visited, i) && find (i) == i) - topo_visit (graph, ti, i); - } - --/* Return true if bitmap B is empty, or a bitmap other than bit 0 is set. */ -+/* Perform offline variable substitution. - --static bool --bitmap_other_than_zero_bit_set (bitmap b) --{ -- unsigned int i; -- bitmap_iterator bi; -- -- if (bitmap_empty_p (b)) -- return false; -- EXECUTE_IF_SET_IN_BITMAP (b, 1, i, bi) -- return true; -- return false; --} -- --/* Perform offline variable substitution. -- - This is a linear time way of identifying variables that must have - equivalent points-to sets, including those caused by static cycles, - and single entry subgraphs, in the constraint graph. - - The technique is described in "Off-line variable substitution for - scaling points-to analysis" by Atanas Rountev and Satish Chandra, -- in "ACM SIGPLAN Notices" volume 35, number 5, pages 47-56. */ -+ in "ACM SIGPLAN Notices" volume 35, number 5, pages 47-56. - -+ There is an optimal way to do this involving hash based value -+ numbering, once the technique is published i will implement it -+ here. -+ -+ The general method of finding equivalence classes is as follows: -+ Add fake nodes (REF nodes) and edges for *a = b and a = *b constraints. -+ Add fake nodes (ADDRESS nodes) and edges for a = &b constraints. -+ Initialize all non-REF/ADDRESS nodes to be direct nodes -+ For each SCC in the predecessor graph: -+ for each member (x) of the SCC -+ if x is not a direct node: -+ set rootnode(SCC) to be not a direct node -+ collapse node x into rootnode(SCC). -+ if rootnode(SCC) is not a direct node: -+ label rootnode(SCC) with a new equivalence class -+ else: -+ if all labeled predecessors of rootnode(SCC) have the same -+ label: -+ label rootnode(SCC) with this label -+ else: -+ label rootnode(SCC) with a new equivalence class -+ -+ All direct nodes with the same equivalence class can be replaced -+ with a single representative node. -+ All unlabeled nodes (label == 0) are not pointers and all edges -+ involving them can be eliminated. -+ We perform these optimizations during move_complex_constraints. -+*/ -+ -+static int equivalence_class; -+ -+/* Recursive routine to find strongly connected components in GRAPH, -+ and label it's nodes with equivalence classes. -+ This is used during variable substitution to find cycles involving -+ the regular or implicit predecessors, and label them as equivalent. -+ The SCC finding algorithm used is the same as that for scc_visit. */ -+ - static void --perform_var_substitution (constraint_graph_t graph) -+label_visit (constraint_graph_t graph, struct scc_info *si, unsigned int n) - { -- struct topo_info *ti = init_topo_info (); -- -- bitmap_obstack_initialize (&iteration_obstack); -- /* Compute the topological ordering of the graph, then visit each -- node in topological order. */ -- compute_topo_order (graph, ti); -- -- while (VEC_length (unsigned, ti->topo_order) != 0) -+ unsigned int i; -+ bitmap_iterator bi; -+ unsigned int my_dfs; -+ -+ gcc_assert (si->node_mapping[n] == n); -+ SET_BIT (si->visited, n); -+ si->dfs[n] = si->current_index ++; -+ my_dfs = si->dfs[n]; -+ -+ /* Visit all the successors. */ -+ EXECUTE_IF_IN_NONNULL_BITMAP (graph->preds[n], 0, i, bi) - { -- unsigned int i = VEC_pop (unsigned, ti->topo_order); -- unsigned int pred; -- varinfo_t vi = get_varinfo (i); -- bool okay_to_elim = false; -- unsigned int root = VEC_length (varinfo_t, varmap); -- VEC(constraint_edge_t,heap) *predvec = graph->preds[i]; -- constraint_edge_t ce = NULL; -- bitmap tmp; -- unsigned int k; -- bitmap_iterator bi; -+ unsigned int w = si->node_mapping[i]; - -- /* We can't eliminate things whose address is taken, or which is -- the target of a dereference. */ -- if (vi->address_taken || vi->indirect_target) -+ if (TEST_BIT (si->roots, w)) - continue; - -- /* See if all predecessors of I are ripe for elimination */ -- EXECUTE_IF_IN_NONNULL_BITMAP (graph->zero_weight_preds[i], 0, k, bi) -- { -- unsigned int w; -- w = get_varinfo (k)->node; -+ if (!TEST_BIT (si->visited, w)) -+ label_visit (graph, si, w); -+ { -+ unsigned int t = si->node_mapping[w]; -+ unsigned int nnode = si->node_mapping[n]; -+ gcc_assert (nnode == n); - -- /* We can't eliminate the node if one of the predecessors is -- part of a different strongly connected component. */ -- if (!okay_to_elim) -- { -- root = w; -- okay_to_elim = true; -- } -- else if (w != root) -- { -- okay_to_elim = false; -- break; -- } -+ if (si->dfs[t] < si->dfs[nnode]) -+ si->dfs[n] = si->dfs[t]; -+ } -+ } - -- /* Theorem 4 in Rountev and Chandra: If i is a direct node, -- then Solution(i) is a subset of Solution (w), where w is a -- predecessor in the graph. -- Corollary: If all predecessors of i have the same -- points-to set, then i has that same points-to set as -- those predecessors. */ -- tmp = BITMAP_ALLOC (NULL); -- bitmap_and_compl (tmp, get_varinfo (i)->solution, -- get_varinfo (w)->solution); -- if (!bitmap_empty_p (tmp)) -- { -- okay_to_elim = false; -- BITMAP_FREE (tmp); -- break; -- } -- BITMAP_FREE (tmp); -- } -+ /* Visit all the implicit predecessors. */ -+ EXECUTE_IF_IN_NONNULL_BITMAP (graph->implicit_preds[n], 0, i, bi) -+ { -+ unsigned int w = si->node_mapping[i]; - -- if (okay_to_elim) -- for (pred = 0; -- VEC_iterate (constraint_edge_t, predvec, pred, ce); -- pred++) -- { -- bitmap weight; -- unsigned int w; -- weight = *(get_graph_weights (graph, i, ce->dest)); -+ if (TEST_BIT (si->roots, w)) -+ continue; - -- /* We can't eliminate variables that have nonzero weighted -- edges between them. */ -- if (weight && bitmap_other_than_zero_bit_set (weight)) -- { -- okay_to_elim = false; -- break; -- } -- w = get_varinfo (ce->dest)->node; -+ if (!TEST_BIT (si->visited, w)) -+ label_visit (graph, si, w); -+ { -+ unsigned int t = si->node_mapping[w]; -+ unsigned int nnode = si->node_mapping[n]; -+ gcc_assert (nnode == n); - -- /* We can't eliminate the node if one of the predecessors is -- part of a different strongly connected component. */ -- if (!okay_to_elim) -- { -- root = w; -- okay_to_elim = true; -- } -- else if (w != root) -- { -- okay_to_elim = false; -- break; -- } -+ if (si->dfs[t] < si->dfs[nnode]) -+ si->dfs[n] = si->dfs[t]; -+ } -+ } - -- /* Theorem 4 in Rountev and Chandra: If i is a direct node, -- then Solution(i) is a subset of Solution (w), where w is a -- predecessor in the graph. -- Corollary: If all predecessors of i have the same -- points-to set, then i has that same points-to set as -- those predecessors. */ -- tmp = BITMAP_ALLOC (NULL); -- bitmap_and_compl (tmp, get_varinfo (i)->solution, -- get_varinfo (w)->solution); -- if (!bitmap_empty_p (tmp)) -- { -- okay_to_elim = false; -- BITMAP_FREE (tmp); -- break; -- } -- BITMAP_FREE (tmp); -- } -+ /* See if any components have been identified. */ -+ if (si->dfs[n] == my_dfs) -+ { -+ while (VEC_length (unsigned, si->scc_stack) != 0 -+ && si->dfs[VEC_last (unsigned, si->scc_stack)] >= my_dfs) -+ { -+ unsigned int w = VEC_pop (unsigned, si->scc_stack); -+ si->node_mapping[w] = n; - -- /* See if the root is different than the original node. -- If so, we've found an equivalence. */ -- if (root != get_varinfo (i)->node && okay_to_elim) -+ if (!TEST_BIT (graph->direct_nodes, w)) -+ RESET_BIT (graph->direct_nodes, n); -+ } -+ SET_BIT (si->roots, n); -+ -+ if (!TEST_BIT (graph->direct_nodes, n)) - { -- /* Found an equivalence */ -- get_varinfo (i)->node = root; -- collapse_nodes (graph, root, i); -+ graph->label[n] = equivalence_class++; -+ } -+ else -+ { -+ unsigned int size = 0; -+ unsigned int firstlabel = ~0; -+ -+ EXECUTE_IF_IN_NONNULL_BITMAP (graph->preds[n], 0, i, bi) -+ { -+ unsigned int j = si->node_mapping[i]; -+ -+ if (j == n || graph->label[j] == 0) -+ continue; -+ -+ if (firstlabel == (unsigned int)~0) -+ { -+ firstlabel = graph->label[j]; -+ size++; -+ } -+ else if (graph->label[j] != firstlabel) -+ size++; -+ } -+ -+ if (size == 0) -+ graph->label[n] = 0; -+ else if (size == 1) -+ graph->label[n] = firstlabel; -+ else -+ graph->label[n] = equivalence_class++; -+ } -+ } -+ else -+ VEC_safe_push (unsigned, heap, si->scc_stack, n); -+} -+ -+/* Perform offline variable substitution, discovering equivalence -+ classes, and eliminating non-pointer variables. */ -+ -+static struct scc_info * -+perform_var_substitution (constraint_graph_t graph) -+{ -+ unsigned int i; -+ unsigned int size = graph->size; -+ struct scc_info *si = init_scc_info (size); -+ -+ bitmap_obstack_initialize (&iteration_obstack); -+ equivalence_class = 0; -+ -+ /* We only need to visit the non-address nodes for labeling -+ purposes, as the address nodes will never have any predecessors, -+ because &x never appears on the LHS of a constraint. */ -+ for (i = 0; i < LAST_REF_NODE; i++) -+ if (!TEST_BIT (si->visited, si->node_mapping[i])) -+ label_visit (graph, si, si->node_mapping[i]); -+ -+ if (dump_file && (dump_flags & TDF_DETAILS)) -+ for (i = 0; i < FIRST_REF_NODE; i++) -+ { -+ bool direct_node = TEST_BIT (graph->direct_nodes, i); -+ fprintf (dump_file, -+ "Equivalence class for %s node id %d:%s is %d\n", -+ direct_node ? "Direct node" : "Indirect node", i, -+ get_varinfo (i)->name, -+ graph->label[si->node_mapping[i]]); -+ } -+ -+ /* Quickly eliminate our non-pointer variables. */ -+ -+ for (i = 0; i < FIRST_REF_NODE; i++) -+ { -+ unsigned int node = si->node_mapping[i]; -+ -+ if (graph->label[node] == 0 && TEST_BIT (graph->direct_nodes, node)) -+ { - if (dump_file && (dump_flags & TDF_DETAILS)) -- fprintf (dump_file, "Collapsing %s into %s\n", -- get_varinfo (i)->name, -- get_varinfo (root)->name); -- stats.collapsed_vars++; -+ fprintf (dump_file, -+ "%s is a non-pointer variable, eliminating edges.\n", -+ get_varinfo (node)->name); -+ stats.nonpointer_vars++; -+ clear_edges_for_node (graph, node); - } - } -+ return si; -+} - -+/* Free information that was only necessary for variable -+ substitution. */ -+ -+static void -+free_var_substitution_info (struct scc_info *si) -+{ -+ free_scc_info (si); -+ free (graph->label); -+ free (graph->eq_rep); -+ sbitmap_free (graph->direct_nodes); - bitmap_obstack_release (&iteration_obstack); -- free_topo_info (ti); - } - -+/* Return an existing node that is equivalent to NODE, which has -+ equivalence class LABEL, if one exists. Return NODE otherwise. */ -+ -+static unsigned int -+find_equivalent_node (constraint_graph_t graph, -+ unsigned int node, unsigned int label) -+{ -+ /* If the address version of this variable is unused, we can -+ substitute it for anything else with the same label. -+ Otherwise, we know the pointers are equivalent, but not the -+ locations. */ -+ -+ if (graph->label[FIRST_ADDR_NODE + node] == 0) -+ { -+ gcc_assert (label < graph->size); -+ -+ if (graph->eq_rep[label] != -1) -+ { -+ /* Unify the two variables since we know they are equivalent. */ -+ if (unite (graph->eq_rep[label], node)) -+ unify_nodes (graph, graph->eq_rep[label], node, false); -+ return graph->eq_rep[label]; -+ } -+ else -+ { -+ graph->eq_rep[label] = node; -+ } -+ } -+ return node; -+} -+ -+/* Move complex constraints to the appropriate nodes, and collapse -+ variables we've discovered are equivalent during variable -+ substitution. SI is the SCC_INFO that is the result of -+ perform_variable_substitution. */ -+ -+static void -+move_complex_constraints (constraint_graph_t graph, -+ struct scc_info *si) -+{ -+ int i; -+ unsigned int j; -+ constraint_t c; -+ -+ for (j = 0; j < graph->size; j++) -+ gcc_assert (find (j) == j); -+ -+ for (i = 0; VEC_iterate (constraint_t, constraints, i, c); i++) -+ { -+ struct constraint_expr lhs = c->lhs; -+ struct constraint_expr rhs = c->rhs; -+ unsigned int lhsvar = find (get_varinfo_fc (lhs.var)->id); -+ unsigned int rhsvar = find (get_varinfo_fc (rhs.var)->id); -+ unsigned int lhsnode, rhsnode; -+ unsigned int lhslabel, rhslabel; -+ -+ lhsnode = si->node_mapping[lhsvar]; -+ rhsnode = si->node_mapping[rhsvar]; -+ lhslabel = graph->label[lhsnode]; -+ rhslabel = graph->label[rhsnode]; -+ -+ /* See if it is really a non-pointer variable, and if so, ignore -+ the constraint. */ -+ if (lhslabel == 0) -+ { -+ if (!TEST_BIT (graph->direct_nodes, lhsnode)) -+ lhslabel = graph->label[lhsnode] = equivalence_class++; -+ else -+ { -+ if (dump_file && (dump_flags & TDF_DETAILS)) -+ { -+ -+ fprintf (dump_file, "%s is a non-pointer variable," -+ "ignoring constraint:", -+ get_varinfo (lhs.var)->name); -+ dump_constraint (dump_file, c); -+ } -+ VEC_replace (constraint_t, constraints, i, NULL); -+ continue; -+ } -+ } -+ -+ if (rhslabel == 0) -+ { -+ if (!TEST_BIT (graph->direct_nodes, rhsnode)) -+ rhslabel = graph->label[rhsnode] = equivalence_class++; -+ else -+ { -+ if (dump_file && (dump_flags & TDF_DETAILS)) -+ { -+ -+ fprintf (dump_file, "%s is a non-pointer variable," -+ "ignoring constraint:", -+ get_varinfo (rhs.var)->name); -+ dump_constraint (dump_file, c); -+ } -+ VEC_replace (constraint_t, constraints, i, NULL); -+ continue; -+ } -+ } -+ -+ lhsvar = find_equivalent_node (graph, lhsvar, lhslabel); -+ rhsvar = find_equivalent_node (graph, rhsvar, rhslabel); -+ c->lhs.var = lhsvar; -+ c->rhs.var = rhsvar; -+ -+ if (lhs.type == DEREF) -+ { -+ if (rhs.type == ADDRESSOF || rhsvar > anything_id) -+ insert_into_complex (graph, lhsvar, c); -+ } -+ else if (rhs.type == DEREF) -+ { -+ if (!(get_varinfo (lhsvar)->is_special_var)) -+ insert_into_complex (graph, rhsvar, c); -+ } -+ else if (rhs.type != ADDRESSOF && lhsvar > anything_id -+ && (lhs.offset != 0 || rhs.offset != 0)) -+ { -+ insert_into_complex (graph, rhsvar, c); -+ } -+ -+ } -+} -+ -+/* Eliminate indirect cycles involving NODE. Return true if NODE was -+ part of an SCC, false otherwise. */ -+ -+static bool -+eliminate_indirect_cycles (unsigned int node) -+{ -+ if (graph->indirect_cycles[node] != -1 -+ && !bitmap_empty_p (get_varinfo (node)->solution)) -+ { -+ unsigned int i; -+ VEC(unsigned,heap) *queue = NULL; -+ int queuepos; -+ unsigned int to = find (graph->indirect_cycles[node]); -+ bitmap_iterator bi; -+ -+ /* We can't touch the solution set and call unify_nodes -+ at the same time, because unify_nodes is going to do -+ bitmap unions into it. */ -+ -+ EXECUTE_IF_SET_IN_BITMAP (get_varinfo (node)->solution, 0, i, bi) -+ { -+ if (find (i) == i && i != to) -+ { -+ if (unite (to, i)) -+ VEC_safe_push (unsigned, heap, queue, i); -+ } -+ } -+ -+ for (queuepos = 0; -+ VEC_iterate (unsigned, queue, queuepos, i); -+ queuepos++) -+ { -+ unify_nodes (graph, to, i, true); -+ } -+ VEC_free (unsigned, heap, queue); -+ return true; -+ } -+ return false; -+} -+ - /* Solve the constraint graph GRAPH using our worklist solver. - This is based on the PW* family of solvers from the "Efficient Field - Sensitive Pointer Analysis for C" paper. -@@ -2001,17 +2015,28 @@ - { - unsigned int size = VEC_length (varinfo_t, varmap); - unsigned int i; -+ bitmap pts; - -- changed_count = size; -+ changed_count = 0; - changed = sbitmap_alloc (size); -- sbitmap_ones (changed); -- -- /* The already collapsed/unreachable nodes will never change, so we -- need to account for them in changed_count. */ -+ sbitmap_zero (changed); -+ -+ /* Mark all initial non-collapsed nodes as changed. */ - for (i = 0; i < size; i++) -- if (get_varinfo (i)->node != i) -- changed_count--; -- -+ { -+ varinfo_t ivi = get_varinfo (i); -+ if (find (i) == i && !bitmap_empty_p (ivi->solution) -+ && ((graph->succs[i] && !bitmap_empty_p (graph->succs[i])) -+ || VEC_length (constraint_t, graph->complex[i]) > 0)) -+ { -+ SET_BIT (changed, i); -+ changed_count++; -+ } -+ } -+ -+ /* Allocate a bitmap to be used to store the changed bits. */ -+ pts = BITMAP_ALLOC (&pta_obstack); -+ - while (changed_count > 0) - { - unsigned int i; -@@ -2019,41 +2044,45 @@ - stats.iterations++; - - bitmap_obstack_initialize (&iteration_obstack); -- -- if (edge_added) -- { -- /* We already did cycle elimination once, when we did -- variable substitution, so we don't need it again for the -- first iteration. */ -- if (stats.iterations > 1) -- find_and_collapse_graph_cycles (graph, true); - -- edge_added = false; -- } -- - compute_topo_order (graph, ti); - - while (VEC_length (unsigned, ti->topo_order) != 0) - { -+ - i = VEC_pop (unsigned, ti->topo_order); -- gcc_assert (get_varinfo (i)->node == i); - -+ /* If this variable is not a representative, skip it. */ -+ if (find (i) != i) -+ continue; -+ -+ /* In certain indirect cycle cases, we may merge this -+ variable to another. */ -+ if (eliminate_indirect_cycles (i) && find (i) != i) -+ continue; -+ - /* If the node has changed, we need to process the - complex constraints and outgoing edges again. */ - if (TEST_BIT (changed, i)) - { - unsigned int j; - constraint_t c; -- constraint_edge_t e = NULL; - bitmap solution; -- bitmap_iterator bi; -- VEC(constraint_t,heap) *complex = get_varinfo (i)->complex; -- VEC(constraint_edge_t,heap) *succs; -+ VEC(constraint_t,heap) *complex = graph->complex[i]; - bool solution_empty; - - RESET_BIT (changed, i); - changed_count--; - -+ /* Compute the changed set of solution bits. */ -+ bitmap_and_compl (pts, get_varinfo (i)->solution, -+ get_varinfo (i)->oldsolution); -+ -+ if (bitmap_empty_p (pts)) -+ continue; -+ -+ bitmap_ior_into (get_varinfo (i)->oldsolution, pts); -+ - solution = get_varinfo (i)->solution; - solution_empty = bitmap_empty_p (solution); - -@@ -2065,52 +2094,38 @@ - is a constraint where the lhs side is receiving - some set from elsewhere. */ - if (!solution_empty || c->lhs.type != DEREF) -- do_complex_constraint (graph, c, solution); -+ do_complex_constraint (graph, c, pts); - } - - solution_empty = bitmap_empty_p (solution); - - if (!solution_empty) - { -+ bitmap_iterator bi; -+ - /* Propagate solution to all successors. */ -- succs = graph->succs[i]; -- -- EXECUTE_IF_IN_NONNULL_BITMAP (graph->zero_weight_succs[i], -+ EXECUTE_IF_IN_NONNULL_BITMAP (graph->succs[i], - 0, j, bi) - { -- bitmap tmp = get_varinfo (j)->solution; -- bool flag = false; -- -- flag = set_union_with_increment (tmp, solution, 0); -- -- if (flag) -- { -- get_varinfo (j)->solution = tmp; -- if (!TEST_BIT (changed, j)) -- { -- SET_BIT (changed, j); -- changed_count++; -- } -- } -- } -- for (j = 0; VEC_iterate (constraint_edge_t, succs, j, e); j++) -- { -- bitmap tmp = get_varinfo (e->dest)->solution; -- bool flag = false; -- unsigned int k; -- bitmap weights = e->weights; -- bitmap_iterator bi; -+ bitmap tmp; -+ bool flag; - -- gcc_assert (weights && !bitmap_empty_p (weights)); -- EXECUTE_IF_SET_IN_BITMAP (weights, 0, k, bi) -- flag |= set_union_with_increment (tmp, solution, k); -+ unsigned int to = find (j); -+ tmp = get_varinfo (to)->solution; -+ flag = false; - -+ /* Don't try to propagate to ourselves. */ -+ if (to == i) -+ continue; -+ -+ flag = set_union_with_increment (tmp, pts, 0); -+ - if (flag) - { -- get_varinfo (e->dest)->solution = tmp; -- if (!TEST_BIT (changed, e->dest)) -+ get_varinfo (to)->solution = tmp; -+ if (!TEST_BIT (changed, to)) - { -- SET_BIT (changed, e->dest); -+ SET_BIT (changed, to); - changed_count++; - } - } -@@ -2122,74 +2137,37 @@ - bitmap_obstack_release (&iteration_obstack); - } - -+ BITMAP_FREE (pts); - sbitmap_free (changed); -+ bitmap_obstack_release (&oldpta_obstack); - } - -+/* Map from trees to variable infos. */ -+static struct pointer_map_t *vi_for_tree; - --/* CONSTRAINT AND VARIABLE GENERATION FUNCTIONS */ - --/* Map from trees to variable ids. */ --static htab_t id_for_tree; -+/* Insert ID as the variable id for tree T in the vi_for_tree map. */ - --typedef struct tree_id -+static void -+insert_vi_for_tree (tree t, varinfo_t vi) - { -- tree t; -- unsigned int id; --} *tree_id_t; -- --/* Hash a tree id structure. */ -- --static hashval_t --tree_id_hash (const void *p) --{ -- const tree_id_t ta = (tree_id_t) p; -- return htab_hash_pointer (ta->t); --} -- --/* Return true if the tree in P1 and the tree in P2 are the same. */ -- --static int --tree_id_eq (const void *p1, const void *p2) --{ -- const tree_id_t ta1 = (tree_id_t) p1; -- const tree_id_t ta2 = (tree_id_t) p2; -- return ta1->t == ta2->t; --} -- --/* Insert ID as the variable id for tree T in the hashtable. */ -- --static void --insert_id_for_tree (tree t, int id) --{ -- void **slot; -- struct tree_id finder; -- tree_id_t new_pair; -- -- finder.t = t; -- slot = htab_find_slot (id_for_tree, &finder, INSERT); -+ void **slot = pointer_map_insert (vi_for_tree, t); -+ gcc_assert (vi); - gcc_assert (*slot == NULL); -- new_pair = XNEW (struct tree_id); -- new_pair->t = t; -- new_pair->id = id; -- *slot = (void *)new_pair; -+ *slot = vi; - } - --/* Find the variable id for tree T in ID_FOR_TREE. If T does not -- exist in the hash table, return false, otherwise, return true and -- set *ID to the id we found. */ -+/* Find the variable info for tree T in VI_FOR_TREE. If T does not -+ exist in the map, return NULL, otherwise, return the varinfo we found. */ - --static bool --lookup_id_for_tree (tree t, unsigned int *id) -+static varinfo_t -+lookup_vi_for_tree (tree t) - { -- tree_id_t pair; -- struct tree_id finder; -+ void **slot = pointer_map_contains (vi_for_tree, t); -+ if (slot == NULL) -+ return NULL; - -- finder.t = t; -- pair = htab_find (id_for_tree, &finder); -- if (pair == NULL) -- return false; -- *id = pair->id; -- return true; -+ return (varinfo_t) *slot; - } - - /* Return a printable name for DECL */ -@@ -2210,7 +2188,7 @@ - - if (TREE_CODE (decl) == SSA_NAME) - { -- num_printed = asprintf (&temp, "%s_%u", -+ num_printed = asprintf (&temp, "%s_%u", - alias_get_name (SSA_NAME_VAR (decl)), - SSA_NAME_VERSION (decl)); - } -@@ -2226,21 +2204,17 @@ - return res; - } - --/* Find the variable id for tree T in the hashtable. -- If T doesn't exist in the hash table, create an entry for it. */ -+/* Find the variable id for tree T in the map. -+ If T doesn't exist in the map, create an entry for it and return it. */ - --static unsigned int --get_id_for_tree (tree t) -+static varinfo_t -+get_vi_for_tree (tree t) - { -- tree_id_t pair; -- struct tree_id finder; -+ void **slot = pointer_map_contains (vi_for_tree, t); -+ if (slot == NULL) -+ return get_varinfo (create_variable_info_for (t, alias_get_name (t))); - -- finder.t = t; -- pair = htab_find (id_for_tree, &finder); -- if (pair == NULL) -- return create_variable_info_for (t, alias_get_name (t)); -- -- return pair->id; -+ return (varinfo_t) *slot; - } - - /* Get a constraint expression from an SSA_VAR_P node. */ -@@ -2254,14 +2228,14 @@ - - /* For parameters, get at the points-to set for the actual parm - decl. */ -- if (TREE_CODE (t) == SSA_NAME -- && TREE_CODE (SSA_NAME_VAR (t)) == PARM_DECL -+ if (TREE_CODE (t) == SSA_NAME -+ && TREE_CODE (SSA_NAME_VAR (t)) == PARM_DECL - && default_def (SSA_NAME_VAR (t)) == t) - return get_constraint_exp_from_ssa_var (SSA_NAME_VAR (t)); - - cexpr.type = SCALAR; -- -- cexpr.var = get_id_for_tree (t); -+ -+ cexpr.var = get_vi_for_tree (t)->id; - /* If we determine the result is "anything", and we know this is readonly, - say it points to readonly memory instead. */ - if (cexpr.var == anything_id && TREE_READONLY (t)) -@@ -2269,7 +2243,7 @@ - cexpr.type = ADDRESSOF; - cexpr.var = readonly_id; - } -- -+ - cexpr.offset = 0; - return cexpr; - } -@@ -2290,7 +2264,13 @@ - get_varinfo (lhs.var)->directly_dereferenced = true; - if (rhs.type == DEREF) - get_varinfo (rhs.var)->directly_dereferenced = true; -- -+ -+ if (!use_field_sensitive) -+ { -+ t->rhs.offset = 0; -+ t->lhs.offset = 0; -+ } -+ - /* ANYTHING == ANYTHING is pointless. */ - if (lhs.var == anything_id && rhs.var == anything_id) - return; -@@ -2302,7 +2282,7 @@ - t->lhs = t->rhs; - t->rhs = rhs; - process_constraint (t); -- } -+ } - /* This can happen in our IR with things like n->a = *p */ - else if (rhs.type == DEREF && lhs.type == DEREF && rhs.var != anything_id) - { -@@ -2312,33 +2292,19 @@ - tree pointedtotype = TREE_TYPE (pointertype); - tree tmpvar = create_tmp_var_raw (pointedtotype, "doubledereftmp"); - struct constraint_expr tmplhs = get_constraint_exp_from_ssa_var (tmpvar); -- -+ - /* If this is an aggregate of known size, we should have passed - this off to do_structure_copy, and it should have broken it - up. */ -- gcc_assert (!AGGREGATE_TYPE_P (pointedtotype) -+ gcc_assert (!AGGREGATE_TYPE_P (pointedtotype) - || get_varinfo (rhs.var)->is_unknown_size_var); -- -+ - process_constraint (new_constraint (tmplhs, rhs)); - process_constraint (new_constraint (lhs, tmplhs)); - } -- else if (rhs.type == ADDRESSOF) -- { -- varinfo_t vi; -- gcc_assert (rhs.offset == 0); -- -- /* No need to mark address taken simply because of escaped vars -- constraints. */ -- if (lhs.var != escaped_vars_id) -- for (vi = get_varinfo (rhs.var); vi != NULL; vi = vi->next) -- vi->address_taken = true; -- -- VEC_safe_push (constraint_t, heap, constraints, t); -- } - else - { -- if (lhs.type != DEREF && rhs.type == DEREF) -- get_varinfo (lhs.var)->indirect_target = true; -+ gcc_assert (rhs.type != ADDRESSOF || rhs.offset == 0); - VEC_safe_push (constraint_t, heap, constraints, t); - } - } -@@ -2350,10 +2316,12 @@ - could_have_pointers (tree t) - { - tree type = TREE_TYPE (t); -- -- if (POINTER_TYPE_P (type) || AGGREGATE_TYPE_P (type) -+ -+ if (POINTER_TYPE_P (type) -+ || AGGREGATE_TYPE_P (type) - || TREE_CODE (type) == COMPLEX_TYPE) - return true; -+ - return false; - } - -@@ -2367,9 +2335,9 @@ - if (TREE_CODE (DECL_FIELD_OFFSET (fdecl)) != INTEGER_CST - || TREE_CODE (DECL_FIELD_BIT_OFFSET (fdecl)) != INTEGER_CST) - return -1; -- -- return (tree_low_cst (DECL_FIELD_OFFSET (fdecl), 1) * 8) -- + tree_low_cst (DECL_FIELD_BIT_OFFSET (fdecl), 1); -+ -+ return (tree_low_cst (DECL_FIELD_OFFSET (fdecl), 1) * 8) -+ + tree_low_cst (DECL_FIELD_BIT_OFFSET (fdecl), 1); - } - - -@@ -2388,7 +2356,7 @@ - return true; - if (accesspos < fieldpos && (accesspos + accesssize > fieldpos)) - return true; -- -+ - return false; - } - -@@ -2411,20 +2379,20 @@ - while (!SSA_VAR_P (forzero) && !CONSTANT_CLASS_P (forzero)) - forzero = TREE_OPERAND (forzero, 0); - -- if (CONSTANT_CLASS_P (forzero) && integer_zerop (forzero)) -+ if (CONSTANT_CLASS_P (forzero) && integer_zerop (forzero)) - { - struct constraint_expr temp; -- -+ - temp.offset = 0; - temp.var = integer_id; - temp.type = SCALAR; - VEC_safe_push (ce_s, heap, *results, &temp); - return; - } -- -+ - t = get_ref_base_and_extent (t, &bitpos, &bitsize, &bitmaxsize); - -- /* String constants's are readonly, so there is nothing to really do -+ /* String constants are readonly, so there is nothing to really do - here. */ - if (TREE_CODE (t) == STRING_CST) - return; -@@ -2438,21 +2406,21 @@ - /* This can also happen due to weird offsetof type macros. */ - if (TREE_CODE (t) != ADDR_EXPR && result->type == ADDRESSOF) - result->type = SCALAR; -- -+ - if (result->type == SCALAR) - { - /* In languages like C, you can access one past the end of an - array. You aren't allowed to dereference it, so we can - ignore this constraint. When we handle pointer subtraction, - we may have to do something cute here. */ -- -+ - if (result->offset < get_varinfo (result->var)->fullsize - && bitmaxsize != 0) - { - /* It's also not true that the constraint will actually start at the - right offset, it may start in some padding. We only care about - setting the constraint to the first actual field it touches, so -- walk to find it. */ -+ walk to find it. */ - varinfo_t curr; - for (curr = get_varinfo (result->var); curr; curr = curr->next) - { -@@ -2495,6 +2463,7 @@ - { - struct constraint_expr *c; - unsigned int i = 0; -+ - for (i = 0; VEC_iterate (ce_s, *constraints, i, c); i++) - { - if (c->type == SCALAR) -@@ -2576,6 +2545,7 @@ - tree pttype = TREE_TYPE (TREE_TYPE (t)); - - get_constraint_for (exp, results); -+ - /* Make sure we capture constraints to all elements - of an array. */ - if ((handled_component_p (exp) -@@ -2588,7 +2558,7 @@ - - if (VEC_length (ce_s, *results) == 0) - return; -- -+ - gcc_assert (VEC_length (ce_s, *results) == 1); - origrhs = VEC_last (ce_s, *results); - tmp = *origrhs; -@@ -2619,12 +2589,12 @@ - VEC_safe_push (ce_s, heap, *results, &tmp); - } - } -- -+ - for (i = 0; VEC_iterate (ce_s, *results, i, c); i++) - { - if (c->type == DEREF) - c->type = SCALAR; -- else -+ else - c->type = ADDRESSOF; - } - return; -@@ -2638,9 +2608,9 @@ - { - varinfo_t vi; - tree heapvar = heapvar_lookup (t); -- -+ - if (heapvar == NULL) -- { -+ { - heapvar = create_tmp_var_raw (ptr_type_node, "HEAP"); - DECL_EXTERNAL (heapvar) = 1; - if (referenced_vars) -@@ -2650,7 +2620,7 @@ - - temp.var = create_variable_info_for (heapvar, - alias_get_name (heapvar)); -- -+ - vi = get_varinfo (temp.var); - vi->is_artificial_var = 1; - vi->is_heap_var = 1; -@@ -2712,7 +2682,7 @@ - case NON_LVALUE_EXPR: - { - tree op = TREE_OPERAND (t, 0); -- -+ - /* Cast from non-pointer to pointers are bad news for us. - Anything else, we see through */ - if (!(POINTER_TYPE_P (TREE_TYPE (t)) -@@ -2738,7 +2708,7 @@ - { - switch (TREE_CODE (t)) - { -- case PHI_NODE: -+ case PHI_NODE: - { - get_constraint_for (PHI_RESULT (t), results); - return; -@@ -2782,8 +2752,8 @@ - - - /* Handle the structure copy case where we have a simple structure copy -- between LHS and RHS that is of SIZE (in bits) -- -+ between LHS and RHS that is of SIZE (in bits) -+ - For each field of the lhs variable (lhsfield) - For each field of the rhs variable at lhsfield.offset (rhsfield) - add the constraint lhsfield = rhsfield -@@ -2808,7 +2778,7 @@ - struct constraint_expr temprhs = rhs; - unsigned HOST_WIDE_INT fieldoffset; - -- templhs.var = p->id; -+ templhs.var = p->id; - q = get_varinfo (temprhs.var); - fieldoffset = p->offset - pstart; - q = first_vi_for_offset (q, q->offset + fieldoffset); -@@ -2823,8 +2793,8 @@ - - /* Handle the structure copy case where we have a structure copy between a - aggregate on the LHS and a dereference of a pointer on the RHS -- that is of SIZE (in bits) -- -+ that is of SIZE (in bits) -+ - For each field of the lhs variable (lhsfield) - rhs.offset = lhsfield->offset - add the constraint lhsfield = rhs -@@ -2849,12 +2819,12 @@ - - - if (templhs.type == SCALAR) -- templhs.var = p->id; -+ templhs.var = p->id; - else - templhs.offset = p->offset; -- -+ - q = get_varinfo (temprhs.var); -- fieldoffset = p->offset - pstart; -+ fieldoffset = p->offset - pstart; - temprhs.offset += fieldoffset; - process_constraint (new_constraint (templhs, temprhs)); - } -@@ -2862,7 +2832,7 @@ - - /* Handle the structure copy case where we have a structure copy - between a aggregate on the RHS and a dereference of a pointer on -- the LHS that is of SIZE (in bits) -+ the LHS that is of SIZE (in bits) - - For each field of the rhs variable (rhsfield) - lhs.offset = rhsfield->offset -@@ -2888,12 +2858,12 @@ - - - if (temprhs.type == SCALAR) -- temprhs.var = p->id; -+ temprhs.var = p->id; - else - temprhs.offset = p->offset; -- -+ - q = get_varinfo (templhs.var); -- fieldoffset = p->offset - pstart; -+ fieldoffset = p->offset - pstart; - templhs.offset += fieldoffset; - process_constraint (new_constraint (templhs, temprhs)); - } -@@ -2901,7 +2871,7 @@ - - /* Sometimes, frontends like to give us bad type information. This - function will collapse all the fields from VAR to the end of VAR, -- into VAR, so that we treat those fields as a single variable. -+ into VAR, so that we treat those fields as a single variable. - We return the variable they were collapsed into. */ - - static unsigned int -@@ -2913,16 +2883,16 @@ - for (field = currvar->next; field; field = field->next) - { - if (dump_file) -- fprintf (dump_file, "Type safety: Collapsing var %s into %s\n", -+ fprintf (dump_file, "Type safety: Collapsing var %s into %s\n", - field->name, currvar->name); -- -+ - gcc_assert (!field->collapsed_to); - field->collapsed_to = currvar; - } - - currvar->next = NULL; - currvar->size = currvar->fullsize - currvar->offset; -- -+ - return currvar->id; - } - -@@ -2944,7 +2914,7 @@ - gcc_assert (VEC_length (ce_s, rhsc) == 1); - lhs = *(VEC_last (ce_s, lhsc)); - rhs = *(VEC_last (ce_s, rhsc)); -- -+ - VEC_free (ce_s, heap, lhsc); - VEC_free (ce_s, heap, rhsc); - -@@ -2955,7 +2925,7 @@ - lhs = rhs; - rhs = tmp; - } -- -+ - /* This is fairly conservative for the RHS == ADDRESSOF case, in that it's - possible it's something we could handle. However, most cases falling - into this are dealing with transparent unions, which are slightly -@@ -3021,11 +2991,11 @@ - else - lhssize = TREE_INT_CST_LOW (lhstypesize); - -- -- if (rhs.type == SCALAR && lhs.type == SCALAR) -+ -+ if (rhs.type == SCALAR && lhs.type == SCALAR) - { - if (!do_simple_structure_copy (lhs, rhs, MIN (lhssize, rhssize))) -- { -+ { - lhs.var = collapse_rest_of_var (lhs.var); - rhs.var = collapse_rest_of_var (rhs.var); - lhs.offset = 0; -@@ -3042,7 +3012,7 @@ - else - { - tree pointedtotype = lhstype; -- tree tmpvar; -+ tree tmpvar; - - gcc_assert (rhs.type == DEREF && lhs.type == DEREF); - tmpvar = create_tmp_var_raw (pointedtotype, "structcopydereftmp"); -@@ -3052,6 +3022,7 @@ - } - } - -+ - /* Update related alias information kept in AI. This is used when - building name tags, alias sets and deciding grouping heuristics. - STMT is the statement to process. This function also updates -@@ -3261,7 +3232,6 @@ - } - } - -- - /* Handle pointer arithmetic EXPR when creating aliasing constraints. - Expressions of the type PTR + CST can be handled in two ways: - -@@ -3307,6 +3277,7 @@ - else - return false; - -+ - for (i = 0; VEC_iterate (ce_s, lhsc, i, c); i++) - for (j = 0; VEC_iterate (ce_s, temp, j, c2); j++) - { -@@ -3360,12 +3331,12 @@ - { - int i; - unsigned int j; -- -+ - /* For a phi node, assign all the arguments to - the result. */ - get_constraint_for (PHI_RESULT (t), &lhsc); - for (i = 0; i < PHI_NUM_ARGS (t); i++) -- { -+ { - tree rhstype; - tree strippedrhs = PHI_ARG_DEF (t, i); - -@@ -3401,7 +3372,6 @@ - { - tree lhsop; - tree rhsop; -- unsigned int varid; - tree arglist; - varinfo_t fi; - int i = 1; -@@ -3423,17 +3393,16 @@ - we should still be able to handle. */ - if (decl) - { -- varid = get_id_for_tree (decl); -+ fi = get_vi_for_tree (decl); - } - else - { - decl = TREE_OPERAND (rhsop, 0); -- varid = get_id_for_tree (decl); -+ fi = get_vi_for_tree (decl); - } - - /* Assign all the passed arguments to the appropriate incoming - parameters of the function. */ -- fi = get_varinfo (varid); - arglist = TREE_OPERAND (rhsop, 1); - - for (;arglist; arglist = TREE_CHAIN (arglist)) -@@ -3463,13 +3432,14 @@ - } - i++; - } -+ - /* If we are returning a value, assign it to the result. */ - if (lhsop) - { - struct constraint_expr rhs; - struct constraint_expr *lhsp; - unsigned int j = 0; -- -+ - get_constraint_for (lhsop, &lhsc); - if (TREE_CODE (decl) != FUNCTION_DECL) - { -@@ -3485,7 +3455,7 @@ - } - for (j = 0; VEC_iterate (ce_s, lhsc, j, lhsp); j++) - process_constraint (new_constraint (*lhsp, rhs)); -- } -+ } - } - /* Otherwise, just a regular assignment statement. */ - else if (TREE_CODE (t) == MODIFY_EXPR) -@@ -3494,7 +3464,7 @@ - tree rhsop = TREE_OPERAND (t, 1); - int i; - -- if ((AGGREGATE_TYPE_P (TREE_TYPE (lhsop)) -+ if ((AGGREGATE_TYPE_P (TREE_TYPE (lhsop)) - || TREE_CODE (TREE_TYPE (lhsop)) == COMPLEX_TYPE) - && (AGGREGATE_TYPE_P (TREE_TYPE (rhsop)) - || TREE_CODE (TREE_TYPE (lhsop)) == COMPLEX_TYPE)) -@@ -3513,7 +3483,7 @@ - { - /* RHS that consist of unary operations, - exceptional types, or bare decls/constants, get -- handled directly by get_constraint_for. */ -+ handled directly by get_constraint_for. */ - case tcc_reference: - case tcc_declaration: - case tcc_constant: -@@ -3528,7 +3498,7 @@ - { - struct constraint_expr *c2; - unsigned int k; -- -+ - for (k = 0; VEC_iterate (ce_s, rhsc, k, c2); k++) - process_constraint (new_constraint (*c, *c2)); - } -@@ -3570,7 +3540,7 @@ - } - } - } -- } -+ } - } - } - } -@@ -3578,7 +3548,7 @@ - /* After promoting variables and computing aliasing we will - need to re-scan most statements. FIXME: Try to minimize the - number of statements re-scanned. It's not really necessary to -- re-scan *all* statements. */ -+ re-scan *all* statements. */ - mark_stmt_modified (origt); - VEC_free (ce_s, heap, rhsc); - VEC_free (ce_s, heap, lhsc); -@@ -3591,7 +3561,7 @@ - first field that overlaps with OFFSET. - Return NULL if we can't find one. */ - --static varinfo_t -+static varinfo_t - first_vi_for_offset (varinfo_t start, unsigned HOST_WIDE_INT offset) - { - varinfo_t curr = start; -@@ -3617,7 +3587,7 @@ - { - varinfo_t prev = base; - varinfo_t curr = base->next; -- -+ - field->next = curr; - prev->next = field; - } -@@ -3630,7 +3600,7 @@ - { - varinfo_t prev = base; - varinfo_t curr = base->next; -- -+ - if (curr == NULL) - { - prev->next = field; -@@ -3652,13 +3622,13 @@ - - /* qsort comparison function for two fieldoff's PA and PB */ - --static int -+static int - fieldoff_compare (const void *pa, const void *pb) - { - const fieldoff_s *foa = (const fieldoff_s *)pa; - const fieldoff_s *fob = (const fieldoff_s *)pb; - HOST_WIDE_INT foasize, fobsize; -- -+ - if (foa->offset != fob->offset) - return foa->offset - fob->offset; - -@@ -3671,8 +3641,8 @@ - void - sort_fieldstack (VEC(fieldoff_s,heap) *fieldstack) - { -- qsort (VEC_address (fieldoff_s, fieldstack), -- VEC_length (fieldoff_s, fieldstack), -+ qsort (VEC_address (fieldoff_s, fieldstack), -+ VEC_length (fieldoff_s, fieldstack), - sizeof (fieldoff_s), - fieldoff_compare); - } -@@ -3686,12 +3656,12 @@ - TYPE. */ - - int --push_fields_onto_fieldstack (tree type, VEC(fieldoff_s,heap) **fieldstack, -+push_fields_onto_fieldstack (tree type, VEC(fieldoff_s,heap) **fieldstack, - HOST_WIDE_INT offset, bool *has_union) - { - tree field; - int count = 0; -- -+ - if (TREE_CODE (type) == COMPLEX_TYPE) - { - fieldoff_s *real_part, *img_part; -@@ -3700,13 +3670,13 @@ - real_part->size = TYPE_SIZE (TREE_TYPE (type)); - real_part->offset = offset; - real_part->decl = NULL_TREE; -- -+ - img_part = VEC_safe_push (fieldoff_s, heap, *fieldstack, NULL); - img_part->type = TREE_TYPE (type); - img_part->size = TYPE_SIZE (TREE_TYPE (type)); - img_part->offset = offset + TREE_INT_CST_LOW (TYPE_SIZE (TREE_TYPE (type))); - img_part->decl = NULL_TREE; -- -+ - return 2; - } - -@@ -3733,12 +3703,12 @@ - { - bool push = false; - int pushed = 0; -- -- if (has_union -+ -+ if (has_union - && (TREE_CODE (TREE_TYPE (type)) == QUAL_UNION_TYPE - || TREE_CODE (TREE_TYPE (type)) == UNION_TYPE)) - *has_union = true; -- -+ - if (!AGGREGATE_TYPE_P (TREE_TYPE (type))) /* var_can_have_subvars */ - push = true; - else if (!(pushed = push_fields_onto_fieldstack -@@ -3772,12 +3742,12 @@ - { - bool push = false; - int pushed = 0; -- -- if (has_union -+ -+ if (has_union - && (TREE_CODE (TREE_TYPE (field)) == QUAL_UNION_TYPE - || TREE_CODE (TREE_TYPE (field)) == UNION_TYPE)) - *has_union = true; -- -+ - if (!var_can_have_subvars (field)) - push = true; - else if (!(pushed = push_fields_onto_fieldstack -@@ -3789,7 +3759,7 @@ - see if we didn't push any subfields and the size is - nonzero, push the field onto the stack */ - push = true; -- -+ - if (push) - { - fieldoff_s *pair; -@@ -3848,15 +3818,15 @@ - unsigned int i = 0; - tree t; - -- for (t = TYPE_ARG_TYPES (TREE_TYPE (decl)); -+ for (t = TYPE_ARG_TYPES (TREE_TYPE (decl)); - t; - t = TREE_CHAIN (t)) -- { -+ { - if (TREE_VALUE (t) == void_type_node) - break; - i++; - } -- -+ - if (!t) - *is_varargs = true; - return i; -@@ -3870,19 +3840,19 @@ - { - unsigned int index = VEC_length (varinfo_t, varmap); - varinfo_t vi; -- tree arg; -+ tree arg; - unsigned int i; - bool is_varargs = false; - - /* Create the variable info. */ - -- vi = new_var_info (decl, index, name, index); -+ vi = new_var_info (decl, index, name); - vi->decl = decl; - vi->offset = 0; - vi->has_union = 0; - vi->size = 1; - vi->fullsize = count_num_arguments (decl, &is_varargs) + 1; -- insert_id_for_tree (vi->decl, index); -+ insert_vi_for_tree (vi->decl, vi); - VEC_safe_push (varinfo_t, heap, varmap, vi); - - stats.total_vars++; -@@ -3898,12 +3868,12 @@ - return index; - } - -- -+ - arg = DECL_ARGUMENTS (decl); - - /* Set up variables for each argument. */ - for (i = 1; i < vi->fullsize; i++) -- { -+ { - varinfo_t argvi; - const char *newname; - char *tempname; -@@ -3912,13 +3882,13 @@ - - if (arg) - argdecl = arg; -- -+ - newindex = VEC_length (varinfo_t, varmap); - asprintf (&tempname, "%s.arg%d", name, i-1); - newname = ggc_strdup (tempname); - free (tempname); - -- argvi = new_var_info (argdecl, newindex,newname, newindex); -+ argvi = new_var_info (argdecl, newindex, newname); - argvi->decl = argdecl; - VEC_safe_push (varinfo_t, heap, varmap, argvi); - argvi->offset = i; -@@ -3929,7 +3899,7 @@ - stats.total_vars ++; - if (arg) - { -- insert_id_for_tree (arg, newindex); -+ insert_vi_for_tree (arg, argvi); - arg = TREE_CHAIN (arg); - } - } -@@ -3948,13 +3918,13 @@ - - if (DECL_RESULT (decl)) - resultdecl = DECL_RESULT (decl); -- -+ - newindex = VEC_length (varinfo_t, varmap); - asprintf (&tempname, "%s.result", name); - newname = ggc_strdup (tempname); - free (tempname); - -- resultvi = new_var_info (resultdecl, newindex, newname, newindex); -+ resultvi = new_var_info (resultdecl, newindex, newname); - resultvi->decl = resultdecl; - VEC_safe_push (varinfo_t, heap, varmap, resultvi); - resultvi->offset = i; -@@ -3964,13 +3934,13 @@ - insert_into_field_list_sorted (vi, resultvi); - stats.total_vars ++; - if (DECL_RESULT (decl)) -- insert_id_for_tree (DECL_RESULT (decl), newindex); -+ insert_vi_for_tree (DECL_RESULT (decl), resultvi); - } - return index; --} -+} - - --/* Return true if FIELDSTACK contains fields that overlap. -+/* Return true if FIELDSTACK contains fields that overlap. - FIELDSTACK is assumed to be sorted by offset. */ - - static bool -@@ -4057,12 +4027,12 @@ - bool hasunion; - bool is_global = DECL_P (decl) ? is_global_var (decl) : false; - VEC (fieldoff_s,heap) *fieldstack = NULL; -- -+ - if (TREE_CODE (decl) == FUNCTION_DECL && in_ipa_mode) - return create_function_info_for (decl, name); - - hasunion = TREE_CODE (decltype) == UNION_TYPE -- || TREE_CODE (decltype) == QUAL_UNION_TYPE; -+ || TREE_CODE (decltype) == QUAL_UNION_TYPE; - if (var_can_have_subvars (decl) && use_field_sensitive && !hasunion) - { - push_fields_onto_fieldstack (decltype, &fieldstack, 0, &hasunion); -@@ -4072,12 +4042,12 @@ - notokay = true; - } - } -- - -+ - /* If the variable doesn't have subvars, we may end up needing to - sort the field list and create fake variables for all the - fields. */ -- vi = new_var_info (decl, index, name, index); -+ vi = new_var_info (decl, index, name); - vi->decl = decl; - vi->offset = 0; - vi->has_union = hasunion; -@@ -4095,8 +4065,8 @@ - vi->fullsize = TREE_INT_CST_LOW (declsize); - vi->size = vi->fullsize; - } -- -- insert_id_for_tree (vi->decl, index); -+ -+ insert_vi_for_tree (vi->decl, vi); - VEC_safe_push (varinfo_t, heap, varmap, vi); - if (is_global && (!flag_whole_program || !in_ipa_mode)) - { -@@ -4122,9 +4092,9 @@ - } - - stats.total_vars++; -- if (use_field_sensitive -- && !notokay -- && !vi->is_unknown_size_var -+ if (use_field_sensitive -+ && !notokay -+ && !vi->is_unknown_size_var - && var_can_have_subvars (decl) - && VEC_length (fieldoff_s, fieldstack) <= MAX_FIELDS_FOR_FIELD_SENSITIVE) - { -@@ -4148,7 +4118,7 @@ - without creating varinfos for the fields anyway, so sorting them is a - waste to boot. */ - if (!notokay) -- { -+ { - sort_fieldstack (fieldstack); - /* Due to some C++ FE issues, like PR 22488, we might end up - what appear to be overlapping fields even though they, -@@ -4156,8 +4126,8 @@ - we will simply disable field-sensitivity for these cases. */ - notokay = check_for_overlaps (fieldstack); - } -- -- -+ -+ - if (VEC_length (fieldoff_s, fieldstack) != 0) - fo = VEC_index (fieldoff_s, fieldstack, 0); - -@@ -4169,11 +4139,11 @@ - VEC_free (fieldoff_s, heap, fieldstack); - return index; - } -- -+ - vi->size = TREE_INT_CST_LOW (fo->size); - vi->offset = fo->offset; -- for (i = VEC_length (fieldoff_s, fieldstack) - 1; -- i >= 1 && VEC_iterate (fieldoff_s, fieldstack, i, fo); -+ for (i = VEC_length (fieldoff_s, fieldstack) - 1; -+ i >= 1 && VEC_iterate (fieldoff_s, fieldstack, i, fo); - i--) - { - varinfo_t newvi; -@@ -4184,15 +4154,15 @@ - if (dump_file) - { - if (fo->decl) -- asprintf (&tempname, "%s.%s", -+ asprintf (&tempname, "%s.%s", - vi->name, alias_get_name (fo->decl)); - else -- asprintf (&tempname, "%s." HOST_WIDE_INT_PRINT_DEC, -+ asprintf (&tempname, "%s." HOST_WIDE_INT_PRINT_DEC, - vi->name, fo->offset); - newname = ggc_strdup (tempname); - free (tempname); - } -- newvi = new_var_info (decl, newindex, newname, newindex); -+ newvi = new_var_info (decl, newindex, newname); - newvi->offset = fo->offset; - newvi->size = TREE_INT_CST_LOW (fo->size); - newvi->fullsize = vi->fullsize; -@@ -4228,14 +4198,22 @@ - { - varinfo_t vi = get_varinfo (var); - unsigned int i; -- bitmap_iterator bi; -- -- fprintf (file, "%s = { ", vi->name); -- EXECUTE_IF_SET_IN_BITMAP (get_varinfo (vi->node)->solution, 0, i, bi) -+ bitmap_iterator bi; -+ -+ if (find (var) != var) - { -- fprintf (file, "%s ", get_varinfo (i)->name); -+ varinfo_t vipt = get_varinfo (find (var)); -+ fprintf (file, "%s = same as %s\n", vi->name, vipt->name); - } -- fprintf (file, "}\n"); -+ else -+ { -+ fprintf (file, "%s = { ", vi->name); -+ EXECUTE_IF_SET_IN_BITMAP (vi->solution, 0, i, bi) -+ { -+ fprintf (file, "%s ", get_varinfo (i)->name); -+ } -+ fprintf (file, "}\n"); -+ } - } - - /* Print the points-to solution for VAR to stdout. */ -@@ -4266,7 +4244,7 @@ - if (!could_have_pointers (t)) - continue; - -- arg_id = get_id_for_tree (t); -+ arg_id = get_vi_for_tree (t)->id; - - /* With flag_argument_noalias greater than two means that the incoming - argument cannot alias anything except for itself so create a HEAP -@@ -4276,11 +4254,10 @@ - { - varinfo_t vi; - tree heapvar = heapvar_lookup (t); -- unsigned int id; - - lhs.offset = 0; - lhs.type = SCALAR; -- lhs.var = get_id_for_tree (t); -+ lhs.var = get_vi_for_tree (t)->id; - - if (heapvar == NULL_TREE) - { -@@ -4291,11 +4268,11 @@ - add_referenced_var (heapvar); - heapvar_insert (t, heapvar); - } -- id = get_id_for_tree (heapvar); -- vi = get_varinfo (id); -+ -+ vi = get_vi_for_tree (heapvar); - vi->is_artificial_var = 1; - vi->is_heap_var = 1; -- rhs.var = id; -+ rhs.var = vi->id; - rhs.type = ADDRESSOF; - rhs.offset = 0; - for (p = get_varinfo (lhs.var); p; p = p->next) -@@ -4409,8 +4386,8 @@ - bool - find_what_p_points_to (tree p) - { -- unsigned int id = 0; - tree lookup_p = p; -+ varinfo_t vi; - - if (!have_alias_info) - return false; -@@ -4422,10 +4399,10 @@ - && default_def (SSA_NAME_VAR (p)) == p) - lookup_p = SSA_NAME_VAR (p); - -- if (lookup_id_for_tree (lookup_p, &id)) -+ vi = lookup_vi_for_tree (lookup_p); -+ if (vi) - { -- varinfo_t vi = get_varinfo (id); -- -+ - if (vi->is_artificial_var) - return false; - -@@ -4447,7 +4424,7 @@ - - /* This variable may have been collapsed, let's get the real - variable. */ -- vi = get_varinfo (vi->node); -+ vi = get_varinfo (find (vi->id)); - - /* Translate artificial variables into SSA_NAME_PTR_INFO - attributes. */ -@@ -4506,13 +4483,16 @@ - { - fprintf (outfile, "Stats:\n"); - fprintf (outfile, "Total vars: %d\n", stats.total_vars); -+ fprintf (outfile, "Non-pointer vars: %d\n", -+ stats.nonpointer_vars); - fprintf (outfile, "Statically unified vars: %d\n", - stats.unified_vars_static); -- fprintf (outfile, "Collapsed vars: %d\n", stats.collapsed_vars); - fprintf (outfile, "Dynamically unified vars: %d\n", - stats.unified_vars_dynamic); - fprintf (outfile, "Iterations: %d\n", stats.iterations); - fprintf (outfile, "Number of edges: %d\n", stats.num_edges); -+ fprintf (outfile, "Number of implicit edges: %d\n", -+ stats.num_implicit_edges); - } - - for (i = 0; i < VEC_length (varinfo_t, varmap); i++) -@@ -4540,8 +4520,8 @@ - /* Create the NULL variable, used to represent that a variable points - to NULL. */ - nothing_tree = create_tmp_var_raw (void_type_node, "NULL"); -- var_nothing = new_var_info (nothing_tree, 0, "NULL", 0); -- insert_id_for_tree (nothing_tree, 0); -+ var_nothing = new_var_info (nothing_tree, 0, "NULL"); -+ insert_vi_for_tree (nothing_tree, var_nothing); - var_nothing->is_artificial_var = 1; - var_nothing->offset = 0; - var_nothing->size = ~0; -@@ -4553,8 +4533,8 @@ - /* Create the ANYTHING variable, used to represent that a variable - points to some unknown piece of memory. */ - anything_tree = create_tmp_var_raw (void_type_node, "ANYTHING"); -- var_anything = new_var_info (anything_tree, 1, "ANYTHING", 1); -- insert_id_for_tree (anything_tree, 1); -+ var_anything = new_var_info (anything_tree, 1, "ANYTHING"); -+ insert_vi_for_tree (anything_tree, var_anything); - var_anything->is_artificial_var = 1; - var_anything->size = ~0; - var_anything->offset = 0; -@@ -4573,7 +4553,6 @@ - rhs.type = ADDRESSOF; - rhs.var = anything_id; - rhs.offset = 0; -- var_anything->address_taken = true; - - /* This specifically does not use process_constraint because - process_constraint ignores all anything = anything constraints, since all -@@ -4583,14 +4562,14 @@ - /* Create the READONLY variable, used to represent that a variable - points to readonly memory. */ - readonly_tree = create_tmp_var_raw (void_type_node, "READONLY"); -- var_readonly = new_var_info (readonly_tree, 2, "READONLY", 2); -+ var_readonly = new_var_info (readonly_tree, 2, "READONLY"); - var_readonly->is_artificial_var = 1; - var_readonly->offset = 0; - var_readonly->size = ~0; - var_readonly->fullsize = ~0; - var_readonly->next = NULL; - var_readonly->is_special_var = 1; -- insert_id_for_tree (readonly_tree, 2); -+ insert_vi_for_tree (readonly_tree, var_readonly); - readonly_id = 2; - VEC_safe_push (varinfo_t, heap, varmap, var_readonly); - -@@ -4610,8 +4589,8 @@ - /* Create the INTEGER variable, used to represent that a variable points - to an INTEGER. */ - integer_tree = create_tmp_var_raw (void_type_node, "INTEGER"); -- var_integer = new_var_info (integer_tree, 3, "INTEGER", 3); -- insert_id_for_tree (integer_tree, 3); -+ var_integer = new_var_info (integer_tree, 3, "INTEGER"); -+ insert_vi_for_tree (integer_tree, var_integer); - var_integer->is_artificial_var = 1; - var_integer->size = ~0; - var_integer->fullsize = ~0; -@@ -4634,8 +4613,8 @@ - /* Create the ESCAPED_VARS variable used to represent variables that - escape this function. */ - escaped_vars_tree = create_tmp_var_raw (void_type_node, "ESCAPED_VARS"); -- var_escaped_vars = new_var_info (escaped_vars_tree, 4, "ESCAPED_VARS", 4); -- insert_id_for_tree (escaped_vars_tree, 4); -+ var_escaped_vars = new_var_info (escaped_vars_tree, 4, "ESCAPED_VARS"); -+ insert_vi_for_tree (escaped_vars_tree, var_escaped_vars); - var_escaped_vars->is_artificial_var = 1; - var_escaped_vars->size = ~0; - var_escaped_vars->fullsize = ~0; -@@ -4660,21 +4639,19 @@ - static void - init_alias_vars (void) - { -- bitmap_obstack_initialize (&ptabitmap_obstack); -+ bitmap_obstack_initialize (&pta_obstack); -+ bitmap_obstack_initialize (&oldpta_obstack); - bitmap_obstack_initialize (&predbitmap_obstack); - -- constraint_pool = create_alloc_pool ("Constraint pool", -+ constraint_pool = create_alloc_pool ("Constraint pool", - sizeof (struct constraint), 30); - variable_info_pool = create_alloc_pool ("Variable info pool", - sizeof (struct variable_info), 30); -- constraint_edge_pool = create_alloc_pool ("Constraint edges", -- sizeof (struct constraint_edge), 30); -- - constraints = VEC_alloc (constraint_t, heap, 8); - varmap = VEC_alloc (varinfo_t, heap, 8); -- id_for_tree = htab_create (10, tree_id_hash, tree_id_eq, free); -+ vi_for_tree = pointer_map_create (); -+ - memset (&stats, 0, sizeof (stats)); -- - init_base_vars (); - } - -@@ -4777,6 +4754,43 @@ - VEC_free (ce_s, heap, rhsc); - } - -+ -+/* Remove the REF and ADDRESS edges from GRAPH, as well as all the -+ predecessor edges. */ -+ -+static void -+remove_preds_and_fake_succs (constraint_graph_t graph) -+{ -+ unsigned int i; -+ -+ /* Clear the implicit ref and address nodes from the successor -+ lists. */ -+ for (i = 0; i < FIRST_REF_NODE; i++) -+ { -+ if (graph->succs[i]) -+ bitmap_clear_range (graph->succs[i], FIRST_REF_NODE, -+ FIRST_REF_NODE * 2); -+ } -+ -+ /* Free the successor list for the non-ref nodes. */ -+ for (i = FIRST_REF_NODE; i < graph->size; i++) -+ { -+ if (graph->succs[i]) -+ BITMAP_FREE (graph->succs[i]); -+ } -+ -+ /* Now reallocate the size of the successor list as, and blow away -+ the predecessor bitmaps. */ -+ graph->size = VEC_length (varinfo_t, varmap); -+ graph->succs = xrealloc (graph->succs, graph->size * sizeof (bitmap)); -+ -+ free (graph->implicit_preds); -+ graph->implicit_preds = NULL; -+ free (graph->preds); -+ graph->preds = NULL; -+ bitmap_obstack_release (&predbitmap_obstack); -+} -+ - /* Create points-to sets for the current function. See the comments - at the start of the file for an algorithmic overview. */ - -@@ -4784,11 +4798,13 @@ - compute_points_to_sets (struct alias_info *ai) - { - basic_block bb; -+ struct scc_info *si; - - timevar_push (TV_TREE_PTA); - - init_alias_vars (); -- -+ init_alias_heapvars (); -+ - intra_create_variable_infos (); - - /* Now walk all statements and derive aliases. */ -@@ -4824,36 +4840,42 @@ - } - } - -- build_constraint_graph (); - - if (dump_file) - { - fprintf (dump_file, "Points-to analysis\n\nConstraints:\n\n"); - dump_constraints (dump_file); - } -- -+ - if (dump_file) - fprintf (dump_file, - "\nCollapsing static cycles and doing variable " - "substitution:\n"); -- -- find_and_collapse_graph_cycles (graph, false); -- perform_var_substitution (graph); -- -+ -+ build_pred_graph (); -+ si = perform_var_substitution (graph); -+ move_complex_constraints (graph, si); -+ free_var_substitution_info (si); -+ -+ build_succ_graph (); -+ find_indirect_cycles (graph); -+ -+ /* Implicit nodes and predecessors are no longer necessary at this -+ point. */ -+ remove_preds_and_fake_succs (graph); -+ - if (dump_file) - fprintf (dump_file, "\nSolving graph:\n"); -- -+ - solve_graph (graph); -- -+ - if (dump_file) - dump_sa_points_to_info (dump_file); -- - have_alias_info = true; - - timevar_pop (TV_TREE_PTA); - } - -- - /* Delete created points-to sets. */ - - void -@@ -4861,33 +4883,27 @@ - { - varinfo_t v; - int i; -- -- htab_delete (id_for_tree); -- bitmap_obstack_release (&ptabitmap_obstack); -- bitmap_obstack_release (&predbitmap_obstack); -+ -+ if (dump_file && (dump_flags & TDF_STATS)) -+ fprintf (dump_file, "Points to sets created:%d\n", -+ stats.points_to_sets_created); -+ -+ pointer_map_destroy (vi_for_tree); -+ bitmap_obstack_release (&pta_obstack); - VEC_free (constraint_t, heap, constraints); -- -+ - for (i = 0; VEC_iterate (varinfo_t, varmap, i, v); i++) -- { -- /* Nonlocal vars may add more varinfos. */ -- if (i >= graph_size) -- break; -+ VEC_free (constraint_t, heap, graph->complex[i]); -+ free (graph->complex); - -- VEC_free (constraint_edge_t, heap, graph->succs[i]); -- VEC_free (constraint_edge_t, heap, graph->preds[i]); -- VEC_free (constraint_t, heap, v->complex); -- } -- free (graph->zero_weight_preds); -- free (graph->zero_weight_succs); -+ free (graph->rep); - free (graph->succs); -- free (graph->preds); -+ free (graph->indirect_cycles); - free (graph); - - VEC_free (varinfo_t, heap, varmap); - free_alloc_pool (variable_info_pool); -- free_alloc_pool (constraint_pool); -- free_alloc_pool (constraint_edge_pool); -- -+ free_alloc_pool (constraint_pool); - have_alias_info = false; - } - -@@ -4905,6 +4921,7 @@ - static unsigned int - ipa_pta_execute (void) - { -+#if 0 - struct cgraph_node *node; - in_ipa_mode = 1; - init_alias_heapvars (); -@@ -4994,6 +5011,7 @@ - in_ipa_mode = 0; - delete_alias_heapvars (); - delete_points_to_sets (); -+#endif - return 0; - } - -@@ -5018,8 +5036,9 @@ - void - init_alias_heapvars (void) - { -- heapvar_for_stmt = htab_create_ggc (11, tree_map_hash, tree_map_eq, -- NULL); -+ if (!heapvar_for_stmt) -+ heapvar_for_stmt = htab_create_ggc (11, tree_map_hash, tree_map_eq, -+ NULL); - nonlocal_all = NULL_TREE; - } - -@@ -5028,7 +5047,7 @@ - { - nonlocal_all = NULL_TREE; - htab_delete (heapvar_for_stmt); -+ heapvar_for_stmt = NULL; - } -- - - #include "gt-tree-ssa-structalias.h" rmfile ./source/devel/gcc/125227.diff hunk ./source/devel/gcc/FrugalBuild 18 - README.Frugalware 125227.diff) + http://ftp.frugalware.org/pub/other/sources/gcc/gcc-4.2.0-125227.diff.bz2 \ + README.Frugalware) } From vmiklos at frugalware.org Mon Jun 4 00:45:51 2007 From: vmiklos at frugalware.org (VMiklos) Date: Mon Jun 4 00:46:01 2007 Subject: [Frugalware-darcs] frugalware-current: apache-2.2.4-2-i686 Message-ID: <20070603224551.69AD7176813A@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070603202114-e2957-50ec2d3f71e4b003155feec052b506f662e9a2b3.gz; [apache-2.2.4-2-i686 VMiklos **20070603202114 moved mkcert.tar.gz to ftp ] { hunk ./source/network/apache/FrugalBuild 17 - mkcert.tar.gz rc.httpd rc.httpd-hu.po httpd.conf ssl.conf \ + http://ftp.frugalware.org/pub/other/sources/apache/mkcert.tar.gz \ + rc.httpd rc.httpd-hu.po httpd.conf ssl.conf \ binary ./source/network/apache/mkcert.tar.gz oldhex *1f8b0800f639f43f0003ec5a6b7be3b695ced7f257601d3733538f2d5e4511a9fb9437dd2ccaa2 *444996db3e1d5e40911245ca246549deee7fdf03da1ecb97c9246d923edd0d228d4510383878cf *052f80ac963ec9cbda37bf64615991952509fe56e5e5dffbdfb22c4bac20c872fd1b96e35899ff *0649bfa8560f6553946e8ed0377996953fd4ee6befff43cbeadefe45919cf979f2cbf8c18fb3bf *445bc9bc08bf395e147eb3ffaf525ed87f68aa86659ee9c3decf3806cbb16c5d14bf687fa9b2bf *5017589e83ffa0bd2073ec3788fd1975f862f97f6e7f0639515c20f89411418f6e808238277e99 *e57b9485485dbb7e446aab2cf83b3440db88e4844103d33a25a99f052440576712ab201d3c290e *63df2d091a92db0c7ec4598a7a715116e83df8d4071466391a8d7ac8cd6130904f82330644911c *0524743749096a802e4fc3fb595aba715aa0344320a1a0cd67d906f96e8a6e63b2add48ed33948 *8a490ae380be2e5abba089bf49c0b2d0098571421ba17502a25049762583bc3dca37690a5d2b11 *7eb65ab96980413c42c7285b9394ce15c040a769966d4a744afba15310f0c7d45d913f51a018e6 *df6dbf7fb5bc887fcb5d128a167df8d9c6f84afc0bacc8bd887fb12e08bfc5ffaf51befd96f9f6 *5b841eed8eca0c2d0959573111b945848afd2a89d36541e3072257579f227be09611daac699f00 *62be12a467eb7d1ecfa312bdf73f204e511aa73ccb7268e826211a9d21339d93a4f02337493e22 *3549d090362e205f1424bf857480400cc3c0487f1f0c2f5b43d53a6798cd9acac7c84f889b32bf *3bfd33b8ebdfd77936cfddd5f9d1f1fb83d61f8ebe477f657e1787e82fe8e8ecf8f8a0e5113a47 *67e86fdfd3b9a5b411447a959020dbd0d99da14fc48f32747c3c509d36fa072a20b39d12f4aea8 *e11aaacddf7dfa1e05d963c7c7ce0fc2a980c7a4015fe2ee5f36a6a552eb344447c7c73068edf8 *f8b36a2fd47add69f7d33ad1f21ca5179d2b98aae2e5c45d7eff9690307e55fda22ac852f2ace2 *6de0ffeb05f26f8e7a20fab3d887ba1f6dceca8047669e6739462989e15d8ede3d18e61d2c22f0 *746f9e779f2d17669b343842dc9fbee33f2b40767189b84315a8ad1fd7913fd0f478685f506e77 *7c4c5f53ad8e765503b00ffaeebb6a058bd3cd134c0f93f9046bd61a8d2e3a03cb44f79d3fbd46 *ea119c6a62c166b5daa37f1c54bbdb257af7df3095382dc3f747bf3fe5a4029d9d9da1d1325eaf *49f0d7f4e863a5f687efd1ffbc3b1478446bcf1f947e9a775290c356e939fbcc46db8842f017c4 *511d5ffb37cd18e7479f9ed9e9d91a5aa5943f3ecef69577ddbb7a4e5d9db63ccb8f8fd31f74f3 *f4fc13d9ad73c02f452788fbf44ae2cb097d05cfafe2fafbe233a41fabe9be02f64d80d15105cd *e1b4de8cb82445a7c58337a083d66f367e3b707f28421fded13a86a9b229a6e9345fd1a4f417f6 *54714f43f5b4f9b73f9ce5f4e96f7ff8cf2738bf951f2ccff8df2f740ef4cfecffc5dff6ffbf4a *7961ff22052298c5c9a9ef9ee6854bebfef531bec2ff795e7ab9ffaf73bfedff7f9d724a8b66b6 *3a7da49b43a7d3ece8aa6356b58cd5e9184343d7d51b7eae6e3b9a3a87afa1f6b5f9f2265ac62d *65cb6aaa6d375543d76e1cb367a9cb96ca8d4d2db2f46973b9639a8eea68f3fe047a3a46b3bf99 *4dcba4630e139f9fec03c3742c18b8eab0b32ec6bc14b9fc783e692982b730af2c6ddc62e84b3d *b22e1f5f3a7c52f474cd0a5af6aebd50fd7be185d31cf7133f1daeaf57c962763584419a5cd08a *6e197f95b0c4312796665523a93bcb3a14d631fb9a3514b76d75d6bdc8ae3bd1addf57eda5d69c *2b8bd958bb63bc5533bf9e2a6b4f97961ecf6edb91dfbf74963bcbe8ec2c67beb71c9b9f429d65 *98b46efbb96e718f09f312949f8a09f312949f8a09f312949f8a09f312949798ccaf1b5bc33e04 *d0d4345b35e63356b53aad2ea3662d4dedc74e4b5d4db358e3ed9d30f2b6cdabedc2bb192bd7db *34d44cc9ccb9885bf623b1211b7283ef3456be53d3ef76aba2cd90db0b2122da8563a6d9c94263 *f7d25a3cb147d12edfbbd678ec0db3cb569827f964ebd7026fdbb5efe4717f7f6324d3f4369d8a *6bc609834970d2e826fa7ad6d478e15af656ebf184bbdad727cd0bcd8dee3af071dccd8ebbbd35 *073d756e69aada5a9085265a5a56796260da3698a7a5197c3fb2dbf7a6f328faabe1ade7a8038a *7c7b6899baa1b654bb5d53e7a66a19b3963ed55bcc486db54ecc8e66d8f6ba1907a5c70f435fe8 *179d569078abc99e5ae85ad716c1559f0550e7366bce67d4275ac9ca9df62326688db726a03ceb *5c77d49927da734059b50d884ad352d9963eba698d3a9e6050f4d5b1aa8a007a6715dd0d66e240 *1b96ccc0f6545b5357ed8e36f4bdba123b5e533f09e6513ae9da42531295fcda5dcf449e5ddac6 *855d77f5bd3768ae76ddda30e4e5f98c696ed44d76a2354c7372c526e3c6643c32a3994d824b23 *b58562b9f51d969f8b9e20b496776dd9049c94a5ebd6c775693cce7d93b9b8eaceefe47205e0a4 *8eaf5c7073fea6a3ae3b8b34179a79de65aabc63f68dd7b9e8df9d27ffaf9617eb3f2cfb1eec86 *ab03c09f6db9fbc1f55f1680fabd3cff93a0feb7f5ffd7280fe77fcfec8e4e4f91563dd1d3745d *454398fbe1e97e51f5e9b94589ac2c804a1260e4441b64512879c42a58e0b158873076100f4666 *1e8679bc6b7091f759fefddd817f209dd6ae375e12fbf7478a07d70aeaa68cb23c2e63426f14d4 *0f672092c00e7f4b7282dc4d99addc125a26c9beea4a7665eefa25095098672bd42765e1bb6b82 *f46cb5daa454649623f14ce6df15871ad0e34cd7738bfb23cdf7f42cb4da907fa26de4b3c07b07 *0377caa7cb89ea06e17006718abcac8caafe4fb70ec84d037a6f420f0e41d1ea919e50117826d5 *9586471eee3e923dda1424a8046ce33282b60ff730279fef6188579d99e69f6f55fc84de81501c *22f81bdf9fd29e5532bae0e754df309e6f60acea96a59a937baf7d75b47b8074935e023c9aedfd *fd29d587ea6856d554e20398ef8b8d77f611a9ab33a4b9e992e405528b223dfbf0e02e2a73fe63 *0b6319126ac6e99ce4d5890b460d1e733c6ecab8a16093c3ac86150ed759ac8a58ab639ec74a13 *2b22ae3730c761856728a806180d335f23b42794d06ef447423b54fb2ab1bbaaaaea414fa5c5ae *fe7949689a4068b6cc7cb6dde9776af79e63cd1c35993896cd6ef5edcc98d876c7dc0e2741ab99 *59437fdbb4abbab6b9959cd974c776ccdd3d99b3f98a7fcd2c6df648e606d316256bf67c38c9e6 *b374391f36fb636b38df36e79510c3dc2a33ca069840d79ad3588bc94833c79cbdeb386a78c8c7 *75db9c9a2be0272d60c3421fbec33da514bd559f7214c234b7ac74e9a80290d45d7f61b29613b9 *50b7bdaf333fd70171b32cbbd8eaf7d36899dbee647c67f681d016f76a6b16f08061e41a4fbc14 *482bf0d266015a5af7c4b6bf0edacb5dcb50a7f798650e6370d1e2faaa0b804c5c608712b05f67 *623ce1017cf46d3c46e6b6bd9d759967443dea524eba74a7c11d7c593f9ddc05bab4a878e9dc8c *5f3223d51eab8c2a020fdbaab4c1859a811fd87a39d116a4ecd5849c44eccd86ef859d9aceb5c7 *2e371b49e5aad788496d99f0add1c98e171971b26ef7bb75a2c53d993dc9c4bd1cf734583c332d *10342edbb6fbf6fa52376092c66cdced1bb74a6706bb6a5ebbbab871e5eb35b3ba28a576b44b94 *e94daf668da73737dd3dbf324a67255e77afb28bb6632cc6dd521f984e9e79eabc5d167a782b2a *6db966ab9ddc63ecb6bb6a5d8c276b8ef0e3a2a335a548588837da2eba61dd385fe5f574aa5edc *0d786dd20dfb85978575ed240b255632607360480c6bf6d6cbe93cb96ab8b5e82e5d27b636bfe8 *9d183dcb48af72efaa1f79e9ac13f0f54b3f2de2713f16f2e4261292a92f5cea5be996d915b12f *ee8cebc8499d52baadeff27523e8778360e2e6c1c5281e7bca28bc94768f547a7ca70d2db5d1aa *98f4d6d498dad66e5a2abc0c1bd4aec664c82e340d7c3e53c7baae15d79b8da6af763ee74d5703 *b31db4bbeeb02bf8dbb65db5bd64346d6636d5f9dc6b79f9dc5e1757fd29b75eec3470f9e97214 *08af58b14d59313537107e2e1e303db7e43bd3726cf4d39d1d5e5fde8d3644dc9d78d99eabf1a3 *52995a51bad653ae4eee26b7d7b35a260cc45db3e0c3beb6e819b6c4acd8581c4c6b7cd39a92d9 *899bf65bb253372eef7677db99175f6e6ce9e27a202d9aae6340606dca8da3eb5c7e7ddd5ccf74 *7dbf1c3133cf1ec6a16ff5a4911d5dcfb3b4d92fc2d520f06bf6758dbdd158af3bead4d8c668e1 *5c4ea3dbf9b893978ed89af02d23952cbbcf6cb8f9c974105cbaadc6c97523ed91b53fed9eecf4 *d970c86fb646b3be9d2bcd2ba557c6dd20badbd8ca60a0d616e4ae1e24b1611906337595f9edb0 *d1e7eb26dbbe33ccc16c53161a6b2e4fb89023a35ac7504dc55cacad6d7bd85babe938bff48445 *e6dfd45757a1749b33db4cd03d72e79b4abfb5bb4a1a3f40e20f57f2ced39d3da677ee0fe9fbf1 *d87a02eb092c5e1809e83dbbe33f7c7e312279ec26a8bf5979247f6a5f1d75b398235864b1c262 *b6faf03216bd87dff4c31dfc169f44c6f3d42de9b2a82673ca2ea2154645e47253f8391ca966ea *e7fb355d4b3f77e914c5068647faf978f4118d9cf371e9461f51ef7ce4262530a325708cb8dc7f *4497e757941820f39afe1f07c6c8f988f4fecbba9ab972e3e4dc77ff1cc4f3229e9739acd667b0 *c83ec1e1267100029fcdb70fcbac5671070ceb7b8238117175cc89986bd09b5705b52ce7550735 *2c81313c74e09e3a004d7bde61b4f11640447ebd393e0c880615f54317640f4e1266cf6d7cf0f2 *c05879e1be61245ac07c077d307acfb362037971f9e159335a80ca6e924d71d004bf6a430b388f *1b6089a28603823d117b210e655a491a5816b1eb6220c40d0fcbfedb121a21f6791c88589630e7 *e240c20d10a260af8eeb3c0e7dca7a4888898815f96d0975ca7a70e8612ec05e03130e4b2e1665 *2c4017423f6cc592a04120bc2d81b8586860dfa3dd415556a65300655c082219cb32ad0199023c *7e6116a03faf50213c8b03b98a35f8d1c01204a0804581c212f01425977f5b027497eb9895b0cc *53d0ea5e85808215e802e829349c61f4ba8443e90b38b8547940cc0724eb54088c05d20297b245 *b08248701d842898ff8204d9c5ac4b61849912a152dec3228f051f8b22261e7639ecb1748ea0cc *db38007a3028c121c14280b9b09a7895641a605c8fc202d374eb148a3725b8a0bc845d005ca608 *483c750f4856600880026c010e03a21a1cf6eb6f4b00c3811f021a3cf81e8c156257c1419deae0 *023821b50b0c212a5ff449d093ab260bb3808142180e5c42a1fe03e9d4e7e81c7db6aa61df9600 *a011a5e2e90d8ab614526d010a902328d52b89ea0376e1bf80036d2c60dea7031140835034c0b5 *843a352ed4405f900660922f4820951f7a3c5580bd8f410044a28e0126861f9282fd00fb1020de *17a21b1ca6d2dc6f60c5a72ec181572bb821d159001a9e4c3d04f0f9922d3c97820c79009c5f0a *688c4bf5ca9f213388d43f258ec20256fe922d08c132f7ea8db95b6729a1bba3ba2409325d1739 *d85b734f99ec0a76d2b702ddf59294ae9ec573f10faf3517981b6c81d30236c7315d7f914fb7d4 *b06d7e35a6ae62673836df12f3b815dfdf67ea80ee38c3982e8aafa42cc93e0e305b658aba8eeb *756c6ad4c958953e4a3a3624ac4958ad6341c722870d03733a56ead499789a8c98b714785c2fbe *3afcbf3230edff4ff003a90a1fa94123970f2aeb4342e6688a838583f5a947851c1d32acd31c05 *3ec91f38242470ea7821f53457a012e4907681367240c58273d665ea4e90422137427091035f82 *05c50be83484907697051c4217114b1e0d25f03a08e17a1568b05e8057d38c771050b022401e83 *28082b7200a915f481f634b1fc2f79dfb5dc38b26cfb8eaf98c77b433b9af046113be2c2922009 *1a1004cd1b3cbdf75f7f339332548bec56cff49e7d268e6242a32661aa0a55596b65ae4cd01603 *16151602ac41019683f09c28682ddf4e072b0707f0c27394e12e00fb94a6614bc094c1a5c0bc83 *a585be434b841837cd983e793b1da83f182e34831aae7ae805581e58add0538e7f868d0f0c1d90 *7ed82261c38291e473f404bc0f1d8b4b15eec5d3fa9584673941e30ced4f531a0a11b7833c7f16 *c9a2a61c9a8bf707c763cbf394ec7f849d055b014f136c63c6e2eea0d2e62ee6782e1834b0abf2 *4de3c1fec0ae0d430dc6278ef1490919fe86a6e24ea4e2a8c227f0ec120d375fb04eb75b3cf417 *a61d3c4a917a0a830fd32626040b43079b114b8f062c39cc0791b64bfeb6f12919db182d367433 *17c862c3aea4e063824902530800064b063611708461a7783b1d3a12d3fe058d4f692f80eec33f *e1e9408f0432a7f8bc58b4a5ac88bb3c0cc5fbdd73443219c121586f02626c6c064c2db8354c15 *96469bcfb079d04d18eaf8069cc02404342544b8e3c37a81fd0b4646a125001d870d514df1b79c *e2f8a4c933277cc036a28c43a4e006c7307aa38fcebee3723345ffe51581def7477df63de9eab3 *6d3d5b36da0ae8a2aaa2ddb0604239cfa6f06c8089b09e0dfb5994e8b7f50bbea700e89fbe895e *7d4f76632e8fe3cbf701d5aea35b46e77bdf0bd3bdd853cf745f5d46b15f9e2da2be3f8a4d2388 *7ae97ed0f7b964de2dc24a954b8476d1e6d5bde7b3c7f2d5375567ec938f2ea3a2663bcd9e6934 *877d5f8885eaa6d631ac76a067e419b2ecb3674d4f8da0cd372cf20c9d5e3f631a139b3ef41cf7 *b317acd33eba576755cd3eed6c68d12a2d3b5bd769ac86bc344a2be19919768ceed5416358f159 *3c55023d7e0b57a217c8d497edae34706d699656d24332dfae281ae9965324f3ccf79e1c5d2cd7 *31fa3c3ad68ca26db21da3acf76a56b81a4e5bda24d9faf5e19eed5f2eb5f93eb3e3c865dca39f *249d5e168daa82dd934b91359bad5bd1595bbb83ed721a2ecb99902d8fe34ef9c08fac76bedb6e *84b250afabb39dcb8a49c6b88b4160d43bdbb83a2c4947d13d0755df3385b06816a3a1b2b9f48b *625ad7d3e162a847ca34aeeea27636dbf8c634f54bec12486775631cdabc58cddb3007e4264c10 *f2436d31ee8b81c2d738a1de6edb304f74e362b0d7c0a26ac781b161bcf2bc18cac66c55f68e83 *efa2ee61e89daa963e7ef5b595591f467fc60e7ac7a2cbcf16f1dc6199b45f9db9ced52d08a37b *a84fecd4335e9c7a27af8bbe36d71c19c1ac288279c8a6bc768ece538c489eac40af33d7ab7b81 *61373a81651f6b57e74ddb30610e2cf596174c3f4da4a2adc2bf6dd10bdc23d30c6cae610dd8a6 *b3bcba4e7db6750d65da65cfb8ba88dc637be01991eeb8c75ed8b73ca7580543af361bd5d61766 *68a4564b7479cf60e960ab68f70c5833ce2c3c5e8c41adcb07e66ad0596ff976bf7d79321b13dd *7b8dce1a816e31189ef58ce9ab7b88cfdba9a1eb6dcfd397b1e10cd8fa4487d674daf75d486583 *d1ede9ecdc334f96f3b46afa56700afc304f34e9785e6c84c3c26cb716cb70db3fd69f2e2c9f9d *dc6e3c9a341d398847e3de285ed4986ef53cdd3757f3ea7c1c8c7ada21a854da87c5b2deb2ca92 *a648abc5c8eab35d6bb93186a7b52c6f9a4de7b84dd61d676fa4a36830600a7da02f9ae579d9ae *fa2b7eb4ec65ea7ce63ced3ce870cd17fbfaa02df49e8a8eb76ea47fab4fe60f8d13789ee55982 *a8822c67112fe73747ff55774bf3dfd6b818efe08eef970ad09d00a0f61b7cddfd3758fb3ffecf *cd26f07f311cf1d68d9ff952ac2c81ede80fe44b00cec897a2fed097f27a02d114117d299cfa23 *5fca5fecc0dfe328e1585efc89a3e4ed90878e9298b67f846b2cc2a088458800741710214bf812 *a0094f4cfb3e9592096b72885901cdf0e42300300a1784af606706ac0620430284c73d70315cc1 *6b84d81188349c0817048002500c80af0c8d51b1190001f307742e2217061c008813593a8be80d *482040373541f8051d8456c1e9ea835e5c5114343889c8c912a38702c05fce232287d301c7006e *e3b20f60eef6075020473d85f1043e0f881660316023809bc05701142614710562293c20e74021 *d0cdc4226a471e025d887048253a9d17f129a0c70750577aff0a00da38c0be192e0ab85d2c21fd *8036434bf02973c899d0a5454e9ffb6eaf94bc45322248c0c1c00de059b080d8d21f705db235c2 *9739ee7b8817bd8fc17995dd2184182b35f57ffdd12979ae67d39fcdeb92c2f588296137abede6 *a6984b668d81368fe33da5b6b59657fefce90ed678d388e6d97309177ce987ebbdf460b997ccc6 *bfe186dc5deedbda8c0f68b1717977b75191610edd7899de69ca572cdbbfdecdd9e7833e59b39b *76bcddffce8d6f7716ecf7bf68fcf0afdfe24e504db4b612607ef6d9a4bf81d523dd139f4dfe59 *279faaae3f1bf409a7e074139c67609782fcd7dc097fe5c677ee7bc71df325370cf78dffa68aec *378e132441f8a67c93a56fec3def07f3ed5b287e63bfc1cf9f756788e43f85558f149143022991 *87114c287ac704a45e60e5704c52f436020d4b6eb81950f78cd85dae218513c98d08864822ce96 *b3c8e181d401574cc991012651e23ef82380bd83e90063a591d100830c6607787eaca15145a76d *82e6085de111d235fec69883a9471a27a1cd41b3439b450a1dc9d086b331527d81c34b8171860f *d1017de3eae5c8bb0d7b9048c613cc2f3c71b80272d40c7f0be47f576864a0311a8f07bc7b0458 *7402c2ddaffe5fb0c02cb965d1b7c8bd7c2892e98e147210a86884df4fcfb12f9a48039e623b61 *f081d2f357e7b882a41ae61b6ca3b09540f3609b136ecc6f04163e053e3c07eb80fa12b0ab9b6c *bb7da0cef8cc85397291a9364e5f60bbd04989fe897b27f76c39cfba854db78c67d978d6d9af73 *61738a3a8c7c6aea85d9b8275f04ced7baa33f5878e6bb2e386bf7b85982f2d69e58f8fdd13199 *8797e40ce492e78e839e24d54da31acfbdbdd7191cabfa9507db27ce60e25e784655653c369cac *629c87fdc60538d16cc08ff6317f3a00699a2517fbe099ecab26617e7b33e6f66e2866887ac3d5 *807758a0b846daf79740ac51f9f0a2172e8ec087586f82fa60fd887a6118eac1cb871ed7c40f27 *a631b9dca173177df64ae72a53670737c31bed19d70ec5a4529d2582075c5fdb2565679f758e45 *a7274d80d2cd3db3fd4ae9d27be3c440d3bbc35e6319cfb56dcca7ab61df3bd52ffaee95de556f *eef6f16657552a83039896bb45bb1fb251194862df97e0b1e5f73417409a1ac8d4c76d64ea5655 *9dce3bcc28d9684e67ce199ba1adb4ceeeb2542b5f0e6a3738b79329902857ad34db9a9636bcb1 *e8342f616d61fa9d61bf1f6ef9ae1acd03862d1763c1e6b4a5be3ad7a6f9ba9a9b8eeea87c58ae *b4ccd254e8cdb354f64baba1a51d67bdf282b57453180f96abf2c0329ad323f324aa17a3343b0c *06d938d91d2e51653419cee6ab739cce45bf77ee5883ed53dbb5f4b66edc9ba50ca96ccb457fb0 *195dc6ec692bb3eb596b7d982d3a4ae7325856c252abdc1ba6bc73cac5ee525c4cb5d18037475b *ade6dad9726332e9b873d237415e6bd505551e2ff271c31d0c26acdd1befab33815f767741b5b7 *19d4466dd3da9b15b72c67e5f07499eadb893829f719f7520add753d301687a851eaf7775dc776 *8495a3efe68edf8b7b936d7ecc8af37030aeae7a4f42e73773410ef119fb900b72221da0a63fe1 *7ff354fa3afdfb6cce96f355b438ff0b5a9d5c09d4a743822c192d96b36531ceb6149ffe7c913b *3ac37792f853d6a8ef0b8cc0f3fc5566f073d6f87a02f961e1049e65e51fb3c6ff46bfff416413 *f009502ac02ab005c3868b6c8b7ce53cb11596820a18d37d1075c3b8bb8af112b8882aa3df3fcf *d1052fe6c88fb88422ee0460f80731f584c3b300efa5396efa183c501193707453e05f4060610b *05a2246a0f489684600371518a9b7ece911f5ca0808d8af43005749422ca8a1e103d364276c993 *1a00b0104ff84aa5c82b400841c6f8136cdd00d21e4540a18f02c5fe81240219cc3464aff01bd0 *ac9053fb25bc02c09547916074fdf388f700baf02a023380642c11d8ec1afe89313086218107fa *066803a2350e79f14b443f46ba0a83a0101a94293e0483933c184960e8700c402c9800319174e8 *3b90dc5cfbc5c0eaaf9b2b54a52a18688147af0818351189b303061623f47e08841b33098797cf *902f2737a45b8d88892b14bfa16e6a14f3866bc27fb98a811335c3080a4e0c15fd2ae94df40e06 *5c262c0de306038e6e8a08272d06204542ef3c127698a270244cf59c6ef48e18557cb20a05f0d0 *b3c1e1a2c829e406fd8ae899c2dcce658c0f8931129f5b69851c616360fac19cc7b85d86613378 *88188025610aa791bb86540518d5139eb31bbc0af8163a0b1f0a144c82090fbd007e018b578951 *d5013333a735022b5ae47039733753083a2b4a34f728600f7fc31c48651cae44c18580803f41ef *133c1db838407de9661564293c8b3b68b93c5bc6b0a7fd50d2fc193bc32ce50c6c00b20ff3d9a1 *496b1a186a067e04cfd73251fb02a6c0d601417f1d3bdb066998cfaf71245377bb77f5cac570f0 *2950c3789de4586dbf466a24e32e14b61b87b86f8ce2c574ebdab3fde02c9eaa137d8a1762305a *53e9dec78661399c4465e91097b545d40b2f5e303836f4170df399a39b319fef960200ad6224eb *4b589a21dc1c4c8f8dc9154c7b81f7094bcf268fb134f33d98fe552ccddc211d9fb034b48e7dc5 *d2f5efc68b79bd9b0f6463307730e9ee6e06e335590f1e77c7fdf08899b724bbc26ee9381fda4b *13fe36f4963eadce07fba7a75d2d119c60dccdebd5c92998ae7cefbcad39bbb6201eb94c63eae7 *651e8dc64228ab9e6ec4f2b21eb55787245a76a479759b2e97e23a887a1107a4685719d4d753fd *5873b7b56ad7651d55eb6c9884ad1c2fa7dab656f70f4eb5d3eb75f7d9b4d22b0b4fd58afc5459 *056ce369a42e17e57294ed12471ff60575d07bdacd857a6b1d2a03462d2da27865b79fa6674e5e *8885b09e4af552cf95dcd5a1910c8a85b92ffb13af56b29c70d5db6f9da9b5ba04e13086197314 *f61c63093b216935dcfd79d529b6f2a1d6134e764fdb4945a2ebd953a49e078dd5621a0ce592b8 *3e9db84db5cc458aa46f1b7262d59d1533f267a7a9df70cebb925fcaa2f3791559597a70f6b555 *9cadf47ae60c9e4ebb2c9fd985af45aca91f6d5d8f1a91e71447bb18584ce8b301c69260191e0d *18fd12ac4823d09b146c6aaba86d8647e2c1d3191c9d6ba4ab00e270b42820b55c3318f67d6aab *35e0480606a45ea25930f38dbe7f0995c638f1d7fa44adb383997cf657df9310e65dd46c5506dd *de72bc80e53709566e7f3bba848360dee81e074fd3c17abaef38b15aafc487ed74be70eadbc668 *fc048bc94fb66d7feb5c9aceb95e4edd8dca5a9bbc52bbd447e242147ae178748eebdb4e680c86 *67d6e9b3cb61b5938597586b4d12294d3accb66b555a6e3cf57a61ed3cc9cbc262d82ff7669e3f *5fa8b535db6b08eb60d34a469db3a0c8f2ac7d562b7e5b9f443a3fafac2e69c68449c551926032 *298ef399b44b427677164bae65a4bad93c0fac76d5cc0ec52eeeb44fa29a865ed85914da81f374 *79d6d527759f09b9b5b3b15bbbde65dbebcb66a991eeea8bc561597a4a1a2d6bbf9cb333c33f84 *97e0f0d41976ca96cd8527999daab95844c791bb64aa9153eeb0b630134adbc9a1d25d0e63d3ad *0fb34d344d2aa372f1f7c6cf38810e50a5df1a33fbcf9087d7adf1b77027c006e41cfb33dc8913 *fe1bdce94bddff07099bd1172b22c4431f6a8638fd0a5a01af291c623d554362913ca00e70a240 *9a2b147d89087b13c29ee8a9254126ead00492b93e8832f13981c79c42762ac6d9e0e02847d406 *cde364145e02f50126a73d201f91fcaa6426add1d5199c906f15b81d606174216bf879fc40122c *cac8c0f814654e2a8f2c0ab16a823a619ea4b93008a8044b11bedda72f0286c250f52790c68f45 *bec5f1e83c06d08d4a5d62963044da83a8234c6b91429d706b45423e0a801d9032b2ba18690d10 *29916268ca035932806e187c60091c0998e052d0df84dcd832f9e981ef02ba97c9af7c9f8c5e03 *95e4e99732c4f5d02f14004784e539f4fdc3e380a7fc682461e89049b0c805afe10278be80df81 *5264223e0b94c349c872f8074f534b50f408dd8787827c31c266034b90288c2cc72ffe78f4cd3f *208240ad04d2fde2bd8812c10c0432811332c73f1405496d2e7cd040defec431ce49645d3cf27b *988dbc863a3460e71c0d206ad264246dec2352cea19e5fa3882bcc465808304b51df2e908c33c7 *7501b3854bf059df9fd5090e784c5d8e29c925a65185f1819909ac4e26c60316f451241c9f9780 *94086605cca59443ef4846a16f8c5ac828bd862601cf4e1eb401e86c14216152a217f6a6500c07 *e86c423a6d8da498d780fffd75014fed47c1debf5dd8fcaf3f56d16e34cb16cfd24fc29b8faff4 *4b61cedba35b4bb0deb0b5dc09dad15760d56f827c2aab7ce3e0af6fd2b7fb31e12f0730c1a262 *aa081801839c22248bd05514023826ca1c61ad01a7b70ddc0b64edcf060dd1e67238e1221597ba *42213698bb027981780ed71efc86f52991bc415391f2bfbb0248a38cde279a76680d7972e690e7 *8a237d6d464e3998fa3065c1d6dfc61cd171411131b80e4efa18ad154a173834ca184c4cf00058 *30298f2606d7ffad9097b2771492a8c29539f2b76402ae4f4dc2eea03f30a69b8a94d84036fadd *11c1a3730c8c14fa61285707e5fee4fa404796880b3e4dd00504cb06368698fb70f7aba21a2e08 *56128c1dd86bd88313f27ee04acbd099034f111a0f7d07fb2b52daccdbe96022c1608159e74860 *a3d09e071604f6459e9c36b0b75db7f6887632189ce466c55e639d301bc0d0b3b459a2174e21af *60869d423fa784da5fe83b8c899aa10d7a7740c9e8c381c181ce4a948007a391915b157d8012e5 *c6f02853e6c92b784dd87b3b1d372a4acf406d8c8657062b03a616e606f45422776ec6a2030aec *177c0257886efa2e91df090c3df442223726c65e13dc29a1c1a8808f297c9f138ca0ed27bd4133 *d74d57a199935f0536a40547a9ba4a42798dfc4e326e63b8bb9397f8bdf13c3e2c186430a630a5 *3120ce1184d2f0224a8e3b1f4790081e3a4f7932d1cdc8a3e022c6ebc3505fd5cf30c361787392 *d6e04492c9ff4c00089e053ce2dbbec39ce4481c15b10c6364335cb4afca16c28adbd18bb8e517 *b3f1751c5347c580afa16242be2a6206bea4a3e24126cc08ddb6686939bfe0c9b2f48b69eaf3f3 *7b79a9e07e79a9fd7791d1f6b47b62ec979a3b869e04a65d4541eb65d83b5d3cdfc34a39570fd7 *7165c267a490766da9e705c5b151bc2aa2cfdacd97da389a8793d434da69afba8dfa8d65d49316 *3f72cc305960cf3cf3ad8c52d29e875bd2d98e8dd660be9a0d8476d1ad84e3b83cbb44e5d97e78 *46a9b53df14c9b583cf342e3abba3fe8a63c1cd8732e69393cb7cbd5595c41e9b4b81fccbb2fae *afe4d80c6c89c2c897b730f2771f4eee0fd6a3b162be3a588fc68af9ea603d1a2be6ab83f568ac *98ef07eb67f5a8a81c95d7de5794a8a42cab3a23e473a13ead848ba277eaedf4795eae86ba7450 *cf7c25eb3c959ee4eae269a4ccdd8b6445d671aaa63bb53f53e27aeb1c3aa5b8a3323ddd7cda3a *6bde71b396324fa71b9f770b65b758f0e148770ab770ccbcf0a6276dbc6e574c41e8cc8f6d6ddc *b0fa41511db8a33ea36fd95e6c4cd44bbeefd416797bb16a4efa83d194f526623ff4fdd7247aac *1e764f29ce5ca5e277160ffaa2dac6241da5eaec6004ab90352a4eab594baa4f6974f2acc87513 *c55f335ece9ac6a833149cb6bdaa97dcd932cabdae77ae86393fca07b3fd257b5af6a793739894 *ab7d67e3774ba2a6577567e98e375c0017184f782b9387fbe9d6edb6b5fd68ec8d02939d8ddd8a *5d2f94937d3e8ae355d7ac7a9e3cebb5a6535172f7c75125993deda5c92a627c6d783aade4a85b *800dfa7b1d2e04397f4f84dab03145dad8ecb7db6cb645cfc3ab216e84e465f8815dbee74520bf *c38f6cf94b62f5318be7d176976dfe5f0cf78583bfc5d9d71d309d6cf507a751f05a7871c0283f *74c07c7f02cfb2ca2307ccffc821f927c5b54582a0242106c49265484431d73a45361e2bf8adc8 *7d00cfb73f980d2e21c2042c04d08ba70c4099477002cf4ebba64fc788d5d307ae04c024405ff3 *0c4191a65186b082601ec04c92237843a098a3945778105b57c87fc111aa4121748c013e9e2274 *80e230853ec138264baabcfbe493c5f6c79491a8524674467974b2484037c5c600e80252203f88 *29033b952972cd92169d25311e4a0773fc0315d4948dc9470f5d4b80af10392b88c6e584dc1f32 *c549050af7ab380298a2ac22f2bcff3429d40bf8134f5769e4098a6b14b25728a4ae91ca317aa0 *3190a8a7d06b383251291c4cc508a4ff40c2f0ef1553ff8940baf012f75648f09eb3e85a8c24ec *3166c793a731212d644209f80a21fd77349d90a785c7470dc0f49a202f90df0343d33495603a03 *0f43d240d9d9f10d964fae22531927089c85325eca2bc7c83c894f73a2c930e304d28d023c576e *c038cc8b84c2bc2c1da650f22fcc7791bc3d39d114915c9a2ac5a2a31c9bf14e4023ba1d652740 *2f60b2435363e2c12cc96361c1c919360f6e84ac8ee6e6fbddc9c9861503c878b0c421b86bce2f *d1718de2e43c79c304faa77c33e332caee04e621aa947faaa2c700681cd2a60cbd4670cab5e244 *4a62d844fea099d5d05df64e413a59828fbd73ad56f603faf1997a08d6b344ea53537eb634949b *c26f95123365e3993571111a1a1145fdd9e07e4180aa22f598fd9c7a6c7f1ff5681fbd77eab17b *ffd26900f80dcfc38e110cfb557ed877df44967735961dfbc8548e2f51f5d3e8c71762ed937bd1 *47df1709639c4a3a1bccb95122f8b3646a8cb1f97891fabc3af30cb16f055301d8c5a93171cf9e *a5730d67099fe96f9f312f1f1e8bd8fba83298561dcfb78fd6f1b500dac8c4accf840fb7c9e5bd *c22d638ebcda0d636a86587acc725f23ed9b9bef8261af41d9ad5d1c97797846a6c1fc806a8c5e *f208916a0c1e5d8879b992e175bca3dbfeae04f0c81786bdea6ed06fb03098fa002e92d045a4f1 *30308d05a06de6e384b1096e4f507931989ac5c0d6b9c2ee64d5ba68d8d5d23949c645e9a4fa82 *7eacb1d37a6b32d499a93989dc7ed3ea96ea36eb0ff5a3d32a6dd671b95af71671d4bbb48299d0 *8f8ab2b68f5787b2e707c57096e8eb745a9a8fdbeeaec47496ede6c48f4edcf6e80e0dd713cd51 *fd5cebd9532357ecee60cfad33a7ec6d079b7933da3a7021dd6a3d79ed6a79d2f596f962cf740e *dc4e3888f355b07d896f7b581af841ad59b3f81c817e2d365b3e6af3c473c49150933afc3a727b *75989fc570d4584ab3421ea766238debce6037d28a6549e0839a9196061cd313bbabcb3c3befe3 *e3a6dc9fb45431d7fc43394c63b71a1ebde3b1bf6924d3f454782b6d91cc662d3bf1dd85201bc7 *ed32ab950346d643a7d384693a5d6ab2e325763daf24e2b1d26d56a4736717b4f39e35c9bad566 *77ddd4f9daba5d6ed6ff17308cefccee4fa1f4f766fab7300baa3325135180ed5bfc39b3f8fe84 *dfc22cfe8ea1f807310aac0cc4514aa44aaa5615e18fc8a3c311eb52288847004ce78fd07c4270 *806a3cf0572f6d8c5120417e71e6f2e43be6c91f783f38292076cb79842729f712c14b08dfe504 *312299a282e2871211b73fbc8261370083708090626811d03300c34845c005a009404aa621af90 *1f5c81e3d07b0b07cb94cac54628c7d428c2191134c3ea41d732210f123b0155a984e6815cc190 *260902254cfaa21a1b198d03e0350092d1036e867e542ab885a5bcc8ad8c7a50aab382d13c2ad0 *c591ecf2512f006ac5573e2313a8a450f3b5dc0bb0112e42073734060b3b3d0890624a2749a561 *3c53aa6205141155aaf17f93515029db5756f167f943825343a36434a0c0198f3c31a182505894 *27424d000cb34a25ba00e2a348f52688c391de18e61196718930ea9f52d45f214531d6b2e13128 *ae904a40a51a70e9cd18037c07fcad105bc008748cf742ae42bc15ae10d3f4e42908a51095be15 *e262f9ad94020d5468e67a53f6ca2804aac9c2616407f8a342b2008592acdfd94b840d83199d50 *9ab3404b16a618ac6c8cfd93c618f5b724a8c6c882f0a1a8164bdc1c4bb7503005cb3947389898 *b52720f502dc1d2b682a50e17ccd1dbe0d9fd1744ba8629174d540486851542ac2c59214001756 *460126aafe761bff925135cd3056b687e932cafe08b259365dceffd0cb5f292efc9945c043b06c *2a5923e203b158640e92f3ac2bc0199e1d91cadca9e857708c6749fa05163199601a5bf6c6228c *c93d1661ecbe4b65834bd909836f167849650bfc72c8a595c6242ae3eb1ec2edb0b73bc41dc3f0 *2f1fab73d07721e0fcb3d1655e8ba90c7b126054f7a51af055725ab6fd59daf72f037e84e53e66 *7139dce08b05ba73ed80e7b4dfaa015f4b756018e1e4590655036e5c3f3b7b97ae849f7965f63b *8cef03c63f1e99f25bcd97863d048e92f08d2596790136318b786d07b0bc725b85c63ef9f41dc0 *ef091621615eaa90cce205d090c947dcfe604c3a31afb12f756172e60bd966a9d1b94846dc94ec *5dba4af27c1d4e74373cf956a66c236651660f215fe98b87d08e9e44be3d8cf9a1a78c8e714d5a *196d7bee58cba4356e36862bad9338a34a38dff3c56030ebf3bbcbfebc620e3b7b60b1a69f8ed7 *1329179ec67e9f0d4b7911a62b6ed3b6d8ba677397ba6f5567e1d83745a33a04805eb20c56d7b9 *ac25728cb0f2f561650cb7394ae3976cb3e5453cb6acbb2f95703ce81f09458fa838bd7aff71e6 *0dafb253d1b60b186a371d56c46d50d4ebd268c53ed90b6930bb373b81b230455b6f95164dce10 *4787a5beafcadb55bb22c1b233b7f52a27b534ff1c56776b6f36ebecca435b6873fce63cd85f2e *bda7413310768c10f427499cef6c984eb21bcf6a8117d8ca91cb4aecb22e18432e6db2934e11f4 *8283cbf503c94fdccaa0b616cb4e20ad7a9312c31dfbe14419385e47323a07a08dbc512917fb7a *b9cb77c2b3d551387d287b423ba99fd5c6df1e2190f16bf9f7e077cba60a209f6d1b2156fc27a0 *cfd7fa00d0f06c43d0f4d309af96f0ad2f5fac6b82b0e06b196a2f27dc66a8898fa0f87faa57ff *24544d8240ca31228fbb803b3c60c154410d05eccf39a564490f247f02692e50d62192ae2f46cf *1b00382d4164c6e7f8153ae9950f1933b73fb0c78a22ba19b32b1627bd00a00f99aad8c19e9c70 *2fb8237a80683972846a54c4158bd9b20825619706fca211a000ac0f17c1da740f448398959551 *408052db35921a465472334b50ad10534117f88acdef5f41a40c39853cf1918078017010c61ca8 *fe0a605c896ad566a4afb97b05b83bba825344c33995368136a3ce30a15225a4c19308be3d2a3c *832e530eddb630f82a69de72025cd7b2ae289d52a9b09ef4306682423816475ea1b804202cb83b *a01ef557f3cff0e74febdffec7e8debe2c4ee34daa9c09cfda413f2f607040b506ffec68e48ab7 *9e059b88ab8da85c93ff243360299c85410109a1ab4a851923d23462ede5e8a5aa044782469459 *8a1fea732270263194487256d4824938a952aa09a451922546a5a81caea0bc0488de4e8f6284c6 *403bb0782655dad4a81c11e2eb14cd08ccab8c14d700b1e11314c7dd320382eaa80e233e2190d4 *08fe0332813333c6f582da224ad684914ca50f95126109a8740047765d20820ac728221a2ed4ca *f13826328ba81cb357d50f8109a4c712122320ea608b50cf2521fb89a992b3c0bd442391528ac8 *1250cb7d03ed45d266e33813ef115312c7518260ca639811879daa83c0c8c072c3ba1a376e08ec *a30ccce0713d9df76cbd3fb8afbe82e43363c0888dfe6ce85490d8c6978ee83cbe86c4d29f1dfb *d9a1e009eba0c1b69467fd578a40d6309b6b557b2f02b9d0c3cfb88c8a40967f5311c8375f7c9d *b18f23bbcbf956bb6338de6dd1c740c7428f476fd2782ffa489fb5e933cfbea61232bf5af4f1fb *9a8f37a1936d800314029077edeee9b5c8e34f6a3c164cec9657974b3bab3684a7d178e2094bef *f0142addf6aebe4ccbc6dc968a72a536f3edf9ece0853da9d37775b3a204ab5ed56e9c3b4366a2 *cdad8efb348c87dd60cf7a4a7d3a6b8eaddcd873a352695fd69eeabbd1256f548ed5f95ccd9bbe *5c19a9bab71b9dbbed45d29b854c672155838c1f2f15d10c74aba6af277bbded9e86bad6a9fb0d *369d445cb669ef92d71a8f304e456117afca1de64e91c7e56b91c74160e49ec3173dd918ae9ce4 *18dea9f1c8fcacc8e39d1a8faf2fdf4016e93258e4115f31073c948a3a7eb9a6e3cb3c617052dc *14753c5dffaf9f3dee0b351dcb2b89c957ceca1f158159548555388b07d56266adebe2c79a8efe *3aebcb7ed41d0cece3d24ce570d8e3cd41b52d8f9927eb6351c75fade9c87c5fd45137dd0e5f59 *a6826b9777c56cb65de66e8593d9fad3c2ae1c5cf5186feda9e1d40a567a9a2ab306d3de669dea *da481ad5a5981c265a741a3cb94dd91c5fecf5f41239ae38aeb5f4c69255a7558b15d4b81644b5 *4a2db096737d5b119e98a2accd62bfb8ccc48319898bfdc012dcf99356aa5daae3446ad55bcd86 *222e86a21f9f47d3634719ad54b9c736e4a3b89afded351d054ee279fe5ad351613949fb191ffa *ed351dc1a4dbef32872ff11d8ec57ad4b00df1c2d7f8cef504914ef82d751c3f36fa1f4467b0d2 *61822e4cacb290532de80c3df2e9158d536907c0b48f00306e9c39220a4c1da2e802eeeff4820c *99fcac57c93fd28407610614a7539442be26ef50d64f4cc17e85a243a8eba052e48fdceb57848f *352649e9a152117595327de06f8db27800b971a41bba4f460412aa67a4fbce1028a2069f7b29ee *ad5c55511ca6b3e58fb38764ca72c00c0305831c70df88dcbaf009e0c38c5cb04af2307be82ace *02c4087de1c9d18b750b282740b9368c7063c43f140da1a09e27b13c8bc816fe8e5424892c5583 *c00c0311e918163f7f40eb608814aa462e50de9c42ef9bc0baf43f921dfd6fa9dd484bfc3f55af *f19e05fb54aff1f6a0ffa1f51a659daab3dbf486100d031b1c511096920b14052b27021d910c34 *0f1aa546b036a26e47fd6be94e7fe5c677eefb4fa8d7c8537e09c6a6e8bd272999f16b012496c2 *4158ce5641de07ec4ca27718f137de984cc3f02158fb9cde83733577ec355449cc4ea5c4178584 *8a31d91ff1c6259528a46794710791e81d131abd6c48a14833061a290547a0ccd0ab9a55bd31bf *482129634920951d4f25f8d5085bc252442e25651d4b2584c56b1eebcd0e1289147ba6dbc14558 *721ca9942fa95c772eaa3e8b52d0146702d0e7db5730a8f4ae01f9ea07c8704a002b4f28f507c8 *29187c3ec66818ec2c0ab1f224fe207acdc8719751b91db0eac0a6e3e425bc86e57be3573d21f9 *94d0cb177dc85ac39458e9abf496fff3f456369f4d0dc35fb28d9b92c36140cca6a0bc6050c3cd *67d1a2ec1efdd9fc858098c5632d92ad6eda6dab5d999af84e4d33a7176bbaf8eb7315bd36d57a *5c21d5656eb82e975cecc6afbe6b92c1974dfe156ec420397ae5463dcb3e3913bdfbca8dac2ebe *a2e01a7e7afdfefbf76f323f7b01e77bc4cd4622253682f0fafe4d7c81fca43831af1fbe0ecaaf *8e0973ef059cbf3226cc3dc2f82b63c2fcda4b497fa5b84da35eae6ee2c52a108c53791276cb5a *70ea6955fb381737e7933bf1fdf5f294e64cefb008ea8bee8137476376e81d4ab6d05d8bf9ccf4 *b2a124b9a5341636d5b81d1e87db612badda933465dd322be84b6d35e5f635e664cc53adee364b *c670bb8f6d67ba6cf9a3ce0928aae48491355c1f8b9134b7964d2138cf43c38f1aba558fcbfa61 *dd1a743786cd5cba8d5ae24a83d1b03f0ac6975ebdeb1cb865b0385747f6799ac775b3338b3a71 *2b528ac560db62cffd75c77d6283a158dbfb1dc961a4be746e89bd745676dbd2e4ec2f234ed09b *7aa8b49a7651a9ca93b954ccd464daf375b6e00ea355e4af76b384ab5446c3d3ce3b30cd4563a1 *ac829a6178cea0181e5da5c5e64dc9e17bed7a8f9daf5776ab59ddfab63d3f8b427f7a15ffdd88 *6099374f94de842760ebcb49766ef18bffcfde952dab8d2cc1777d85df897bd1d2dafc2640ec62 *dfdfb4b2ef08045f7fbb521c1b3c87f199b16771c43de13861631052abbb55599595a94b6ca20e *ec65b2ea3907c3b4ab457b351f57dcd531579ef79d4a905bf9997a38bd0993bae6edf752c407b6 *bf9e0ce773f5501d6f6a921b1e26c3da51d23bc379db74e5b315a89361e71605817add9c07c355 *b9c4068e2dacb622bb69cee8505825eea55c984b8e31ce6ce2d02f2ccfbbca7552dedfca6ad81f *1f94fd716e0d56513c3236d3f3f836b19acd464928244a70a88e6aaa18b743bd58df07bda2a61e *dcfd69b858e53aa545578c8cdb61b8bc1de4d66663684df712844adcf257974492f7c2b47f2a55 *3bb7b2971b2d567dd6da2f2acacada8eaad54a6f565c74c7b2713033136f3c3df68abad5e82f6f *99ecdaf4d9ae18972379298c4fc136b355b59e59a9c8bb966f542b9df054f0fd9de3f86a633e1b *2edaa6f5d3eb99bf2fcbf914747cb1cd34be5865ca7738f2e59f0f169a3f07f3c7c7ef584a7e0c *598fa4b48ad8eda17088577e829b260a9f12426a8323adef670e1adbf327d9f8fa0159145f660e *fed14bff85b468481611e22d1ebcff889116a0f51cbedf814a95021ec8a9afc43821f8cd20b2c1 *634512af88e0356180b48766108e97259d9a1ade2f65ba77034419ad25325c14495e11cde5669a *df801e67f0a28ce87a146613e3c920aa1407fe216263d2d184475be8a185845165f3fdab9028f2 *94501b0a90cde0271fe804c689ad16503a4204fb4c7b2529aa807ae622a487bd43c440250be9e4 *d3562462a2492fd56c4c9041f9251ba86e134a6214bdf3e05685214660927a89086789f729861a *ec380dcaa55099099670fcf6a91095a4a22a4ceebc670adbe30ff5d7a46a973245f27c1cfc80e2 *6706455503266b06b419c217e7c0010b3ff900c23e0cb22d012c3b42e0208efbe898694bcb2b75 *239ff2482e3cec48532882188b4139193e257c58cb7160a24303fefd2328f7729ea613ea713186 *327ef349421d4c981b86fada8583d17771a01f426a89435a0e2edc0086ad22d5c4f9440a6196f2 *8ab4ca47987f8b0ef29d06806382c7c72f4d859c3fc76b06e6ccab917461fda1c1af5685908804 *9106f2d6d4b05e007074e5652b5e888a2a65a21896276af1a4f149090caa8af291e44fa01023f3 *7e891f7ab45f5422c8f815957d1fec553ed51968b834b75fe4e5c80df0a768c1fefe23cf95d11e *86fbca878c1c797502812406c2a00b017a2747a1a908095f66e2a3a403dea34165c1002dd70308 *e70893843bc06815d3db10d2cc4e4d19bf122919f12dc845127a207ca793bcfb8665c290d505f6 *e6f8dcc7b790e0c9a39a2b6ae17cac55e8132910fd90f0295239c6d6ec81fca923ad407487876f *d7d3ad0a1e0d24dfaa52cf988a6eb1106a622204b0525f183fba6fc75f870e8489b4714e946881 *1960932afe5d19867c524d98c5a697f9ec7da041fcd64b7d34f5cfe9caa13dd785412c960a1f01 *eabed4694bd28da72488a6dcf9ece4efa050da488c904c09a8c9d0848e5208791392e8f220e1f2 *b07190ff2ebbbb36f2e10d5cba05647ea4d099d06dc585cb305c8cd083173c10834cbc12214bc2 *af91efd421a8c81ee4c04234042a20f7f235e3a7ccf78738d0c0c9a43a3e7c7192148f8fad41a1 *3327da7b44ef573039f9f99005f2c3c853ba5c06f782415e5886e432721fc4bcd168d56970e594 *70cbf859898f4e90c83547e092d313daa7e96ac27a890f601460fb487951069c86e1c4f1952200 *0ba1547f86248e7d22dfd0f980f0cc9f1681ff96dcf1ef5918ede1be1beafda112b18f6652943f *9f49e15f9e97c91283ce2ef7b9c048e8973fcef8a33657401a0af50566814f6dfd085160adf76e *ff0c5160f1ec0ed9ecd98ab3983cb943367b6dbcf6971305ae1f240a6485253346cbd8b8d9c9e2 *6097cd66f190cde6b6c67ee62561a6db5d572b73d9d2a3dc45320a43b3783e6cd4bcb61e2fe252 *b330381fb7423db4d95cefc57bab3cbbcdaef23cbf9d77b6237da305977ddfefb70c3d9c44f9ad *1f05adeafaea9c1d57d24db55acd9a95da46d90abd76cb49f46a3799f9897d8ba55e70ae242daf *50b8b6f7f2f41aa86ad19b3a727ff32b10052a7f8c28709f27024d8a47f747a8d5f4fc6b63f501 *a2404ecb0bbdee6c352ddcaaeda1766c7455f76aea71a6b0f29e8902ed70ba14b793b1655cfbc5 *f850e8c7c3e339d4cf535518de7e3651c00e1b534d9a1ba7f8b259f6e7396f3d97a64eb35926d9 *d94457774d79bd1fce57ce542c4fca1d210922313fefb75aa3796e33cd2413a3dbee955ac1681f *cde35d56324579e58c62bfd6959cecba9dd1eb935e36de7bfab8eef1b5511772ca2a2e9fa693a9 *d20acd9ede3e05faa62bcfccf695ed2bcd62665b9ed99be9425ab736e528397ad2743cb556f3d9 *45ab14fe7ef347453698f666fe18287ef84f1005e43f08f74d929fe5cf3259fbb8e123c450f907 *7e1a5140fef608bf0251c08b201690ea7b80c377a7241a14fc7044415d74e1932bd6e30fff7814 *51106b40fbd540c944855918c12d74011a066a57afcadb28c993b06c44efe1c149900a9ba246c5 *e4375330e52518a086238598d9115aa22890962094e01138e7b116b5154aa050bfa03bf028eb6e *49099558962a447854ec71d12be962b24830d1781fea87c4a5d060d8c1bf2ee58b33f87f110fc3 *a761f1517d0f5f1c21001b80c3517237c799e840043ce0e7c3e2230ef42045e8bfb817fc0e2ad0 *89502090ca6004eea39b90c7a2d4460733141901edfbf3c18769884ef11ee51dc4bb9589f97f93 *c7fb12ff2b8d1dbfddc1de35767c7bd3bf94282041ef832178d6e059aaa05a49491bfbb3952718 *2adb101fccc1a6dd266942852af83f4614f8912f7ee77b7f05a200df913808a5fe84803054049f *1d0f1a440cf62b22185764c2923af884b42b7e05f832563a328954f686d7096973c3e6c6850838 *df3d883a16c01f567a1217e6003002f694a1c5ccf1ac0ecd1a13f8d4834dad0fda0103e4e7d05b *7dd87e5d74c2782eedb1918add121de10aa4654939da44b20f505443caf2d1fb89b2570af85b2e *aafb68e30d90a0e4988d7476d2b406d45f0383109df198dc50d02d0d371f7293442b489a10d0d0 *14cc9038a6c7810883c8f0c9b34947c2d184fd2e3f8869a061169a9f92477f68c0a18b2dca48bf *484f44015235523e0a6fd99f87b7f9021102940204c372949aca41e68ab819fccea317432e2249 *c33ee7fe08bcfd2d5120a7786de208d8f8f54b11052adf298a57fe345120716ed6d559b465a737 *79200af857e1edc57f2b51e0fb63f257120512c9a8dcac60e2ba975225aa9e239b4d0e7b569cdc *86eaa661f5bbdb7cdd1b083b73ebe6725375b9dcb12d2be7cd51a0f5eb9d4b56dd1f926354f3b6 *8d567bb7d0abd3b3ab9494e17eb21af4d7d1ae6635bb4a73781172936dab18ad0ec35175689cb7 *6ab6b6dbea5323b22bce395b55b4a2ea05d3b8b5ee8c14abcb727639231e59a5672e07d7eea0b4 *5c09eab0ba539aa3d82ad64ce7129f8276adb8933bedbadf9f947a05ab7a3a57c5ac18af5d6972 *6a9f1a925d8a67fd5961185c957db336179463b325e9f3d9783fd9f68bf5e5ed56daac2a237723 *8eaf45c95b19f169ddead4b36d331eeb4ad4bab252a3512f97faf6762d86ed8cd01ee4cf5e8dcd *1b797de0ca5a21deac59b01e54e4e972372939f3383a9583edd0992d7bf57c70fc3e51e0d41b37 *476171562b6e3b13dfca4e2f0db5e7b1ed6e7a2c5bab5af116cd3b622e773c0db7d361726d0b72 *cf3292e53c9cafd465c62d2641c6b0ab8951d632edb5a934c46bbf3d2eadbd1eb39be765efdcb9 *5e6fe3a0d8d6cab652934a8b8650512e815d558b5a34b6bcbdd7284566ab9e5fb706a262076a2d *c3f8a2c848923d5b8f67fbfaf2ba5d79036d7c2d44c5653669d975415595e3e620fb258b652e8b *955aabfb85427b514fe26862f582b6ddbc39e3cec4926a461294cf468b0fb2680737e7b6f46eb6 *ba1724715db0db5e4663d5b173ab3a46d13d967797f360b7d32ffdadbf8ba441e3a81baba5221e *5b85e349bee6f5ae91acfb5567ef551a429c1b044690d1aede805f53777cbcba3bc75998bbf87a *58cd4ba7c8a8b2d3cf6f7cfe21a2800e11960772c0c3dfd9bf8b2820ffa65a2eff04a200d5fd15 *f1530af8a40f640e4014d0bf7ee0ef200afca94bff958802b0cd209b4b9f8a4124d18f1094ff9d *6aa540d01122c9f78b9112bd990781d451ac514181e356128d81ca240fd25c8885f270f195c22a *5961ba686b646094c281942ad3a9e58c44753a928bd79fca1c8f3faa4879066ab7864d083588c2 *b4c687d50ad16d23ca635094f8da7a47844362807671d2103251655709eff3409a3c170c28bebe *284ea77e0454ca41b33755bb540a4a358f2abb24fea8c12fd2a50b7cf7081c05a4a23a2102783e *f292f8d978e34998909da11c914691fcfbc5693805701cc1522b7991c26903f57e32210da8844f *86928caa48ef17c825aa37514f294ad4322aeb1a7a48d20ba473134123787104b299f150534797 *27d907406696df238e267c98ac48b031f55f9015a813182dbe81825e5c687752f93535a27dabc0 *725ce9be6a9e81f60e43832e3f6d4f47c346ea86099f0b03cdb79ef1641ff0f843a23a1adce471 *b121430f0f6c5b3928e3c70f809bc856e7c57c9060444bedf732e5f1348d001a0ff723d80ef10b *e4b39128d13a1df9fd8c964793df8013ae87b22f3f19be2e687c24785ba05598bfe8be3882e6c3 *7254a623903216fc6fd215c1719f0e5a8f0e05af57e63da44460c2b087118494217fc0171183a7 *2aa93fc16883c81f2f569648a6387f3d5180cf0c0eaa38c056917cd4245aaeaa0b8b2195a61a11 *43505ad4c1b8f7427ac3574088f52f820da4a6fec7e84932215a20a1978bec83004755780d3dca *1c0798d00a328c7c28392e25d903c0666af89608e1f13bcdefb7882624be1a1fbd7bc9938addf7 *591dad4269bb9204bb0b0dac10be6ef9bce1779a7ae291a2fdf2713ef4c4cd4173185fb70aec55 *18b4ba02b0bdf8b5c80a5142a480aec57c2686f0ad8d54726131ebc23b99af4f9aa6207cc968fc *52911df0a1ffc477874799e910f90511d3820f3e71ac52033489561d9f2e0a169e8a0700ff2e9a *318f89001f6df41192a412dd8530354ef661ba15502682e42e421825c9e0343cea04c3e58c722b *016862d8fa43488989100f5071fbf8d17c1876a55a795f6f1ca321a5940743ebbf4f67a2bcd933 *33dc0ebea3f12f953c3a020b690e3ca66018f21a121a44281be2511e44058f44490bf9782eba30 *17a1accac35a55f1a0d5e11fc370d75cc875a898cc3e12437cbb6729e90cfe724f2918f01268d3 *87c00951614c7aceb1542944a631210502483e93094a44cbfeebb4c17ecad24902d9120fda1e6e *ba3ba3d784cf07d21df1e83464e9c9eb8cd40e41fbf03441b03788813e0db78755709907e127ef *fa89c74c7f40ab380717144a9a599ff53cb48a8bb4bfe5f4cf0528b3f0dffcc5a2f5d9e46ff823 *4d151dd22a3ee41fa8004ab15478970ad0fe495480e3a5d47ea3022455bb2fb54f9da12ade2bf4 *e581bd2469e1374fdec45958aa53b02ecea222a696bc5f5ebb097871f1db53fbe89909af4eedf7 *ce6c3a11bfe40a84671b90232592cab001a98f03538c1b85a4b5b0cffd6a76ca41e1de74dad1c0 *946cdfac4d0fd1f4320a0565a3acadc493fbbd43bd93ec6a87916e673bb278de746b6143ac4f99 *26ce722d3b939d9d6aae36636da3d5ce34a5d13ab7cb6c9b7d215bdeac95b27712fbedc3e22c76 *e32c1b0589efcc4362d417cda429b2cb2d5e84e7f3bce7e6a6a7a86edaf2a897c497ec7931f485 *56b77eb6a67661cb2ab93aa9ce75b72f347aadb253c6a006e54be7e094969789965b09db527309 *cec0df78179e2803c2073803173e61aecea2f30d65804fac42e52a90dcf4773903d5a6db710eed *b0d8b46afda5ad18e1d9b96526c120130bcf9c816e6fbdecd5c4f2ac37cdafaab946b67cb839d9 *f568101d16ef5306848f72067e43192875ab37abb91114eb701de60b9b6c279cd6caf5c64c2f34 *d6f5feb2233b37a763b58f71a636506a71cf6a4d276ae638b69b76e558da6d33c36467b2aa2039 *4623b4c78b2133ab6196f52abbb0af6daa15d6bd4cc3aab79b2cfb93eb65b51acb7656ecafc7c7 *d1b83d08068bee7a52df59c1814fe553360eddde30d9e687cc6a2a63712c55f68bcb7a916c33d6 *58ecabcedfce1990344565ecce19087c5532fe6ecec07fde9e00a55ee54fc9aa89a9a0fe87d903 *2424850ffc14f6c0abd3ff9578041ae88128a190b96a4485680e0725a06711c623e26bbc22c29a *93dcf0a036aaa7184b27d422bb54650ad200fab5661719eba5569e0aac663522abf260d4075ce0 *812c038b560f5fe61222589178a0a3ea7038e5e105e9c279503f45a7ad01cef3cb237814b593e0 *1b84d45c900ec85c05a82b8462950adaf62bc27f84fe5c0ef2a82867d2e550824483b414f21964 *a81a526c24bd1849cfa3a126df0d9d7e8b3e9a61038a2949a049023467f48af20275f96010b8e8 *6f8dd00f4ba539914edb03a08c521afcb332d5d31110b7f158d64bd5e720e52b13bbe4ff3c826f *17fb5fc828f8cdaef61ea3e0cb9bfea58c0253a1889bcffcbc45dabf3a348c0d9196186997338a *d3f3fa67ab08cc532410a2abd007b67f8c51f0235ffccef7fe0a8c028ec3f866e1a7be9c3a6d3d *e4d90c40497570885af33dc515ef2dfa1cac1b0f89042fe50b19b44dc8d8beb514bfc26d9a44a7 *4130a3e4040c69a885e601508a483368b02276d1aac4406227df6e08d9a482925e8a8f437aa83c *f66ef911214e2acd832d46fc25b490e9e98688f451da4a40ced632f4b11fd218946cc05d36a13d *af218d2999f4fc48651788452fd1a6461bb189cb7cf838791d41d432c03b191227fc59e832e8f1 *79307e8526bd67deb916ea43ce4a82b04bcab9e2cf42fed431207010e039c42f9c740d60a5ea62 *94e8bf1ebd476924bfe0e0ff6e421e331cc2f53c5e7f420afec3263e1f41ca166171dba2e12a68 *9f0b1c29e73e1b7c2dc0b3d5c851868323654b2243e262fee348d91e511158ec7e41cacd52539d *bc4b9acfe74e05bbefe4be009fbaf015c0a8f164d44e38c0c8dc19e8fd861228c155259dea7b49 *5a5d0579b3d02f36220e74c5663eb713bc75e3ec6facb852aaaa9572753599b369ad94ecbce14a *f4afb9a33b2cceebf36552ed598b376a7b393f5bd4ba56d2e42048a8d88338486156ecad0762c5 *4e3f3c19b6890890bc41a9daf2dbf7a5c69bc2dd0e67e7c9ecc933a8929f7238d566b5376641cf *265641d2b8f52f8d5e31a5f2f3d7885590340b15bcc851b2e874da17fb8dba7f39159faebf50b4 *9c02bbd7fedb34428a505f3f9f5a5d6cb4fb92816faf9456f15836af7e9e4dc79be5d45f0fd6f5 *398750a5d5899fe5adc2c74a180f2b71edc12c349f387eade4ec2a059b9ff672facd5d9af6d20f *af2605fbc6116349b8cb87efbf7de3b3a7d2eaecfd8fbc2b5b521b5bb6effa8a7e3c272ac2681e *1c711f3423408098c54b8766e619047cfddd990217506097db8e73baef8de876d92a09499baddc *ca952bd71a6b5a3c682d43ae02dc87ac0ab76d642b98489af361d29897fab6acc2eff5ac8ab5ee *4d97a9ad5b557bbb5f4f1c35ea59736f4d55e943eb90efaa1d5fda65e560369462de73b5b3b71d *2df3faae535598645f0efcfab051b3578c6c9e978d32b3e7cadb12c943bd84dafaf66a3260f9b3 *bdaba9255337eaa7cdaaab4ed5b242cfaa76acebf3f3583d30232e897b1137cd396910ccdb1b12 *94ed596f3fa0dc997668466371989d27a51acbb7238b1d77a7c352a42f0ffe7c323c95ec85743c *da7d9daf25d3ed69a8b1c3c5becbaf159e99f73ad4a073ee2f6ab566d56b0a35b1e56d772de79c *754f3d7fa36ce72dd7d8b77d8d1b84a9f226e8562f1b75d4d5db60e7acecb9cd9fbb25aabc1c92 *a571d93b24b23a1975c73d2d52a77ad039a84225a8d8a53733ed2c863d3df7843ac7caf3b3ecfa *4ebf32f738a3cf446a99e2af4ae89c974713b5a565b36c34cdb4d16104236f92e74057d5282f17 *80c044d3b2dc5aaadd5ed2d6e896ad5287ddb8b2f7c613379d8f2aeab4bf1fa879d9c39d1b9ae6 *9b96359866b1d9ca6a923f0ea7cef25c16966daf626d663900058fc93e49eef950b77c8624fb62 *5de7731264cce93318eec283a0fadd64ebf8edaa25cfa371cf4df64bddb2b7bedc9988c7456d28 *1f5795d8b63d9d575c5bd7ac516a372755813eaa9cc6d26b77492d9b6d693eaf9fa53e37abee0e *3bab3add1c277e8bd60f1b8ddfcfd89510d943a66f1e7add6a945952e8b4ab4b8e568f87922038 *1e35925471173562ad13b597724a93e7b7b732a6fd39e38a8e503eae9dea385892593998eacee6 *b45eed823d27a9dd81342ed37546a652ee50da1ccf4d61b72d6f7a52381a725e35a7cf6cde6909 *d3996a9e76ecdb595a2d9c69d38a787febf478a7ab6c3ab924d6e7699dd24a35f27e6a8cb9ddbc *545dbff123de1f35d54e7527b496a92ccbe2703268344bdbbc3ef3645da8f5ab821d2aea3e678d *209af54ed4a17bb416735b3cf06d6d9a355bf47c261fbdffb402bcc28bb4a08817014459e44245 *fc3d02888dffb95973319dcff3fc4bf2beada437db7fe21a3c5e44cbcdea0b40d39b24fdf2c7bf *66e3f978b7fd63360ec22fffc663ff15fd1bded5953f6e17f21aec96c4c803b8ddfe3e4e90a0bc *bf5763d1fdfde63e0581408e20154dddc505fc08028103f0a5901c401207e53904f2f71f9d7f10 *53228851ab2b84376192fccb22be4ee3cb21104d25a8b430a817ffbcae1da0dd13d6eec2140bd9 *017ca09c207b96069401dae325a8683dfd0449be183d491cd47922198b7b34549305ec802e28be *4555f7797d5f4638007b8119b46c82aa2076cbd268924b5e80c9d999e465553ac1cc8241813350 *1cc0bc006c7db0d6044536bc47924aa42f6aeb34fa3bc5585622f70b62a1e8bc44decc25f49801 *c12face6b12f309a1045cdc800822d0ee22c0a16cd48ee93a02527e85a4a50a97bf55d046827c4 *60ad52417721929870ec4514a3d02c0b3183a05fc86b2668f015e25d17b2fe5010c7cc14caa7c8 *be80fa670c1b9f5f0376f8b329da7fa6d09f2231702ca03c45138d82e2fbca4b475d090badc0d6 *e691de90225e86057da130d545c906258289fa1c274a619069b4ed225712204f83ec0cd89f0c15 *48102547b363f905f7060c8859186728022730fe204b2a41261e63b61563c205de0caf644669f8 *2e38cceb53cc16c9a90b89045069e760c692a48f41d5d4e7fc9f18903250eb2b644152984ee4b1 *62b09e28f008c315d66aaf9e0bd47fa7b10348c4b27f883e60a067c1a1b399804f1c03fb3cfd04 *20a5a4d8e58dda1611367091340dc833226ad5a1715c2cbce4bd90414bfef636c40f27fd693089 *4c029387a861305034077702f3ab21c343a2e12c5111adb014485fd9c2854d845f49f4af8149bf *72e2dbcff9341af4e5cb971efcea171121011bdf8208e6928c580499cc101310560637b1042295 *8c0f1109e99178a7a8c8236f82046a053bec24a4a800bf0bc10d117d94c9234626392dc22830c8 *9db9656788889b93c5853c056480689cc9e0488e82b9ac0c60548ae28c4a003bdf4a5824688b07 *4b4600d12041e5a0007dcd2214c365905f43fe9920fb460eefc4888164950021ad50de11c44b31 *833cd1e00427a32d1dc61f061dc065244adcc2594c084c96423608d87428b64016bb5080275441 *cb194e82c301e191ee0e67b0792746b9160e678352086804806e91109122c345467a0b596b645c *8edfd13034b4a6d19d3a446a5f2022b130c19048c3500829847a19c92631aec5b7f40a092f9e44 *75d0a048b11481a314e02a1f8717a59b6200e9f84eba2446c951e08989a8714c23fe16c21797a2 *db64729d42055391847ae6e6e2439c4e1246301e957ac89fa07914c0b7068d45315c498a7c361a *f5226e6d75e20408382176a406d77b949142023aa4285e1316a22228030de4ba5b195004f7c80a *cea14f4682c4d418358f521a157f503f1ad04b11a58870e3fbc873b086c6883192c75e42b22254 *b604984e647a93e7855c9b8ce1408156a03b282f46ba233c29c23da077c1f09a24e7592eb037e8 *0728de47e88ed6a1bec65ae81ea27d55c1a315fc309482326580d0ae6e80822eb9288bff09e84e *eae824070edea13bb5d1929edae9e9dae941eb8002b103cb50dbd7de159dbe47a1dc6e96b72ee6 *db96a1703117ed8737f810351c78078f3dae60e380ae6b037ab61fcee583c7689de7b015c079cc *2a2ebb5968cf46943fe65fe27a9f81f5a817b81e390bd906267f830a1df4872b9fb5c84f657fef *787d35f3eb9839d831343a0eed9eb52bae77d9d6c56dae53ae3c218174a95b30f4110b6d1b9a7d *c5429b2fb0508a0c046c4c3dda4adb7d611e9e002075b3a02f4c42ae9293411b276ded34ecfb7b *e711179d9833eaaf627e57c8ef11c2cdae5fe915207d858f5e4545a8efab8a184e63354bdc569a *6ef4f8302d1fa676aa58cb734767657bd929694b4a5c769405d713ceb25ded0edb872313192db6 *9d6c7c27ecef56a53a372aefcf896faec2c671545724c5715dcb5e358642efadb93f52c2d94832 *a92a360fe5deb8b39546e17a1debe7b7e6d9da6f04bb17666157a3995acd1a966db5d56633de9b *4aca645a398c38fe3ca7d47567de61246e9c5f54451235cfb272745515f9282a829d5517c6505b *a7d4d61464487a64a24c974e7944fe4f564e3924fff69f4d9cc77943fdecc4799c37d4cf4e9cc7 *7943fdecc479dc8ffaf4c4f1e88292e4798699b78cee343fbafa29a3aa6b75391a0f9771b99537 *c6f201c0f127d878bbf3edfebd636d5e3f8586bac178506ea926b4e365aa8c4104ac57dc8929b8 *13efec5a6bcd383be4b19e82f3ca89fc3cd50d37ef4f0aba55d9934d0a0152cfff00901e9bfba8 *3ad80fcedd53bfd410c2adbc1ec6cebe274ef33b7c94b2dc8eb4d067d24c66dcd9e1bcef4bcdea *7cd0aecd9295ebaa394e1833f72c577535359581107669cd1b2a1a6daae40af25c1f6dcddec4db *939d74ada2def5ef218c8b943c536d8a62558ee3b99af793e661b32e9b8144adac7d33a92cdbed *ca42508c4162187e599d6fbdc672dacd86f971b5389dbcb0b216f2485b760fc2e2d49566dbf530 *3f8ba36eeb7ca6f293602a92b668add76da17308cadab4db308c1ebf768e95b67494cc2e2fa599 *dd57eb677fa37aaeafa807b6930d0cc9ea1c4b01654e9ba54ec3b72beb7168072bb3590e4e8346 *fe9f461f394512645abca08f34a730c98f54553e694759308c7e08b2a11ff39fbafa27605b80b9 *7d80db6ed1b6bf00b6e1095e616e9f87221b24956258103960c1d6f7c750e4fb01021ef01a8afc *a78dd53f88fa15a1c3b682663150ea9720c380945142773c14d84b50bff4398493c2ab31498038 *1eaadc31f2d1496603f67c34362405979e21e505282809282598c281328a142a48ac07693d64e7 *f3d80344debe83d7ad4b2457135019852404242793107d21692568ecc990a229c8897f29bec221 *fdac50bf8b004f12109b847eb204f28014dbbf482a9cbc8057c92171d11c83ba08244902d2bc00 *491217c27f20ae834a84d22b8817c5128a160231b9746b2802fc9da4d73132110a08997d012b92 *1c17c872322449028b4ea009f66c7090b290f49a7c9b0a8a8bc62fbe0b39420e1e0b692b247f68 *5191426efd7f9efa75f394977e3db2947e10584a3f1557beb1cc1e6fa2db72be8e76bbd5d752e9 *c305b76a978b66be449bd9ef24a8bd0af47704b5c79d3e04f79bebf82f12d4741e8ce7151d4021 *4903249fa4d0bc0ef1c2d241678664da1a072c326088f1c09021cfa4a9927d7e0d53fc95133f39 *efdf83a0f6dd171f0e65c148884fd14a592c646d1057e1101d4a8ae63311023754139003f60e6a *c900123248fd5210ed4ff98b0d30846cf1d28127a2ee1959d2c0b4f826d4ca0863427b16229924 *4cf368c92ca2962c1c8b82ce24bc924f266b152b40d4fe7638ac1fb84c02bf16c9c160908672cf *11aacdf03c04ca102970e416827b29ea043f2dc61b64f0c238199619686b430c9043cf6316978d *04e1a65b826f820d85a0368c7dc412caae86c8ca230702530eb5e0c8329914c63fc99dda0f8f1d *c171317a1cf6e715811e45de03f922744eae193cdb90b27c5bf40115d9e8299cf5394ada4728cb *b0be5a2c962dc90cd7c104c714015c23ff04da19d64b4ce5ab2e40379769fe049405da36e4d7ef *fd5af4a6ed9d9fb3d0f2f3cf42599d6ddeb8b6de9c2b2fa0ac97b0d53ddbea19d98afa24f222ba *46764da08fad872bc8ba6c6f52a8c540023d9c45e31f43580582a532943be91eeb1355a81b5708 *4b658a6d2e6e739db2f13d24827a066135ceaa7045e7dcc52b3a5f013a501f500792c7dee27dfe *985fb9ed6eeee4d726a87ce99fa619f632b5358bbaff64cdc583edded4ed2cf3867a010cce96f5 *b05f67d8af17ed565da0abcd7ba7cf42578fc815f5005dd5ab8e4bf7b47d45cedf0e75c13c9644 *f9e8bbf3a55873bca0c1a682e0b2b2b79aeee994d1b4a84439745c3fb6a361d6f6dd5ed9a98f75 *6e0814a985743a477143b53b4a79b8d8bbf5f6a4bdf73669a5be8e989926648355409f538ecaa7 *1bbf3a74e6c37a793ab7735175364cbdb29bbd35b889d92c297b73e6735523c926b34d169a7dbb *6f0bbd5a38f72ec815a5c61140579def4257ade937e84a6d01d465ba647e244ba71c52e40f7fe5 *9401ca6a7f06ba7a9c2fd46727ccabf9427d76c2bc9a2fd46727ccabf9427d0eb29a6715519d8d *c6f50f8815f504b2c201ba85ab3ea05546f754ef98ac6b4c69ea06aecaeb1d87713b7edee87877 *70d52bb44ad6e23165325d655b92abaa7d90ba4e7b20bf31635a5bded3f99aeac01fd57bcdb059 *d2336df3c6e8e6acd4dcf93b35a03e03577d0fadba76905a57b86a5acf73f5b09ac66e75a1af7b *b2e3d3b4254ea4562e952a8353ddcc3792501933127fe68f2db54e2942f54d8e9a3d66d85b6bb5 *edf63cf6d961941d8ffb74df7cab0f62bf259a8962778e139a16c6d2da894efb458d6d361c65a1 *4431c546f5cce38fbe31aef66b6c7552d3dec48d3738accf157e246adde8386706ea40e84e845d *addbad29f9ba23ee69fb2d74fed368152b8902cd49a82dc4497c10b33cf75bfbf93ec109fbed74 *b087b78d5f05aadce0f4072bfcc1a02523ff09a0eafd000e0ff80d40d57f7d94fe4910550c5401 *19312620e4a043648a8ab801c23d206bc1c06bed73ae5401a9d0c07c002d17198bfe053885b014 *94f8d172e225eb0cc96021f622423f249282483ac32238c5a3340d28732850147e0eee20198c5c *bc84ca0a3272b462050d32f0b5bc2071851cf0b89e7e428ced4b0cca5df0d285bb2547a88c8a3e *114094c24e4bf605c0048c08e4740934206e327a3a006ac6c118824c134a27c5afb97385b7a8c8 *5f34641419342480fe47635a27a0e1688842ca2fba13c13e8383c1275f567ae5bf81cf45846e46 *e848caa1f0d1ab910c518703a86e0cdc32195230a90296d4ff7b88ea8731e56751a94f4594bf0a *4e919fbf1d997a15d9ef90a9c79dfea6c89445439411d10c06445d0c80832c0bcd9349f0d2003e *1250904b91c0f9c444a558831ca5fe1a32f52b277e72debf0732f5fd971c05a5ec386ca64d31d8 *4b58ce082488a9810088117bd5d3625012ec560d8ec463e037216844f694b1c39a2efaaff94b4b *25b44e46101741c6ecdeb427bdea22a5a8341c631ba2828a518573313079d15d8b437e2e946c6e *259c50b428c1da0109ae02f26765b46002bb2a541a03044806c00c18a9327ce6b7c30324587158 *b6009f68e400262c109915943a6370a52a8851d0d31941c07e27caa1481848fca4300d80d617c1 *b21662c33e8d371ea071b384270a90b6f48eeaa15f0f74d647b073aa40e5824bb00d3f06188c46 *e3231afd884029104db7de870eb48a28ca5cefc76970fcd636f91490fa0843a90aa04caafc5541 *da14b91693fbaa21c70accfd8cafa60c68236701ffcc347e4236c881ec78797a87a192f2a1fcdc *41a8f94c36081a9eaed971b935b098a03f1c2586b977f5fc8a16cdbe6dd7352f9af776c1a0b783 *1494bac941674f811e43e5dd897772275dda9dd42f6e42efdb28d8e89a32da09ddb9099124dff8 *d692185bd1a0474e64f16e9bcf6bea25bb3ef52ceafa0bc7829c9ca4d37dfaa109b0fb88a4a4b7 *480a754302aa039232f61049692cbda0a16d7347976d7b5de733c6a31bb4c7998bb7d59a0d9bba *3b8dd5905f3bd44a9d2b0d3d8f85ed61be6abaaca86c3687e671bacd53b6169ed6e7953c6cdba3 *6aa9d91fb7067cc56cf69b5b7a1639b92f88a3468ddaab87fab4c5b00365ca2dbb1d692018a7a1 *d4acdb959951e6fc7690d74e33dfe53db9c6fa934ef53418c503a5e6ef579bd261a465543fbf74 *d1f18ea6836c1049b1a3226b4e357b990786365fdaedcc5fb732d7e23f0c36f5d9d17e35d8d4cb *d17e064368cb224d57bd8eabd9081a506e27cb1b86432689c3d4c9a4fe0c6a6025e2a96acd37e1 *7ec053677eaf297a67b499288c2d64f7a88136d86fc7a3e19a95666fee5b2d4bbd291ff0a5b8b5 *f7afa00175871a648fa801b98de3d6ea4ddcbd6bbb869a85ea231c477d9301aad1b5859efc2f75 *57d69d36d62ddff52bfa9dbb3e24a1d16f929018c53cbf69649ec1807efd3dbb846dec40da8993 *f48a573aed600347e2e8a8eaecda551b43dfaf73e5e9a6ade75bb36db42e2cb62da99c9cf5f344 *ab4e2b516d922d6fab835a6bbe396666dd225790862545ce4eb78d65d86cf3ca6e710e0e0b8d37 *ebcf5a65699d32b9ce7c122d16f5b27f7482b8108a6efb79b8591795c33e0e77156e6036eaca7e *b5b37a89136482b6110e46dd53144946a6af958efc91ef955692ef147afdf145f61d237b2efde1 *5d033ec7809278d5b8c89110c5c2af4d0eba2ed020b5df2cd63707f4136cde388ea9a12d6dd610 *73ff6e02f4f109ff6e02f4f3a3ff9b5836aa5a140604c101f948a04f8a64192812317626f20f9d *78c943314286261c6a88567b846048cb0d0304723454a950a53c121f4006efa17dc287c18d08d7 *4946ee02245cb01fc5e0e9d103bf50c670d98f188f8e0310f61c74e6c89d4d55f4ec18d9c0283c *ea511a914614983d3d4ea336110dcb239c95fac5627a4d62ac0171fffbe7019b4454ca44a39c9f *9e436470b0635115d2ed93e5a7fad03f962a893efd1a43a5310c84e904a2e7823c1a91aaa9a29d *4179e49b8a3c11862069cf0466b601809d0237d70091a3e488123e0c600e45da07a0800f8f70ad *0f1d8942f6a5df61d93fd964f4755e9c5e92d9cf5e9dbfd2b4e7ca29ff754db97987ff32e04726 *658129c2e096215f93e2756c99c2742c8724069af0e448b483640b4f864dc89742344dc619be18 *f0f38537bef3bebf9d53520356ee7f7cf01552e9c37c4c8794ce43a364888833c6341905a35032 *1fbd3b02adb81e48a57073f3963d5a33229e5e214622195b008887a6842b420b547cddd4f4d1c0 *2add302309fee5d47323a3bdd8a7559c472e1cadcd22382c5aa3a8a924a46dbc5b4b6cb6c2c9e8 *fa622b045b33180f8d60712b7ae831e56989621c3982a175048b9d5bc102d9f0a087929cd415a4 *15c04d8e5a5ae1532e80152a01cce23c5a93e41b559b8038e9080b55040b1f995a6a88a145e8b8 *e221ae0bd1c4c6230729bae98ce46322a4317f0d91a38d5bd854b303672721f5114ff3d303b8d3 *b2476e03ee28595e7b2395d75db07b9cf25b4ac9566bcb243e69a55d53ecfc18b4a9a99b34fb05 *9532b6a88bd07cb2ada7fc0f34e9e44be4afb35ebe51ca50e593bbca06b3fe2394f2e05afb174a *39bfa194afd5cdef5309531ae43b73c9cd8f1975b4c55ade16dcde9a3d66bf7b8c630f9e3ab36f *7352edbc517fd15b987cef1cf617cbe1607cae76d2ea265580cb76efcc5d7ff0a66e785f6cfd40 *742d73f5e1dc70571f1973d6344ee3e1dca25ae2a9279efb85a0343c2ae3e5948fad82d8720ad3 *a1355133e2b8f56c4bad692968b46257893933b2242336ebb57a329d6ebaf6a8929c3da1169b7e *a33a92ac6c735ca9670fbc6945c9c4305b8d6ce3f994af09f9e362bf935a19830bcaf35e4f76fb *5a3333f076b1e5596e90d8c2c8ad9c5bc5d9f1b9a2fbc721df53cfe122eed6aab3aea129d37a94 *751ab9f1599d5b1cf25f3cb238419b88e3168d17b7d98d5b084e23cf9cad0b85f92031c33b35f7 *26f79539405380fb0a9d2436c9313a79713b43deed74cf9fa193edfa689d693fb7f79bc1a0a58f *675cc9341bae3c6daef4e67b3a69cf965e63bee377959ec0c7c3d285bd75521fcecbd9ee6d0d9a *fb0a9d34afea0ed37066f54ab4d3745d1192714576d4bec3fbab99541eb8e58e5d332a5edb5f65 *c4f9b21e75cb83d672999ddba13c9bf49521a76e67d9fe7ed6e9f9e565d08ba39355dc35dadb55 *899f9b66696445d9e4182ba57e77d75b8df49a2126fb65bf5a5a878978748ae184139ed7dbd134 *1ae7e3ed2a10926dd028744bfd9e3dc8ee34f5b2586fbd4a318a7459e5337b3317487f9c4e6abc *240869115a0ea3580ae2df4e275f96e95fc026452a0e503c82f0493679f3849f63939f1afcdf44 *26056217be405bc5ec96c87007e31e1172f818a360704340ebaff2384a44407f2ff94178d4a61e *47d0b34bc41e05180bb21714df27f3dd7e3154a50657be479bd0f0c560a88181026a6b974864c9 *40100323fa23420b677b0fe04b41f3b68c972232e6d34169d05c4a22150dee13da74d808b36110 *86de11314decd024e4b290e32c0f439307e74142d886eca3cb5da093469a499e782039f3a36e2d *a06ecd3f20723aac4c7cf56a41c858ab803803099928399e0e9094acd13bb5ebed9717c31d0680 *8ebc1165840ea4e02ba64250081700f6cda331e440ec197063a74b402f08fb38281057ff3bc8e4 *f72ecedfc525bfb7a2dcbcc37fc825199eb61173e3e84fa2f9941709e0b28b29afd23e4f1e734d *84445982c92abb94a9ffc421d4fb252ef99537bef3be7f05979461a823626389160e58a8fab05e *e021fd60cc82fd93c285208b8872ef08113b3bec9a1711d0ca2336ce8393076388e4699a7e9f43 *af134fa7324430d7ebd3d99a4b2d600252b273f42eec89ba764de78e635291041ad51619abf261 *5a732b639131da80a7f59ab1b9d4159c115e117b69b438c24b89ada4698c4a8451bd1528455ae3 *28360a06570a6c75243857b1354b8428dec7ce820acb7146636f85ffc43d055abf181716d33472 *54217984627988692185bb871030749f89378357901fc256ba18673e82e99102fece06a621a896 *b298f0b784d6b9db781e1a12e392858efd8f7561e828f593be06c45228dc7794f37732610d2ac7 *e77398fdf053912daabce744ca363135ba1ed8b26e6b14959c373fcf2ead3e15a80206c1c785c5 *37a0d7e81a6eb17ba71ac820fa7898e7d202955eecd9c414f44bc088c1552f7d2e27c6e2d59861 *1e765b6d331ff5cb8b60718d77756acf9c5fec41951e5c4ee3765f9e5567f6ccb55e7bc4bd96d0 *7218df9387cbdee5250ba3259e9f874b675f72caec0572cd9740148a694d28cb82b22bae8128e9 *633357c0633353b8479087ae397c21478deb3b3e072b9331ca5433efb68353f93579434e0f37b7 *988e06e5eeb5f1deecf8e25980c5e9cadd97ecc5717891cea5c498bcf8c716ee9d033bdc73be58 *a6e00fc4b47e2c87deaf865abdbc62899a63054a7157e4a66e2e744ed2715fee340b095fd7371d *63bae914cdfdb4b9d0a6d2c8dc28f1f2a4753376ae52ac8d63b532e89ea2b89b5d1cfae54e9bdb *49c2615a880cf9285e16817e7183eda258ac2803a3ba1ad9d555c69bef85d9bab62b09d676da34 *eb9117344e05a7771286137e2071bcd4dfce19e5990cccd238afb59d20940fa6e65493c37479f5 *14bd37b9d2988edc8e2b9c569bc161d112c5603af49adb863dc9498aa96d0e72b29e34f3934e4e *dd9ea4d379e8f65dc9ee586559add96adc7427bca02e742ed76889bd81e80f85e65089f35b4db8 *9cc5e181f1ab95b1e82a4ae63098c68dde7ae867eaaad11f0c84e34950ea4ecd6dce3727bec12d *468de78bdc19ae26997050ea1dcecaf6d8396bd34320f676fe769534963b2bb7c9fed12cd07f24 *11bf2078f2afec3cc7a2b4de6dd63b48ba40483e2c54edf502f869ff7fec5082ff4173fa9db5ec *f5b83e43b3841c3105b290e33f47b3d81344e4f2f1fc2768d6ef3bbabf8887e98877f790f04161 *62d84d8e34d2063100ae21de2d842dfcfd578868bb9952e92564d9e1e64d522705f9f2907dd237 *ea3b51ceed5790822f15a688300d13e0b6a746d08e06c4ab2284ad890f4a722a84470453e0007f *ddf08d9120af138364b77f1a9ef830ca50839398a65d495ba45c8dbf0815c5a47962a82880cc4b *78d059ad421d45122591780c3916e21b0ae883d1228317a4830de9f6ff680cec299e077b380125 *42982be662faa70632c7e358b4079f8504556d08f8e5410e45219b085264c08581620d41858248 *d4f0fe6701b0e223d09311598a7df38946eb3fcac37e7ce92127379fe60ff160780d107d1408c3 *918fa54810cd93089fe568f31d818737cc9e4d60c6e6c9032d22b846885022f443de8f21d168cf *47ca1f4fc4540327be3534d30408f210aec8202663ff128cd424d81fa812023d7594220212c951 *95f6e61cb2c749d59c83f85ca3f153989e47c568aa9108742c9a4f9f2ff9e9e9745ddc6e2a4830 *d963f0316df654515c66004e81512439b842fa46733bf550e5693c6fc79e1ea644557536793ccc *13aa70c08b9581ce001e9e218e8ef4e4e1bb520a81f590ae500f059eb4155414af1523f6225e08 *ad9e4a0c81e6b34f55abb763274b856ff06bd9db782b2c8a3fd1fb6953f9cf71a82c2d1a281c61 *f9d04d5a024c369b0d02b09a443857fb81de4fcba69cfac1da32bad23daf9b53f78375597b619c *8b89115e3dc0d61d67fe1e62b697ce69d897de705cc7885f71dc0738cab5e74eb3d995c6dda5fe *4ca661cd5bb15dbe79aa25dd9c9b36559edc048f5ddca42bd363ae639fb977f07abe69ba2d2ddd *e026747d1e7d408c9b4950708e55cb2cfb4b974153fbc4155ff6e0cf938fbf6c766da74e48d9a7 *143964f4691fcf1169a5a8c38aa78cbe729ad1171db2eea66817bd72b61fede5a25b884b4eb518 *7a426cc8c55de6b2ec15fbeb734358ec327189dbfbcebe96efd7747531ef5dc6d5528fa19f861a *449652684dca6e7cb6e35cb9ae0f5479b92c79d221733eb4c37a538c1cd970466beeb815f6c5cb *492d6af3fdccae9f4cbbba1d0feacb6456135a4db1d21a949eb78bb0271b71be99290bf571466b *d42c3bd9ed9e8db16b7286613ff4393a28a3f9fa74311a66628b75d9ac67fa854d591e0fc2a1e9 *6e27db91c58fb9c0b694602e2f33e370d119d7eb5656e84b155e2d55824b66576a17d7f9b878ac *2905f73c10337eb956c83f87d1bee91cac7975951f7265ab2e6d0661d27c9e17eb07def48d69c7 *4cba4bdbea8d2bb15696fbedd8f3e7ecef5a906bb766ad8d5bdb3bae18fae752a9ba1f718775b6 *597ae6ff6cdcfc3faa463f977e91b551b94110ece38a7103b36e7f64348cdaeb62f23aeecf40c8 *7f2472bea55be72721247bc20d84e4738f20e4d7c7ff1781441fb6a0714020880c64f8ab1d751c *d2cd99219a48a2bbee2388478a77182708083ff7a181273b6495105984fb36753ec9b459741f98 *605398dd093c34630508e7617f0821c2e34143389daf3ff4e496811fd98d4b14d0d2840c38da7c *0f60440afb67099a29e911c48b69838b6c120218e6401be547b45fa46bf06b475a70143c2c5a48 *481dd7e1361aa506ae88ef55b4ab185e81309ea1c5475beda99c83fd8216d0dd9102e153a4e9a1 *5b2b8788e588a08dfa00e291601e120b09dea564cb8dbc260667223808053984d9890f5f2187fc *791fd83c44974700fcf2ddf4b75f0312691ea2bd8c411e4abe432a36952b806e222496b35317c9 *1024c2124ab9d9e49431fd085c43dc923ab88b2182a1783864a4c951f84c191ca364a7f7308d47 *5020751cc03038826d3fed31f2848f72e80d490d83c9509c7f67a3c41e8910ba27c0c99ef63c21 *5a641f289bc36c9cb449280305f3844fd9b9f56e26339ba264f2ad11c4632b14c5cbcb848253b7 *7e86cbd868d947931693146833f51b844b3f95890db01717657a3b1139dc04b765d867c544177c *58114bfa15babe3e9dbdac88907609d95694fdccc3ae58a131fb80e4ec24f8b009615452836fee *dbe02955f00148fcb9f0aa3bb0314f0d19ec8f29c1decb7c52f34f968da61de3c950e8f82d85a0 *a56431aef703b011bd1ac313838ddf4022c0c6feec8bb0b13233d62fb0b1d47d041bef98767c84 *90ecffa29b94df4148ee0d43aecf3f0321b9370cb93e555edc0e2ece0308595b0c73bdcba86d76 *4683b2381a94c6dc233cf90d9cac9c966ba520f9e2cea89a55594c6c677e8c752e73689b87eaac *5739f49b9967333f8a4f6d27d8ed457531c9cd6ab31a9f7936f2e7ec7c16f8856263b14a2e25ad *b5eeb41ab2aceddd25b7686a55ad2c75cd8bb3ef69e5f09429b7f6ae581d68423c99cda46814c8 *6a7d9aed4e95f360bbddecd6c9413dc4a503fb74a66a53e6e6b383366e07c5c2d8b1abfc222955 *fd32e1c9efc149cf1454fb287b517b7ee62ee3c27e2a580c4ecef746e324152649f674189cecac *e46f929530363bbb6ebc336683a35d1096c77da7d7f2b77646383fefd76546b1a44adf5a1cebe7 *863e5d6bc1411e97d49c66b747f1a4239414b72589932a3be7c769bdbe9b6cd752f754b3ea7a5d *ce4456d68c561d6ea0d52a1bd5d70f82d86cc7536fbf15969b75c9982bf2387b31fe349cd40127 *ff4df6f1dbe0e437cbceeb017c16576a69e2ed7f8d2b1f1ec85f0430c94e52a1bbba27601330a6 *9b33d5030398f2eb28e509b409725fc3205ed32b690f05c6eb24ead4683f45c4ae0a09e53d483b *1ea841a8233db86e8d3190cb401c7b471f3de421f094821e78297eb887c8038c3090c80693839c *96d4b888b4d46140af21df5180eeff3e34032065a830166119a65c376779884074142dd96d5cc4 *edfd11c80d90be1000c1c9c2539ad9a9a15b20006265c8888cef1feda5eac8aa49b5281a6d3fc9 *22767805da92a31d22441f930de403901b211d27001616e1189a6a6cc9295324ac94b201517d57 *05bdfda2b0cc340c390df844b1de27a0f4fb772135f460f83413d88130a2c04e08034ae9fe2f19 *c00538993c76755592d9dc7a6db239c066510e326db27e8be1782ad3c7c73e748a29f5811375f4 *8a40e773dba9c23eaf18d35ec318343859c838e1ecfc33f822a7c69f02f5bf869863d1cdbb7b98 *240c72122c95a12946c28d9fc69a6a28c50bb41b48e60ec8b0896f3e02ba3a24780962a6b111b2 *058b5d92d4228c7a32052fc9e8308e20d7c9d156e0db36222ced7288d1e58149c9cf2e471711bb *7e2348a17828c14308a502a4a8be0d5e450522a469c32630bb600984c2d18f016ae2460a617f76 *503cfc4abdf7d09e5aabf96f002628b7781f50de4d3eb5f354e920d9944100d271c85eced19f2c *068b9d2743240b46c1a05c544dfd0100d92565b63fa7dab97fbf766efcd9da79e49aa797da79ef *5eed3cdda3342ea4dee6aef2edb3dbb1cf2e85920a24df36de1e9b95ceb5c5fa14e4bf556f17f2 *469f7b916fe7f9748864c8c5fe4b933e67f6cab5ba2fe2e2e8de68b8aea8ef431cb39cbca2d196 *742abea0d173ef5db1fd5a6b47a9bc942f9db84fa1cfda7cdfb1a567afb59e4982a7689a629f8c *9511c58ecd0d123776464e76ba1eaf8f56cb494ada3069e93ceff71b4137e9bbf12859acdbdda6 *dbdf8c45631e7bfa73ad1a563b6ea93cce1f1cce2cab76c36daec2c1dec8579c794bed7607c372 *b5dbd90c8f7ccb6d848d85399bad87bdcb30aa1e8dbd9c78c1ba3c5dd732c120f32c739d5c6c25 *05636814f6fc78da4ffe0d7daec576cb3fe70fb2a84c9b73abcb45ae2a39c6ac9599d71d85f76b *f349a7a95ea4436d361f8afeae5c96c61ba53b1ef8d9d9ff5377256b6b63c972cf53f49efb359a *87da0910c3cf2810e34e23336214c3d37766806dfe2ed46d5755fbbaeaf3c2a690908e8ece89cc *8c8c28ee8ff3b9df974da7248acebd34eec4b3416eda14535dea240da1191fd749fb23baea6d73 *d959f537a54aba4d26fbe63c3c3aa53814d60b75393767e26cd99d4e5776b1d76bd74ab9fc75b5 *aacd03d5939d79c5ed8e866154aa6dade38736fbc9e85379708f45d3fff5eae5cf55ebeb2d7d57 *a95ca43f8f4e9eef2c95e3008999538c477f4aa9fcdf6eec6f844f43ecf3ecf21341c6c2e41d5e *827795aaa178877e242323f9485bba80aa1f833bf1491793d1a74978d31419363e9a5bb36adc3e *f23e0a587a06a43a0250a475482df9e83cd545bec2302309cbfa571a83290205069c10151443d9 *601105743abf1e32bccd6abf9515de9c0905d0af10ae11002264b44e09c8b505d086e52a6496c5 *24a8c10218cd84623498c8fbb04aa43d9ff676b65e12398da5668d83cfa3471720878c23085c0b *c0b311aaa52a1ae774c89718194678be0c912b64fae817599104793afa901e4a04755f82f93aa0 *f4fba709f37a56511798f74dc342e79198f7fd3fc7a7eceaa8f0846192bbc0189cc906113a9125 *7ea026725f3415093a71b8f0d9479ed0a5826231dda6a2a1bc8b427988e423f70d868cefd88fcc *405f36faebbe65f140089150a0570c6800c1c79005fdc1efa447f09065211cc7ce9be1a72432fd *b42c3cc38bc7e5710b76c82789a03e4ff85442953c049743f53e89e0d00813dad521d91fe21e69 *1ce8620cb03f1963a287808622825d66a07ce2ddebe0b1d04908bf333315af039d9f0d2203febb *0a2b4c05cafe0a5eabd7091023b329c19954d49f12643a98a0f40ad3bb1c821240a8dc40f25717 *3e4506cc28fd3dcb130ba2fcbdf8b48c26587a7d099f5a360f1e8db75de1a96ae9fc129714be76 *56532ffd617c3a7ed7d0f4cbe2d3fb677c5ab6d5b6bbba742a2ff8943e6bdd27f7cef0d7c5a7ad *efc4a79ddafdd83f36efa7cb4072fbe3c9daea0f371ddbad74b5dca53eeee68fb5b06caaaa2d9b *6e5e4b3a93b6bc981c0a557da54ddb8d5de2dc47d37ca36b1a52c7b486bdfdf650d7d68bab1e95 *96d5dce8306a57e7834921eab49afb0fa7343c5dc59924568bc6743973762bb5adec4563a0caed *92316bb5865add1f948fcdb3b89d25e5a49cd317813f5addd4a3b56c9c7bfbacece85795d67974 *3ead4b5655f31b0bef9ede72d373baecebb3fec76cbc363faa895c8f834db73fb8c4bd791a8e02 *bf52b9af87ba9386f1a6175e8cbbe0d96214a97aa7b79d488a956bd4c2eb789054347f6dcc8ff7 *52af99468dc1d2d34e9259518d70e05413add88b8ec3582e98fbee7d37ce3723e1666fe3425cdd *cd736b4fb906b349dde86eefe589bed0b5b93b9edae599a9fc6c7c2a3c360b53ff4bdbe2fe421c *27ff20401560e3c366a8df0950710076a39f0b50e5bf2340e5ed0c991e09ecac00856dded9515c *34a1d6a70a9cd67a9f38d4d0b60164c5b4c947160aec47febb88b2628caa7986f2271be43c2897 *3e830101e9193a2a02c4f2e143cd05da88334c59f0d243e7bf025366132081000fa775917ff551 *da5415ce0dbf4f03470c1bd8ac48e3cd97a0820e444d3fadc2959575f7e0e32c66c0cb18eaa306 *34143c8c182b0bf80cad43a0051fc78a71a6dd11978761206bcafc872ec043f295537d5f8bb570 *05cdf2fea6dddd7bf815015dd3d3f49105e4ac1e7c2be8581a4909f9bff767f0f839fa26f80106 *ec5011b0187f4902f53faf380f70e985e89211189d4726327810a3a1fb89d1fd43dfa18156207f *f33a2959065765581f03e67a10c3600b5b20fb18710b4dc718d8872604e7f65fc65143af220739 *2a28a402bea343fe55858223cc6e158440ccb60467e4ebe111982c1ab428d8554978f60ce96856 *55bc6702d38781ab0109a4578ca8404922441b16e1e3108625f40ef8e04fb3ae50c89727884f95 *610e7b5e143538c70e99dd18561c14d131c655396fcc7eed21f30b68ac747c81bd93bd4f6ecacc *d444be9d1584a1e4110b304141b99e59a412a4168da77dbb297ed2b420fc1846ef11aaf2bd0855 *06778450775164736b1bf61dfc7791e742c962e58b92ce63cf8d49c20f685b0c99b9b91418a126 *7f2b842a7c46a877fbde66cb572054ee42e2cfea7746adf4d92f8b501d42a8337bf1bee3a85e2c *5f60edd0b012b67f2869dbfec73936779b6e795d3a7aadbd6f76e55cdad08eade1616c4f8bb5f3 *549836d3edbd7a6bcc2ef9eaf67c748df16c3fe8ab73af7ff357b5821b1805adb3685f8fcdf155 *9edfa64eee52513bfbd262aecdc39d2bc855cbd1bdcd4ca80e1793e169df0ba3e5285d46a23248 *7cb5d338dfadb0eb15a7de9550e6e1d2a89e7315b1ab39f7d52c180d969224dba7b334e94dba63 *21f517fb51aae7c7e3966e8c0ec174226aed7c67353d27766d109f0cc55d6ecef7dc7a1b8dab3b *3bbddeaebb4d6c751b9b99b5a94dedaa724984f3b963d63b42ac39ebf1e6a24bc13411475545ac *28d7a23ef457e5613f37948f63facee95ca47b2baff283631a1b95db75ea9fd7f6a1ef4c74f3ba *759b45e9603afddd285f5c1eec463e6df38fb84ebacefd47503da3276277d25a3dfee8fbbbf5c2 *ed7d743b49ad23448b28eccf3a6af19893b7f964d8ea26ae6dddd2d6f258eb8ca707bba415ea97 *c265db09ccaabb97b5edc95da7756b543e774662f9a3d02eec67cb7e61a5a6b94af9a31d478e30 *6b0cc46b7b5a1d341d3d2989eb9a60aee3a5933483d236dc0ad79b23dc2be96456ed5bbd41f358 *bed78aa7f5214e736e23f6daf371f72cc883f5e9567747b789eeafef85c57c9c74c455deda171b *e3ae64ee82dbfcbe11665161eaf6925abb1b69ce721ce586e63510d3b8a25d926db95edd5c4ec5 *c44da5fe485894cdb9d758dea7beee568e5da1a20571d4efdeababd2aad832147f31096c23d79f *d8a79dbf4ccfbba09b968ee146d9de844489dc897fbbec53a939dd5ad55bd24efc6937dfbf4e5c *5734db97e467870084f9d0d265fcaa2180f2832180cc289137c03fd6ce95c999f81fded8cf0901 *244131fe4b08f0f52bd9245d8f3b3ba42f3ddb213a9909efb02385c4a1012b2f7b99d9dd500683 *366010e1c1078d69b23a977f392d06a044e7e7245894019e813508944ac8a906e8dbe2baaec7b9 *b83860b023a01d4cc900ae04f118bba2673b4217120b52c3438d409081b233fd93509e94c13e20 *5844f88800a30417038a6254041d1e02014f84eea2ce097c25631cd8ac0124510182222692906c *ac062b348a1d7c504b0940e91961880c9ab201c8c6228a1243451a1c19b1006b4e8a9cbb0ebd6c *3e8b067e336e810ea1bba02bf790787c44671c2299e0ad6648446aa8de73f314c4367d74b4d1f0 *2ae87ea2c71a42ef9155de32021942eb3192e13a8a0edc46a4f2c5e84841d23d12800dd19d6466 *5c83e943b14e80505f0c899108d22c1187023e2a11f4b0283815b3023a91ab2d81ced11c3d3213 *7d5514874a881399086070a657513243210ee5607e410107f31d1438b02afc82703719a2040d7c *eb30631c02f0b32956d0404d0a95a70fae80ca05c586f47630354362f0fe7e4efafce024a4eb25 *585a885f26333d4439e263039f0733cea8593c9ac8e899b2efa10a993c857f57836f2b3f110407 *1ca7678ca40f21160562363ee45b65bc952c1bf3501ffd32924ac69b2530affa7f1f3fd2cca697 *4744d017984c02a1e5437bd8e42afc4f194a0c4c6786db0ac595af29097a3c1ec2661e9d00098b *47c8a3603d3250c3831c02ad7481c11585d796ce08aa355ef02483c720dacba0f1e8a81bc5285a *44b051a137879ea8f2aa89e8f3390578c9b0dc3eba4fb98b4de7254c07d75ec0748cb12a69f127 *210a16c00de133aca0aa041a0fcd2da6b7a33b811e2133a97cbe4709fd10e2cb2a462b9a06395a *3a56827f4c005a3a3d573a2753984c5ecbe4872290060994d7ea8ec06bbd0a12378567f4ceeb02 *5f3f2f463ab42b023e1bcd3019eb20c5d1af2e0174e534f8f4e510543705dd0c261c747c90b838 *8c35f825f1f026d030be92d0047430488f6fe2f24c10ea0dd45a7c90fa2208e32a48e2f0047819 *ba18db0c938ee0f7a92263a0a21acabe35484ad04f30eb0cf433ee937889dc4398fdd013895112 *a3e7a8c04f882e83c6ca40304e774d9f4718490db3e2dbbdc3294787062793dce027c43ac51e4f *24051b9881d59616117a4bb985f565e40de86bd2b3a6a521823102ddfba3c74242d38cf9303492 *78e6d0c241cbc7eb5bcabb8b04330affa9656ca2d8cc3bf1a3e5187b092b4aa18cad1a9f0e9731 *e5b8c5d27b1ffeabdf1bfeebe5dfb4129c101476e954ca2c64291479a12e5a8c0a8ac5df149b29 *559af5438d9be5138b8fecb42fd29625cb9fbc0b81dec6cf390ea0ff4cfc9c4338ff27e2e75cbd *3c78151f115aae23b6ca5fc4475a8fcfbe898f5c7eaef8486d69055fba0f2a83772990877ecaac *cd49987efd7da16a66772d2e233a49098168f3d2f797f9465cdb8fade812e5cef7b567a53da5d7 *f8a8571555ef0f3fb473ed543b6af9c146caebeb9480fb66189c8bb741a06b8585932c28641d53 *605a39cba538b7beaf6c69dfa98d1bcbf56d5fb05aea61d816afcd43a76f098dc972d24dcd60a1 *0db641dcb9cc9c9b2ecf67e3483acd2f6665da538cdc66b6f7d2b5106ea2fbd638d5aad13c9e1e *a6a7c17a5bb0e36aa930f79261bb275ad2bc6ae81567de2809cbc45b5eee37b92dc7d77cae2cea *f3a9138e6e974810d67e325ed65ad56ad79e9feaa779907757fbd3a9b099a97953bda7135f51ed *a9a6ed8cd6ade04c0b9b8e9113fa577d516e49e6d99d6fadab3b1b5981b4d00eebfd6ab428b69d *8ddf3087a1316cd5f4449d2ef5a0a61e4f4e6c146c4f163a829c5b6f955b6161971e329f6daf55 *995dec19242e5dcba915e8e5b81469f40bf49e14dd876e6acd3158cd12fa993916d0ac3c043467 *c5a275292fad5671964003355f6dd1f176b9557c987696674ebf582c4aa5d56adeb16fb19c2eed *5c3f08afc1f4f7aea6c5672ac8728ac5cec9998cccbd222fec4099281f6a5c49dadd42b44e9d5a *cef402c3d0ae8de334d556e9ded7a3c9adeeed1ae1711cb8f7e55a364755b53dae875b6922eab5 *f65290c455bf7d5c288783b6bda7b9ca876b5f532bee2f845b306a1d26aabdb1661b6956944fca *f1a6c4e6b936319673a17ad91cdd41e854274ed59086c3e2ec3e892e6ece3513d7543769f754ee *2ef7d35b72e8968bd3c3c7872cf5ef35b5bff43b87a02a458ba9d9d6ae3bf1b25bec45a73e122f *b7467a1baf72da4d32369df5a4535c1b6737ce4bf9c6b44453e1aa46656f2b3856dfb89d7b41a5 *bf196f9a86961faf3b9bd979e30d2e7b3b2c49e5dcedb81854b6d3785db513a33eda76fc74bc30 *37c971de0a87d64af8a809b3d958dcc4fb8613562ecef5201ff7d7b4f473553a15191dbfa2affd *aa09886f78f4fb1210ca3f38e52e7c7f0242f97f4a40a8fffe2b7f8b04041a2834d84c1164e250 *fc81646058ceca173e6339352344614f8247e79e023e93014972e87128307da2b31140d201fbb3 *a85d143b980f8b41a053f321eae6a356020b298ebe02fecefb504de6e8884537e09528c1823c02 *9e7cc40202623016d8cc96d3a47b1414c6c92ccca1f38f72b9077d25747904cc5872d0cbf4c990 *7188e23ffbaab98b146a7c12587a317a4f75346564dd8509390f0ab699a5a7308ae6d65203f60c *c84a78215f18214c25e31a38b28818a672fa0349101a163a5604b6e432990e382a72aee4fd4822 *cfc2c114e0ab8ad08022208a6574f0e77890a15393254643485e048d2c844d99cf1ef3304f109f *d18d847621cfc80c9b2942e12008c42f7a7c6cd41173f41e2196665d00188770249fe58829a1cd *d778c6fc1413890647dd01f408e9ffd2f91f657233a3a9c7042ca7308ac21f0d017fec3f456a58 *ea5ee320889e32057759e9240a3659a236e04ba5178442b618228b342034fe8f3a37a712d08cfb *3e31876c1add3505b0020afc064254113c482e75e34df1d0fbfb3e8d62c0eb0fbab23e44fa99eb *06f6aa2cf0c04698e1e667d7bbd7ff74e1a9e8e463e46358b028082d43c483ecd2aa217acde028 *70fcf87b0fc9bf4a0ff68dc86740eb286da8ebdffde653ecf3fffeb1f34ef375b4fd4d7d77c617 *e5d5ec33fd9002ebebb7bb09adde8be89d1629fe17adea2ffaa3ba26ff93ff29fe53fe73d2aaba *c6cdd4b41ed35bc8c63125c8a6dab0e9407aa6846a39a7a4e84ff90f678140020ea1a644417788 *959f0beb224fda0886188fce75d65e363815f06aee4bdfe4951fed72ecd3a3f35246313827763c *4ea5d18a44fb82897e7d13417df432f3650847d3d2445fd661fe10061c3ecb98e434ed43080c44 *a01004c633c1f2ad106f402e4a44e75dccb1b60f92372fe0681f33e04214618b8c90027a5dc969 *6d09a0c526c67c0112527b34a0f4ca4b1099e253695c65171eadf602af93df5258e0dc04d8e9b8 *0ce0f352cf4b1638af21d26292f66c287b2cb0dacbbd8bc81b3c849f1e6a56dcfcf8d8c1651e84 *100d8c317adfd83839fad4e81f20234cbb950eca074b61cbd0ae029358d279a04c5c9e8ebca711 *f277be1eeef95f924e116fc126468f15113ca4a125f8a260eb14c0fa0df54f341a1a581f1e9b11 *1aeb1eae4e2604b954037d79606ef8705762f10f9fc7eadb836376da53c82440629a99f11e5f33 *1b7222192d7f11d3a59b52bc4ffa10112c2e590c23e2fd42959f0d6bf4eb74fb2a0c3f0d1887f2 *ae21c366e9d51145e13b7af83f99e0b748d8da0cf5d933c8dc129de74ff87074913e759232b704 *ce58b2f2a4f24b024441d03aa783cf640afceb842ee876688ef9afd326e05d801fbdf43e0b9429 *ccf046845661a9e58ac0b2cb96fc5b49652506e686e3434224a5326745cb32a785d41f506228e6 *390f348208edf26d239dfd0745686b65cbfb9203b185ec1cc8338d33b9b49675d68bbdb4be68c8 *96bf7ef6258d53f963699cde858d279e49a5f6db34ce8f48c02aea2aaf49eadc08c6b734d76bc6 *6e59f0a7d3cec8bd0c1a9dabbefb58ba8353748e9a6934a8b486dbeab16f34cadd73bcbbe717a5 *91670fe78adce89d6bda5869e56ebb7dbc1b17c4cab4bf14bd8feaec344fdcb62d579c6972d065 *e5d8ec5e1af168389aad469371d0a82fc6035718edafbabc5e9f0a6a4e6c2c3a342eab4b51eb7d *087bd1773c6b72dfdac95a51accb7f91802d36eeb93098c6b5a8321f4e2c4bac579ad1ddeed6a5 *eeb61bb7caf9d891f6cd74aa68a3b11b258746541e79db4e513d963e12b37b551aa375aebe8cbc *89f151af375d3f3877ebe6696da4876a3af8177957b6dc36b22cdff9157e67dc606307f4069000 *b88124b8836f58b9ef3bbffe7625e431658b3e63df99133371159a08c558221a8d6e74555656a6 *b11d9ccaae2c9c4623b9a4b42bce6a7edaed1ac5413359b8456b3fae960c73772f4423c1aeeca4 *4752ed6d857eb7ae0ed5548dbaaa9c0ec3aaec5f37ad76b6eb8d83ff764b9b91f305a4bfb5a5ed *f38cf5cf27e24e1a7d1151d8675f9900ea4f13f16f7ff0877a82fa8b89f87f18f3bf88e74b1502 *40f95148a79701c32f0d5616fc3096d1a195482f8d1678c09d40232b8536642c50c9841fd8715e *3e316060ada071e755368213889f1cd47a05b978fe5462c413fcf0e3271c836b053fb9c31759ba *94d151c40f2a152c4c9e5f51aaa951ed4740b092a2059d416decf39c0a1911c91f6514de510b1d *24a192dc9211876ea2a3a2f382639b40505640f71849b56774473c138b188523592e8e048bed97 *680592257ea869da3b52c0c38e04be1d32d25a9a52cc92f122a74a508fa182a54e8f4046542442 *3457c87b9b3444abca4b3d3186e04f05172006684269aafec6fefe463401b11dc5648857c88453 *40071e740da863527ed77cd372e58eec831fa60a9b3609cc6e06995e1eac4b30118d10df90b800 *144f29fe0382233ef3741915f62832432a4b225a8ce2455a0312a504b90202ff1621c6c1178cfa *74f558fc2a5725d326d2604fc243b10cbb830244082e84e0b353bc2b7f0008c49c08a0827c0c85 *85bc9a4ba9b501b6bb4a57249b50506f928490a36ff79ea10069a05e08860b4333a20a1162be85 *594af57c2a1823580cf50f50515e05cf2572c9d50ec551be5bf9fca758aee40123a3d32e86dc1c *76cab7c1f3554a8d6850ada6e7fea5131e4e1b7ec6fc4a842795e9d95318577eb32a6fa6411e03 *ba49a578d941a3814af3cec7419e8dbf603350d95084b70dbf56fa9ae6d4c497b0992b2cfc5c7f *6bf8c8ab7e85af653f7f39b8b97d73fcb5ea67dbc911eaf94e6b3711e569b4094eb1683f59cb1d *fb96f05ee5f2997d731fe6e48f7070f9f18f7f906fed9b376f31e5ff99d7c257fdd6e7ff996b6f *7de795beac3b5e7799d762a0bd655523d7981782d1ad1f8e9273cd55c4e6b835f3ba7e5ee1a1aa *def5e407e33a8bd6c37b7ca711d89967b1af34e411191e14c8f16020ae36d1dcfaee97ff5cf1ae *80ea5dab762c561ac7deacaeb6f4e96e198ece0b574e2b479379f262e549f6a85a9ddba1e7052d *c73c3b0bf5b6aad53bc7c93e2b989d856bf7c76e383e07e69e99d6767654d8f5d130cbb53a0bb2 *99d6ba25a3b6ee1dce35691d049595e92eb5be78b17cc9abb079417a48a564ac4dcab383b3d13a *3a6bdc1fe5eabeceaed5ade93c36bde9d1e88f8febed21995bdb4bd83d897de7a19746d77ab3ac *85b542cd727b6643d46e776d20b3d1d90856615613978760b8f48ee666e145f7f9b6dc9bcdbba3 *5120b0b0d1a8f88776da195ad66cad4f0bd125321e276f223f9adea22886e335cb1a9d61efe0ca *c1f83235d8a4b93aafafd6dc3e36f4b9944efa9ee3ef2d6fbf70c4cb452c15a6e38512776fee78 *ce86ab1ebb8e02c5f31367be7fb0afc5bb85c793824a5ebcebe4c53bbfc297bb4b8fb4f05e801b *5956b752af0957c79fcd87935ba7629be37130492b6add2b3e72b5e16acfb3a9c83db5bad3540c *c2ae2f8e0bf7edca6f4acc7ef47bdb52e961f41e6607bfdcf5f27260dfacd0553f8fb56be48668 *adb5a8570bbbee643a772b8786739a2b67fbe0eba7bba57af7cda978080f83c549ae0a3bc5b9a9 *237963c64a501e0edda3d529b8e9b8e3dc57f579772a4ccee343c3b6da437d7d39167b72cd1c2d *daca906fd4f5a0316647259859bbc1a836de89e57a29eb69c25928f49562b1b418ae9ace70b929 *3a5d715e9f25da2ee86f4b6e3a5c4da2057f552c8b7e34b79b87c4dab627a6bf2eb2f964a4a776 *7fb12e64f2a3a73f56a7ae3198a9ed9dd05e56bb872c186d86acc96ff751153db7de95acea6378 *6bb68f5337195bc7f6d55046a593398d4b055b3aad97a7897d9d2ca4b1506ea6ab4b3912c52bcb *16aba4c1b789eaad2a45dfb8affddb52b162af7ae6ef03bef2978fd679e0740a83b66fb41b5a6d *72da54db82d0edaaf7685f6a9cfeab95bc0fd1008382cef3373fc9a865de203839fc26e2f97fc9 *1d2c1b71f8b7436673f99f63888ad83b989007e5df7ee197d57debe1e68ba85320c2be16f48c9f *e611dfff01cf238c5779c44fc6ff745c7e7f0fcf27e9771ffa6fa8df513923a62898e45181940a *28ba4990f3a296360151d50bfa2f8f7154709318ac9c489757824e14dae379b0c36302016abbaf *643278241e4b801c51a51553841188c50c882c50de03e3a957d53712e042bf5f2e8642dc4d8322 *507209848a14434b1a393dbcc80c78584aea1212d48219f40e34080367949a44b8111efae4f597 *cff31b11f213c0ab798a433a1170cd62504ee5c11a0f332334674aaf3224060b2ce820508c0c5d *580d8e08e4751812226dc0693e7b95df40522f82a581468d7f480a052ad390e430ea77d4ce06bb *8ecf3345489091289f4839a58a9e321d503c2591098c053550dd5e3c0b25a23997f30e46cc79ce *3034b001c9542002b537a55ce1f367013341bede32f03f1500e63c430d655430215b4bb457f652 *7084afc918ec38a2f031bab4ae528ea540ee8164d66022493e5daf44f990e89099760206ad409f *a092da18dcb3215946ddb6d2cb8e507e1792f8aedb4224ec109c63a8b710c00bea7098ef9d175d *a90ae43c48f104b3c73714716263f882e4b26c21dd23cfda93177b53c51e24c81ad47c62728668 *155429d721d53524251a1cbf3fafdfa1f2421c5474230a488ea936c130932988b5028d507d51bf *0b69b1fd6df5bbbfbedaf6e7ed067317ef0a952e0852800c094f848d322543ac4c251662ee5768 *e928f61b83921ccf9c1cebb3ebfeb2cf2299df5878d598d0e2a950de5c36b165f8d670087dcf41 *77fe5e357552b573f8c579f2667d5a0cfc8d52e86fa2086a6eb423e3856ce0e5003d179e61eba8 *d685109421c516c82186c907648b8afb39991e5811f57ba7f43b61ae029ad276601ac5377cffca *b09a7f4e8579126fc08b8f78da50c5e60f4d40ebbb8c06ef14957d01d0146163c6871dcacf171a *3fa8c57c23cbf08d55c05a0ff1724ea1414a4dd00a2113444a7fba3a15d305fa5803ede254af89 *a15caed33ee2e394f1b3023080e644fba0d69880d44166300a8dd680147d96d2a947bd1f31dd4b *aeea9d0af0d10146f56de6015c45105ae2c3d6d19faf41a081300c38e510ff1c67ae8177ddb3e7 *21438b77ce9a96a09b23b0f7422a35202960b6a73885015892be55fc61f099f4951eaf41a61567 *538a329f14bebf49c87300046c72ac493e5c5d44f77706092d15053b11d5cc180afd7c12345023 *d2e89de5fe8ca0c490454da1219562a87cd81416e33823218308a2fe2258f7e837379e9e7ba6bd *dbdaf265a9c17b979c7333ba1732e611c0e85080dc404e889ff2e1d3e12242d39518fe092d5a3a *c2048805e05c263605846725888ee687c5338a19834ecfe747c618f2cfa1cea214024c40b06234 *4728683697b50f8e53069c90328a853e824087f93a3cdcbf9457e1f1f845f88f32ec3f42424af9 *cd2c03a217de4cd0631489fabd05d4972d8544332bb0fde4ef1f26fc022474206462d7fb0c1292 *5bfa3f1212aa980ad9d7ff1c1272d9ef4242c7abfb07d1bbeec7ebd52918d7959add3a06e3d6a3 *56b131e2fac25cbe4bd07bfdeae0bb2157ebbb68e4dc5322c3bbce23be9b37fe011655596b0bb3 *654d9720051b57465080ed9866bb6cfaba49bf509e36f8cfb679e99942d7b0b7c274beb017cb45 *f72a1a71d9e95556f16d15066c285e8ed9b2a514aed749afe789fa29742797649a798747471095 *7bd453a4daae5cee2fcf9df5f46af9bbc32476d6e2a65b5a0786ed1dba42bb581b598562a85d36 *eaa4170cba8abb193ab2eb8cba23a1bca808f7bb1a2eed431a1ac964ca5ccb3fcaea7a77be33c3 *6ab63275d1d6b4ceac30eb578af1b1bf56a4f4b159cd2c61e556e666e69ed6ab4eeba475cb6c5a *ba2461561b7797d13d763bcb8b51d987d145edd686f2dd2f68db6550be362cb7a96c4aabd6745e *4ed5ade4b19eb01b9d5acac34ac560b5928ebd736296ec633d385f7cf9e1746689a3ee85d5a6d0 *289d6b95e2793fd598501ad91bcd0ddafe2a93c2b8e669a5dbfeba56eae2d6b0da0da5b67ff7c2 *dc8ade3578e771179e89dca619e4bafd5dd6b6acc0763a8fe9e432095b93cdc1b7b4ded9522a97 *fabc5d950f15cfd2c1e72ed4ae7ee059a1e9b8963699ed9cca246bcc87e625f3fbad5663512a75 *04be69f25fb6afc422f71dcf045c844d56f8416694a0c2fa7951b6fb6d7d574ee2ccbb1fafc33d *4fb83b8dc9221df6d5a9b3616ebaec8f0e46532dd8c2dc2b5a8feafe2632b768ecc2fa2c2e57d6 *1db993693def3a53b4e943bc8ef6ad72974fe478978a9574aa7959f9a05849f6f00a9e3d97aebd *20b12aedfd69b338358e6775b88befd185afb89ee2eab3feb9ae6752b05d2b63e7d06fd7764ba3 *9f323df2587c1a0f0bb5bed014a4795f7838eb56575d8876528f6ef7931c58a5627dba8caaed63 *e5580b936b63519fa6d24d3c25975a73d8584e934037fc82b78fb4aa35ab3afe2eaa3857b95edf *daebc6b4d6730cbd554b16fbbbd8ea9b96b4b24ee2f93218b90d6f78b81707c67c6926477b5870 *8cceaec50451f04ecdc670b93cb4768d6d7bb79056c6e0981d1e6c306ede463d16dfedbfbae3fc *af808974e001ff1a98a897eebe08ca0798e8e7bcefbf0a26fae140fd012dfaf1c8fdee12ff06d0 *2802cf88075c14c781b294407b8684c34534294bf44fec05ccc0ff5c83ed374f8219c2678a7a14 *624e1108a451a7700ab2d82be57e1eb4c608001554f56270be78501c229920f91fe835e51d9f9f *7e028ff113a868e6453832da81e3248fc874b801f10c9b07c846f852b289a18e4e9c6e836e4701 *2fcf408a9f42598bcf0c499e261f987acf5f32527c5da12c3c83e27b8aa03ec47da950a4d48c77 *1edce79fa050d5934ab0d03a526127aa23c8d5d05f1ca26f5d009cf3aaac9e2928ac8272aec20d *3692de097dfc9b3f0882afe49732627cf2f376db18e38fa000a083239c617a6319e6aa1acdf0e7 *eb21f798470e448a9a4804791a44c6542acd6adeb92fa92fa10e9a6ab46f4a28ea53f297d102d3 *d0b94bc80dcc24a5f4a50a4106075b7ebf3c588ed0272ea36f954fa6816e803c1164d1077dd1e7 *2fb213d5e10d069aa102e67e0e2546680bd0247433472fe905a42a2cbff3c449740a0dda24fd99 *d05390430078701b7875170ca5689e0011bd5aa26d2583719fa0573584a41839ab462f29db34ed *50c4e5f9b40eba3adfe664c3066a02f99ca970717bddf99e416981ba104074cda05915a34784bc *d0d0562b0befe9cbe7ab9affd3afaa96d1d73f1e3472ca248fc567d0e10fd57c17bcb32d6045f6 *5b457cb374fa81bff5ac32fce56c7220d0cdb7b2f4d975ff1f814694c202d896e13c97e145cd5f *b61a241025e0b57ccba8a0cea4214138cfdc1103c0bca2d01b2004514183be07df1432faecc30c *0dfaa03993db72fca14f9ddce6345065015c910507f4c0559d9e9202df357eeae970e1202d37bc *8bbea5ef31a00e0d7114043a18d842396957cdb73644e608846034d467643a02e0c1d08e23a310 *41a68c800d6438aec4e086f3b131945ff827474ff4230dedf86248c701613f5f9bec553881e427 *2f3ffe6440e6a458987e40d6634050fcada243038fdf2c49c448b47f75201919ac7ae98c10e829 *f09bd29e9bec9577a4871f4932b8cc1a3cea125c5a85a8889082c4a353ccc05f11cf6235020e50 *3a5060f69d61c2f349d3001632343cd111a9a1da030b9d6fa09186f94144a12048d0c577832019 *ae2fc49107a642e52f951edcb33284802111bc0bc887415d40c200283090c14cd7b12c75c287b4 *f8833e41cec10fc14927a7ef98a24b123fc112d2720d790525b23c76523e180d89a08453733f3c *23a92901bad302d87e29f8ec54b15109f8e40f57fec89752a05c1da2dd872fb010e6d41496a480 *b264aaaa6510b1e7a70301a5119598be8185e03f910f8ff013d048fc0dd0c834883b4427085ff0 *f69b65d3bb90dfa9cdb74399dcfa74eb4d28930b34df9b96fa1781468b80fd1341a33fc523fafb *40a3da6f8146f75f068d96db47512b759dc52cb1a2cb23b8dc9dcbfe1a2683a37d34ebacb4d88e *e48ced3b854b682d1ac75dbdae2ae1f4d265f26ad42be9cdee7eb39e9f2e87e126a8d97d3dbcdf *56ca62f7d8ab625be30bb2989d0ec7ad1f9bf342912935771af604ad347e689bc9a53febb4af82 *1dad8656e972ad8bc6bca4cbf24c4fa7bd5316f47749c7edd7bdf9d16c96b419f30ab7c6ecd097 *86dbe1791137acba6fa8d3e5a6272fdbd9b16e25da6a2b76ebb5c4da661bfbba8c9ca95cd9b041 *67a6f6275333946e4ae1bcd4dabd73436dcd44e9d60f86abc96de99f77d9ad79107c735494fbbb *c925e86d5c1e35f4872dff31cdba6c55ed6b57d18adad1a610c5a724ab18faa37deb4ceff1aa24 *59beb16d4d92c07727abe951daae5b6663522f86c34a72fd55d0a8fad81c0ff6513ab89bb0b812 *2b6d77511a28c79bb611ff66d0c8ed24a3586da4e13ed80c34673ef2a56cbbef4feebaafaef5cd *5516a428abc7c39d3f29b8ebd5d4b327c9a2543f75fbf736bf7bbda9cdbaf2795ebf048b4efd76 *adb59c7bed3a9a2e45c57514afa41559bba5960796abfbed8271b5cabd5a90d5cd5930dade5bfa *fa546dbaf3ee71b42a977cb175ef45ebe5365c4f5cb5778be562a72adce47b7bb9d7b3e1beb1c9 *0ad37daca9b56878657a20b3be2fb71e8fdb687a2eed07172be8d7b265521e88e76aef22df4b82 *5c8c6b77696f8d3d476f96bae7875fd0ca228b66b5ed3e5b996a7a194c76497f3f5a0daf8df5fe *38d75a6cb46197cb5ccbdccd79d888a2cde514ee165a717d2e0e06839350d04e8b813c39dccc55 *d09ffbeae67fd9bb9225c78d6479c757e8ce03b124b6329b0348022441822bc0ed8695fbbef3eb *5f86a35acd7a6a68a6356f91668626b5d1aa8a20904864467878b8f7f7d7f192055e9d8d4bee51 *3b1d0e5ba379735e8ad8fc73824606ed7b7f15d0e8ff8d5bf49b0df5f74123f92f0a1a99402632 *8004196c6d0c88db31f8dbf1903681f5a05c246e97512425e67541c89ec988a748050dfd8786fa *d9fdc80ad26b03d84008f23c85c3e87d208f0e78fe19b91201838762b1e5e4a7bd1f3a45751344 *19c80d102d1c255b11ed00451df2910cf23c7ab9437837534f076cac53f4886a795957fb22b3f5 *fe92019310fd45469e9122920d3132327a50816c91505701ab230142468dbc19b4c6c13fd7901e *f12367b81722dc379322439e0ce256280f6728e212c2a4a2700b0e3f8f4ff965b2b8b0439e9f3c *e994633cf9b553ee02132172e88e60c5a3527695f7e1fff82a20f22741af3dd3a1f5c8a08599c2 *0c052df7fc2a44b510344a51a1d7d86767735ed8d653ca2915d4e9a35cd34da4a3fd18ea00652d *03dd8a01adc9dd81a83d071a76fceef06c95d2bb02d028ca85d5e08018ab9f226b26f4cdb56f26 *ef2a0414a28259cd130806b641048d03b251c2fd25e6840e636ee4befcf4d4827b419299396742 *a224588550257f4849401caa67397a47a29245daf309521f244031241b087682049eac82ca0658 *914f8f22c6950ac949d208d72829e429b80c213f03842d115a180ca692611114aaf0d4ea5f1134 *d2ab1fb64e5db524a85ea5be7bfec6e2f7a3f2619b94fd89fc0f24eab925a0c62635b6aa4e4aec *8ef66f0e1a51b29ba0552d85368d498b3641aa10708cc12fd4c0c8d4f1077cb1d2f42ff9b79427 *cdc08f6305dc413c08990c2044432a0f845e039d4879eb8a67006ef9a693a1c2c0878efc8041d6 *e103c89f147e7cfe6cf2c78d34fa0de02bef027f06402c9d00093167c742633186f6818c262613 *407bca60d9f115d365385b7e58a29e48e8f14693115f2af9d3c4503631c07095e118a61a5f6069 *039ccb0cfe0d2c976235be2d89c8dd092f07aa411dfe1a2d11e6db1267a074a0615ba1ce7f956e *810271191da05daa40c98541e91664a0f06d9d0f4da8cccad822230c0e1aaf62881148b0a165b9 *8399f82915fc05ba306817e01b19f582c180962f2c31d67642986460f3e83aa4762d888fbc0b49 *a838551d1661117616096ab812dce1323849905734e844321041ed6d8be15b12a90e63b1e22b73 *6a028f67601741ca97ff8a8f21df6d63380a8730bbfd3eeb5288d7609cf9fe12a14614614fe13f *21592246634b773fa53bceef5af82e63810b37439492600d46ed782a7d3081906d0a8211dfb545 *c8dc9034efdbee4635100c91017518d2ad50696b96f0869f0c9183a11d43a512136a95ef8669f0 *e1e0f78ec9bf031a297f003432b1d7f3458e55687fb44c3a3d0d221a7c75246256f543b16921e4 *5b8c6afd0f8146d2d9fb0f68f41bd0c8fb43a0d1ebe741a3913a9e259175b786f14dccec49e3a2 *79fd863a76c3197b3cedb6f918af344512c6d3c6a82fcf92f1a1eb25f1f1a03e1a95606005536f *7d961ad7db6397d68fca7e77da9646d7fead7559477ab63889b5c1e0229e375de17cd4efa3de2c *eedb7779d8f0f7a3e663335b5477b7e15569364567184a2c4b9aeba6545b19ed81babddb6a5933 *74f1a95c59b0ed08aba161846bc769abb7552fb587aaeb48bb7369de5b3d87f371a9d55eac62d6 *6b79ab9edc90fb99d8777dd75f9b35454ec6912ed684a0f19ccdb4a1da739db3b5d56ce9f6a89b *c6e356afb189d135dab3ca6ca21e9f7523581efb46c37595c56b604f968b89ac9589eb547a9c9d *837dd6b783e6c61a5941783413ed3cf7f4ab1feaf6b53da9cffd4df2aa5d7c4b937e1a34f2eef2 *ab928a83997dd36343f7ec8552d283601be9abff65d0c8499f23ef696e06c97adadcca816a7b83 *59bbd60b17e7bbf17cd67b23d69ff8d32cf476c249893b635f0b1ae39db64c3cef36d857cc5a79 *cf1a71385f2e4275db9e5c4a9efcec6b597aed5545e3315bf65f37677fbb7776f152781e87f2c5 *70aab3bb634d8dd7ae5b1f36c68fe178c68315a7ab99c3b1524eccdad2dfdcfcb9e7766ac691ed *a6f5c9e135b83e4add581876c7e2713d91ccedc81bf69ac3fba5e5afbce6c8ed79a7e0565e555b *1a8b2ed3b37d36d4e7a37954b58d3e51e7e6bed4f00edbae2b4c1ae223c9762369a33cc54edf54 *54f571b4f458ad56276977560eb47e27084addeebd7bdddfa5d08f3baafa1a4d63bbed4e8e4e2a *5c3aebe55e1cf89dd0efbf94aef5884bd9e8b0904b838197b0b4fa4c1ea589ef8f3abbe0cf091a *f137f19b1ddb7f40a3bf0f1a297f173452feaaa0910455258de8e5093afe638809f1fc38ca289a *8b1117eb45027468781141af51c1a53021334052f38c62c304513c0fd2c3028e0eb5ea989407f3 *f093c7d41a827a15b9020f0ff55ce0d1a4fc582a00ae6250f149628b518a10438e9b0762fc9cc3 *9c81af53781b4685f21b394645c8904aa00e59fda1c4cb50b0e4512dcf3f485120f9222cfffee2 *f907cfec495a1f6e79d45d255220490eb8f1a75cb9a2514ea017b565414e9fdafdd0012141649e *786011c5c8a43a95a0d5c82c1c49fe74eb380d9e70c8d0154ca1ba1181e46446749b08b6c9be14 *41df5f64d8a0c0160d5047ae5cc2ff23852eb04c180a9954372d980fc4894139993f7f29cce6f8 *1d2413eb0c0e02b9faa50cd8a3e01c0c68274ab024a1623f404dc235a1ae49cd7a3ad04db150a8 *33bf0b24198248598322a5066c12066914e99ba0e984054788608860029b1151c8374062c8c515 *49fa3e462f864157f4c323f0542683fd339f4b1a24c854f8e58570b823b77248ae31a8c5145d85 *8c5abe8e548c886832a508fc165355fb1b0f2c8b0a5d3a8803013a14f5c8987447f25455cd9f14 *e8a6aa1002890b20402218a550e40b81394594afa8485525b801f27bc453c648fd9297bfbf486f *f05f1234aa56e979e6fff23b5dc1ed216d19e7c3ae7d549d0fa5f2491ee14b8f53a13e0d922334 *a9146fffbb338df8834036e40c6a8a504424eb202cdd06289e2ac418f9dca341956982bdb7d386 *e8328e61a541627d68f6d481d9f3a535c11a1802190de1372f02a07a4fdf09524a90fdffdac38b *33218c1f26984a86b629504924142ebe83074071887e9a970274b000359880a4545820cd180515 *0c9ca16a7ecdfe73694ae4fd7c7d50b44f522ced71f013cac9464ca6d589f8afe257891db4182b *060d1769204798560074759060727611bf16862eb02cfb4209254005d45b15ebbc21d2793274ff *c5d002350148f38914c207448384d5af1f4fe1d5c2d08715c15696dfa00c4509be6731fc2a8399 *660c4f8d7c07ff7ef232c13c7c6fca20b9a9e6a50970cef876c9bf9d7f5d028b593a4206f9a5b7 *958d962f103443b0b848ce11ddbb2196413e3261eeb60b0655eeccf24eeacdd0ad9620ba208d65 *682951f36f46db930ec56311febe292c564dacbddfaf5dfb34e20d1106a839ef33457947016003 *3f5015650a3e3975442cdf679d4ad1910e5c3086c85088b82b8297b00c5a155fe45578f48600de *e2b7fd51cf6f562e899c0116853e2abf2809eec2b93b97818327b90ae8bb1709245569b2a95f40 *a36205ca1f708af82ac657378baf5f048ccbe68785e5cf4256f149b4743eacda875ce127fb13f0 *5042123a1bf947f090b2b1823f233c448d6835fb0b3cf4e8d4febb3651fc47e1212b17b0813651 *927b8512b2f31d36e2dfede2c3f459011f76dcdbe7a5dcff714fd15a58bb863361156b2b26965a *d9edf658326f13960ecd46d93e9edbdb91dd1f9a46bd3760db64fb7abc92d7e3d26c95b4ce72aa *f1e4676bcdc2db41783cc5e1533bc77ec36aec7db1e579e268159499920cbda012c4ba54bb3eaa *ba52ee6e86c6c131595d1975fc6a77b2eebc8c75e32048e3d3eabc5f6ba3d59a45f7a9b1ac6fa2 *d65a710ed29045cd9db72daf8de775622eb360d8735db6b9447152d7fc41bd3158f177c2791774 *17d7f96c79195da2ce883987f1528be7ad6ef7f6742b9d5e2c0d7d9b055a5dbfa79df6b85d993e *d5845d1ff2c398afc3b32b04b2d67fedce4ad2dedc07aabd0cc6de380db5c7696d6fabde7cd632 *9dfa71bd1acfaaa7c9fce597dbd55325aa6c6ac379eaa866c710cca5b3d74ba7677030cb6bb5d6 *cb3d45ebabfe8a4f298be5de1f392863f3a96e555656921b8930db99f70361dab86cebeba0b331 *8e6e5035cd8a278ac75ed92807e77bedfeee4612f09bc80ff4fa0dcad7ff44f96ceb743c66e576 *367c3eccac3b5cefeb2e139fe3472f7a9ceeb3967b1fae0d7f71b8cc5baebee7f37b9af58fbaa0 *46d5a4e747d1ea3e1a94efeb476b514e969334ad3dd5f3a6ef5f16e7ab68d54ab6b596ad70b9bf *a4d6f51a3dafcbb938ac350ca92fccd7f7f549579443e437c7f3b2a88a493a9c326573d3c2a515 *68725c8b5ad36c5b9fcd1a87d771bb6a9e8da4acd6a75ae2cbcbc64038355477bfbe6def72326b *ebdd56ed743edfc2edb1bfbb4bf7645196c2f8d15dababfe6b7babb62b8b4ef3e56f5b9b5aa737 *ed2d9e6b5dd8c5ee78ec2e947b398e4ebd3029d5b4e3411a38466fa24abeb3296f2fd35da3fe6a *5c92a1b66a4eca7665de8837aadb6ecb514fde0bb3b9565566abb67c766dffa9cdd3725b099f0f *d99e0eeacbdd72c5ee7ffb33a23ae0bc8a6f06177f6e5487fac77e91fea9fe3189fd0154e71f3c *ffbf107e437e9729aa8348d663442229ca78549145058ba79b4651378a4249a106dd7486962efe *c73cce22c94e13b1b9446904a902146478791f568a8895c7a1316c0693046fc0d22733c4144042 *01c9c340392d444301296fc2103345c33d85b4799b1578e345c2a33cb012750aa978402786947a *c51053214e3838ed096cf47834aa165c05b1be119babe845220f47947279c69fc226851a2220fb *9d168d4382200ba9b001a972868e24fe419e9aa4083f35240751517f9309728906950283000611 *56b3b98c870adf398a2ed542115815da1824876f52446cc26954818c478a26230302acd4425830 *923cdfd201e325b01cd4f3023382530dea11065c50c862a2e02a78d0cd27a4015e9164d2244cd0 *3747be9148d448790292b2699137a8819b68505937039a956be4f3c124c313052555085a14211f *118c7178d81ba934f3a93e0d7d7a3d97d995a8b82b416da8c8653504b789cad82935c2c430cc21 *1e03c37160dd4b093fd83c45cf8504f18f30973d456b898c2ece1823c39f0bea0bd02891fa31e1 *06503d4ff56458061bcaa72103cf90885d07748a1f874fb322421e7f2888be8076063d46a703c8 *0d7c9ea71037e2139b72d6df315a11dfbb92bfbdfe05f09b7f063ff9c1f7fedfc127946b42aa2d *037922c1f2c827b38a8c992fa144da33a0adc5281dd4e22fa6cc045b86b4986b9036d6615fcb20 *d062a03793347bf0712285e4523a6f79b08e05368a8001e4dcd0047da368e6e50f9a0af95d113a *2b3264739377ce0d9e41139641328c6bf852c0873985690ff54f31dae01588ed8a00278cb7f596 *af9f32bc3b74348ae6983d7f8e72a531061b62fe8d3144c5a8cb18d2cfdf872e17a4865e5104c2 *0acfd7459065a9f153c7a20dd9addc3627e779bc1386442c3b098c4013740319807525b02598fe *493925870a7892bc2fb33aba5699f6c94ccd4590e55c9227efc506db9545505e0653ea1db89281 *f81ad8eef9f8cb80ac72760b93c10e5461559cfb93e4ee166f4b9302ae24ffeadce49a0f850861 *6ebeaa2bd81949d418ac1a96af33da17512803724d04242784eea860109ac03763f8964870d6ca *c01ece808bbf2f6b74bd0049f9c423c408bba102c3a80cbed52a54a37434b8f1a59b2f77eadbfe *c2172b45269830432d4583370b9fdb3a3ab022986e6b281184c667ffec3b689780391a43668f10 *2f108865342aead86232f4af91e913340e0d38477dbff690e61bc22a41e840fc9e87e783f4122e *37bf386992e682f8bf44cf5f6a43fff7793705e04a8d3a5145e7c3b4e1735cf9b044187cb08f9a *4af4c39a42cb36a16cce87f41316afb645c2cfd77dd5eed7fa8d75b56559563503bce2d13fbff5 *84e80796d7ac97c864437873d990e297ddf1ac736eb251f1ecd164b0086bf6c4abe416af9587d7 *0d64e79cf05f4ec7974dd3ee1c84a4b17eb8356bf90d95a98b83c34cde88d3f17d0e35e5ad2326 *1377d3743efd40ecceadbdb2575ed5c64185eac30bfd4f0b0f7c683be21fde9c9bf66c33ab8f7e *351af90efd78becdc76154e5dfb671eb426b98db7a10c4d3f449d8f77bc25ceddb637bdb59f4eb *fcac940eff3f3f8bf6b6738b3ea11ea15bb39ffc988fce8a0c66673913887e569bfffab36f03f6 *a3f1127e66c07e345ec2cf0cd88fc64bf89901fbd17809ffd880150b610bbfb1b1ed6ccf5b25d3 *824ecf53da1bebd4de3cc379b5d12cdf7b9b65a3ef1ecb6b761a65a54b779b0dedbbd03edf27f3 *7d699af41ebb432bca966ebaec2f77d2c13c0fd6e54bda7cd5aac7d37da98a76a4a6e24639cfcb *b2a94e06938535d8779f8234d89bcadd74a264b4b2769369db985d8fea7890d4e2ce5314dd49a7 *118c5fa750e9ebcd50dd4d257fe7296c347ab8ae6f1d7b0bc16435376ef542a5d6b333cd6d542b *7769b3282dacc7fd3e2ffbf6ab579adef54a7dd06a5b374d89c47d43f6ddf9f920b1b5c1a29630 *35c75a9655c3bb7dead7a5d5556f6d762f795d8daa6d6b5abd9fc5783ed7cef34bc994e3ab7119 *f89dd76e74efeb23f73c38f8ae28e88d7ec550add1f8691a6db7b3b98e67bb4b933ff9e9385d0f *16e579b8a83cbd732e84ed7fc586ac7ee008dfb0a185c3daddd273be1a3c23b1764fe2f16e5ddf *99ebdbded94ce3b1175e12c36af8f374eb8ef4e1c060f5c6cab88881a02e9cebfcae2fb4e3369d *b7e4b0d92ecf478a3e12db637bfa5466f5eed0acbf82f3e4a82e92e361b7f0cf8cf9f54ae3e594 *d54bc684b1d9d2a7cab6fe68be1c657ebc4a66c3b0267ef9729a76a67b67d7689fb7a5ead062ce *23955bc356776f9acf7269b82f4bc6d1770f42455a4ca7416b16ccbb8f6e4da9c763f36c5c1766 *e578aa644eaf5d5fca4ddfd81e0edae31095d375c35c88f36cd4bae9cee8627614a1db4a6ef7f5 *a9c9765d579492270bbc5bbc7ac90d3d6315fb70bda7dbc0290d274eb9dfb5d9ecb60a6ffbc953 *16cbf26bbc3ff533416f6f83f0b81ffa8f53624e52c99dbe9ecbf97fb17765cd6963ddf69d5fe1 *c77b8bfe82e6c1555df71342623002330f6f1a9911f3f4ebefd94b760cb1d56ea7d3a92415572a *65033a8086a3b3d75ec3e694b32b5ecff8e6d8d05fa7d3dc2c2d03245cb0db23ad11127808eb82 *17b448bcfafd25f3ef1f85cfeeb77fdcb5da7f7676eef88fbbea9f2d77bebbabbab3f0ce9cecce *04c31426a3c98e7de2977749a262ccf8131099f4fb29401a7643bdfb9f5ad3fe5f6034a691b316 *ec557ffaee7f83c9683b19ed68b04f7ebcf8fbd85321f4ef78fe8e44e1d4987f1f7ba20deeb497 *0d048ed3d2b0a71f6f7ffc4c58964e6b485683d052d9a5357cd2440d50bc4b89fbb27ee37e70fd *a3e0bca7952a2c9cd9f255579e7447020c284268cf3c996aa5b7b948305e70615e2140a4446471 *10d3d97a5243cb91adc9c8712505817113ee7844a00df551055a9c27b1376c0d4cb0036c298956 *9ec21c611f5e44639668eb207f8790f0f1a8b9c86802822b5f4bb5880e10852aabb4de56130b55 *e8823c3833b0ea2f697bfe55502db02c720015a889ca6a0a01442a25093505d74185ae23cd818a *dc12024028c8530d24c2afa87472a91ee4125b4dd052d22470542000c50a60b0436c7e89e800b2 *f8644341e417157dd13473650eae172e9d3f22d265558424917116f28a4524cdb082d14dc17038 *10d908d013a948f4c15988701a10ed053b36c955f65350410fc4373a22203d4589660fe22b17f5 *66d20fa7e23705c35190c0e4212f91554f7ae2a4ebd259cda36e22868e0fcd43ca39e9c34a8578 *4c389d7c14500422e1d0f830d34d4840421a47cf8337b90f73710fdd6f5c95eccc64a71999a224 *59c45e2a478f55dc94b729c1764c02cf02e6acbc0c6013c236016a4625e59cf4106da5c0084583 *45373b7c21c8653a8ca1d42401084c90345cd1f73e88657dc5cd91d2b74298c0c364cd05738fc7 *bcc68e99e853edaa427dc2e623f25589088bf9bcb917821d275365ee03b85400ff257772da831c *914c12336c9a0e10fdfc522aa3a40f813b0709210435ad02cb1b0ebcbe108c4a0a038563fc35c6 *2120429a0d2243b34594090e28aa04516f4073348f6c6522cc788835bb7a77223684c8ef02aca9 *007f64fb41444c2a2bf8b5c44998a76f1d2269f4da0648c675e2218f95d5f67455009bf031e571 *2e0d1e404619c1a75dbd0da8f5e065c6a62425611842dae5c16f3f82a24b839e89846510ebb0c9 *5abbfaee229cb354a830e922c72c134179c9761719fa807c2843cba524e674d7763002adb03c18 *6f910b315c79c9c1d8a763116a4f8e482ea05b1581d137fc16005b1a44c36476add304e14293c4 *0689405624340d77209a4ae41bd8d74388033b2592a83a15342136820239b584cb9bddfc54f189 *f244c7f71a61e109f7a1eb10bd8108d3a287a3437a6b175c20b431883da582db7935ddf0e064b2 *b32b8111298c2b401707ae3d89842bc2ae0892ec037c979777c77d5d4f488908c890005352c2b8 *0c4b6d996e7b9aff143ac0415ff5c2edf1092d926936cc64da66b2a232d9351d6efeb82b869b85 *bb646baf84a7cdbd2b8d4a0369d8a9ae817fab59f78a453bd0b628a68bed079bbf3775ba19d0cd *dbb8cfb3435ff8004853a3da59569e1930f9d7d55bc3a6ecd1432161bd3c935e9a56e7947961b4 *8cda796e3cf67a15de5ff8574c17ffe6f1fad4909ef105a7db2c649eb18486d0dd07c5eeb95c1c *1efc49be3decd5d806732e6ce557de246f0dfacd71d992e7412938f88bdda56c05bbc16c74ca94 *a7c6e89953536423be1af0b3aec900d5e6a16d2c6f880b842b1417b5b9bf6cae868bf994bdd3bc *514a06193c0d525d34e74e5eea17da33c92938c73a2bb96bed0657b7e37ea6d03678a75dbe382f *0f1e47def10bfe4dd3bea2d694ad63501ef4f849d0af2c33574f94ae9f70daf1b16e3c11762e76 *a771ce7790166bd5e6deb23967fb69e189e551a62374a76c034270466e4f1a358b363768e5ebc3 *7e53f4c4cac63fe74bec08949d56f958369eb55ff3cf0366ae467cd6731dc1fa69cd8e95e335a6 *32cbdbe3d574d8af706e6fb81a083637ece4b924c4b6f83c883c1bb6cdfcf2f2e589041d587eda *308ea3c1cc1c0d2c4314c5c56193eb663453dfb5476a532a73d5e8b2eb28e5cd645bd1e2d36053 *dc7bcea592eb2ccfe395d3cd5736bb6aa5b83df1d56dae3136b9ad595d97cc4cad72b663a72959 *c1c173cffec66cc583f6ace02c456b3894e75cbc3ce68ec1a45ad6c6d3ba148fd7fc252c1d5a35 *b1da181c8f6c1fe8c535174771de34b7f982c0893d2596c60b5fe6b3dd28bb6f662f0fce53cc57 *dd343a0e1199728e6514cd9e596c19c562266bb18be7d8b8d8533b0e4acda37f890f55311083b3 *ccbdda3f2d7d3a1466bbc162beaf0ab5989dee9b4cb55f990713999eb8199906667befdd813369 *23df0c5c38de0e7c6c1cec098f81337ffb23f395b9b7e88ad5456de9b6b5e3e36850199487e58c *31f0a4c6880d5bb07a5561cc052543a99e7536a4bf0f4a6c0e109bd3614fe686fdf27e58ec1c86 *6277352c76b76e4f9efb677d95f1d895169a721c14f9ad638e6e3e6aa1d1f0ecf1fcadebe0f359 *9bc169cba6bbeb0dd91496b09e5e9d91e02ce5478d7c2d2fea91d9368699d93ab69be2ba13741b *ebcd36a709c6c9943a1de9e1dcea6eb7ebd279b9b48e72d8e82fca83d376260d3aa7b816d41c3b *5fda9c1c619c5907537bb9182d9d91cf371b6da97f2e8e0679c937ac91d5ab55edb322ef9c85a4 *0772cf19fbd17c333783a0b35273c7ed320c57b5ccca5ee6547bb3aeac3bf2486937434759aefb *8a26b60e0fd6ca29b446df9905940041fcb7c9202e5800294aeec2db6f4684537cfeb5fee7edfd *f32e8a37eca3f87b70d3274b7cfabb5ab83bc69bd9f6aeb8f04a802dbed8eae55efb0c50bcec91 *ff02a3f0f1c24f41f8f7811bc7dddcdde9773c680092f6f7801b917fd940e038390db8f931f7c9 *4f94a11c60e91c22fac8430792027f11e02121bd2c4080ac9696baeb514990d491219c2f4338d8 *e8c873a242c88557b14e1dc237471041fa67eb45b29240a0172b5265d82a2b682c7b4831a60663 *9a5db487f42f89b01f0e768fac6816c0d5666b6811a238b60464159d9f221c227a0bd825ec1f75 *14e104cce9e884231246e240cc89a836789b88843a9ed5156ad29f87eb4bd2d7d53c5a5f127082 *d81b2d4dccc6c38718ee2e7c485f87edf30026d33c700b4e062f09abedb74b6d89be7204390407 *021787ac61762845a80e5cd073342515721075aad342206d6c1c562da800d2dc8f6628d3cf3b5c *1276e16d7d7715de35c343ec27add8ce66fe06e763bcdbadb6f7b9dcf178fc747bc1e5fcd1e43f *de6499f3c7a13ffbcf263c7c628ffcdfdbef631adfedad9ae1323cb2bbc057bf0906f8ebeff218 *b399e0fc176ff1f63b8cf693209c4f96e136375906e1e9d378b798a7bc49bc58e008bf1a3e758a *4c1988cd9877edf32a7c63a856ab0a66672be7941d0bbfd693c9936e95ac907b1ef5e3774e4232 *55e83f12660bb28f7420b41c2cfa55978a5755a6e946004a71adde489cd748cf24405529c3e1d6 *839d964cb3129bad34cc592a12c7d9257a5d5b5384514890068f0c463f21070282530082b16a5e *42f2219b7a42d8d0f8d77a29a462079843f510d6367027a65c26c461b1fa3e4aca741ede6d6823 *bd54f6809d24c000b206ba119c6c5da4ed252ec7225c7b7414e89a7cab1942d2a09c584903b150 *01ae70981c4925034ea32b11d785f440fe8d4b0e85942b44d721f367886f02e4e9f97051711169 *ef816e2a40b3cb0b374c368ea871ef4202efe732a54102e46d64dfdb1a19a3c8f076960cfa2279 *833e86acd04ee3f2346bb31b49e103e94caf2181e92f0a0958df1a12185c1cfe152480077f0148 *e0f45d2081adb9dcec4aee25b3d985424f6d86b22a4eb7c353256f075eec1e86d1c9f172de6abc *d6a74b3fd07646a519743a63bd9cd5f941dc6a3c1a71d46bda5ca62a29c62ae28ec6945b75b6fc *b9389b8d97d54bb513cbe5b857ef9df3a6ed14e7fdc0ea1bbdd82bf26d71e4da81eef4e2d9b4d3 *eb671ea776d62d0ecedea4b9530b65e1dc293d6805db3a3fd4c6e7f17e541b6bbf21811f1d1238 *7d252460d88d7979b1328ecb8cd1696dfb66273ece9a66d798c825bf93f5ecf9e254add53b0f91 *94ad0cf97838e495fc408a1d3ef00e2b7975daa9a5a65a30aaf345e630dff406a3dc525bee2595 *bb8c8e057db8992ec4b1b108d7b9e2aabad8ada4b5e868fb9564363aa3ba5539154b6a69bb8a16 *7ca36c67f27377dacf15d7c76df33177880ef6281ba80f6bfb72e1569547cbba34be3724207cf9 *f44f0009f0ff1a24a0dc8be28720016cf02340021fdb273f1124c0ca7701e67ce44082ca3be9df *91c61f0fb2756da8de98325eff84e8a691e45cc7ea33293d51dd52221438ebbc879ce5b4de79f2 *620dd9483c411402bc4ec9b72f1171a32b27c08df5ed825e463351a25eb5e823283ca2151e8fe6 *a390f82273b4428d52be85081e16258f4347e423388a779f3c71a9a7eea3a72ed0506fc3121a12 *7b45222b9074847b0a7f2251101429129c0ec96239c514d987b9a308f19282d4a544204f7c7ac0 *03122c33c99e250596505139509a0856fc141082cc24f667e27e4096c9d015a48d2081704f7ec0 *7825f1c56180c0ff0bf292df90c02f0609f03f1a249084beb38b5640fe1b2bee85c4b0038130b2 *4fed6ac22d13b501ec4eb82ba283a743c180b824052e210ab80e6c8a94502ebb68bd4790e2a949 *ecde75e2900c759d821e3fc48e6c3a238ff7c483176a0c15614aac94f741fbbcf62a5700d252ca *107c4c288e4ca5ce3a6524431c26c17ac98710478682eddaa0db53a1ce0183c485ba9415e20264 *1c446aa11464f0a4e0ad4d4a1d98845f534cc81a5da019998767ac0f47181d4a1a364f91c85946 *f6a042f3851cdd34fb5d68387c6838226834134715a2fb614aa25c3538652473ae20dd6cce113a *f22e24f07eea4e1a2460f1641aadc3c54655c92ed5c6f735701b30f274ef31a18054f3f7b6f94f *2081b7d6cdbf022450fed69080cfd55eb304f0e02f00099cbf0b24204ca7b1da2e1b99877eb160 *3484dcd428f9c2d6ddd5ddd66a32c97527fc29eef385e2e0d05d1cfc75b3bc3faf4bdd52ffd1ab *35b771addef77795ed63dec974c3eea6ea8736dbebfe6ca698bc139b6a141c0ebbcb483ab5a47c *f7f1bc38347b137e1d8e878fcd5db9d2dbcc04756dedfaf6e692cd64ed49983517b56de9500b9d *f9e3a6bc5b161e8b7e3677ea2ff8c06f1fb9df90c08f0e099cbf1212302bc55cfba0b4a7938c67 *5c844b4faf5c264b27ab0c1eb3032e3bef78bd9ce59f275eb59c5fd80ab7f76bd6f1a163ea8b6a *771671fb6c64f7c50337e0cefb4c5468af0beec36a7b3edb5af6315be11b8dd9c67c9c6d8b83c6 *787c6cd576f56a7d5bab14a7332e62e79c3b5b8dd5432cec8ed9581a9b1927ea372531bb17ca92 *d15bb6065b2b57cc9d6b6abfe418a1b3f4dadf9d2580a7c59f0b1210fe354840658baf0f4102d8 *e04780043eb64f7e224820488c1d909829c2cc852dd15478ca538f3920ea80066eef9b2304085b *64e52c5b62928a59a2a52739868270f0d99c528e528d3e7c2c792378ac7a0155a2898d43b270e4 *810a50746690ca33602ff012bd395cd648e9a013d411c1e45506295d811b9f9fd21d27c77f0f6d *4498a14a502b53c4a44b6bc4101275f22b851ddddbd008bc5d79d87d90e81e746f1d26b532cc05 *c94017894d69c60e010f223da4dc2ed26b3c0fe4798f2e03b69ef610251581ecfce6083a9e1560 *3be34149ed4398ef234bda85fe9d5c0cfd9bf5f7cd083edc697c7a471def2bc3ac800b5ebdfc37 *24f01b12783d45fe509000e5977bf09288901d0bbe3d1908834ecfae0d76494b88ca11a06b8abc *9b5c11f2a1c0b5440ea53231959e0c87d1ad2767548100348a6f42d67820dc384c923735dacce4 *030680946601785250c889472ff6c1c751f12115f1c64d894d0149b62e2bd9d950ae40132b9b01 *0574f423584a45c82d264615b2e6bcab1956835cc2e749da2481a9a0823410203f8d0d1222068d *604388470268b75e1085904002577f32d4f0201c78126ec1d04ac3b022540f01e42d6a74f3e189 *1e15d2ed844d7c2a6283499d05d11a39e688b00c45a4318968b41bcd183ee4bb90c0fb992aa92c *01d4fd79248f4906b905e793846c955c650c8b0c83495caac03af39f4002f9c22f0a0938df1a12 *1871f5ee2b48000ffe0290c0e5bb4002bb4d3b5f6b74f699c240dcc6567e5d32a4e56a6eb65cde *f0f2bab49745cf916a1b6dfc300ea7c5dafa811387ed5145b07cabaac5bc7c1e9982e619f50c9f *dbcfec8b70580b73653e09739b4b7dbc98ac86eb6d8baf1da7676bdd39ed668fbcb31a9e1eccc9 *66da9a1445f5b0978e27dda979854c67bd7fecb3b5b6ab9953f9d8dd74b9b9b515d4f5d0c9b5a6 *cb558355b5bf21811f1d12b87c2d24608de7f949e81acb8cd4ea29a66771859353515be2439c75 *bbd9b6b9bd34c3f9652af497e1499b9e87b963b1f4503e844db17d147ac3b51744a1263bd35d46 *351e84f23aba541f4be5d9922d6bf6aafd503f1b652b2bbbc7e9b2aa84c5d252389915bdb36f18 *e2e3436150dc4e7aa5c7c6d9ae1ce5ccdc8bf69a55ab1ce76a7c16e7878e9a535b83782b588761 *372ab7fc6f6f11f10e2420d1d3d2cf050988ff1a24c0d611fa8720016cf02340021fdb273f1124 *40aa5d89d68ea24cb5ac103ee51e26da69b2fb7211d198e697a0d2325ac692948cc4208ba7acd5 *9086a2c6bf82c854600f6f8e1021ab86d5be7208b9b588be380c0c024489900b0244d469591d1c *5cc428bc5247118f2fc5aa5e4ae005e381d6fad0cd8a292c0117e1cb8a0e2ab142eb6c0f312da2 *88de1f7cef6498bda5490f288403c6068905bf0b7f35cab01169d1cc4a081d826441a37f6f7f06 *0f592f4916648455780883fec44f9f4b82a3a8e9e9a6b9c92250847d784ad7f510bf28d221e080 *8810bca6533fd4136ff21caf7f280c14699b01f8102a5c40d842f9df489efd0d09fc629080f8c3 *4102125d4bec0c66252035e639ba36429ec8019e4b25af07f7450e5426f627d9395c4d10940a22 *c2db199689220c70c8d9180e963e88f7bafad4f666e53bbbfc846b964004af0fd06d04981cea3c *51e5454451b1d9844d2b3ab24bd9531e822fae8380420ccb217f5d40526c043c208267486214ac *04f46c88ac5f367184578882c691af8884947476f173206109118d43b1b821828ca02fa2440bd8 *ea725788029bcb44dc000284affb6042b0db00c5b38069cfa618110ed594c182b82de90aea24a0 *4500bf0cc68f2a4c14649166d508802d81c6d06548004b6499e6cdcf9bf3e48cfa2e24207d3524 *906775bf7d6f99f7a6745f30ee6d1c5cf6bf69d05d90fdcfce100be202ad70afe9ff0412f855bd *041adf1412e09c827176be60093c3ff80b4002dc7781040e677dca4f876a663b12dbdda83bf3ea *8379df77b973bea554da9382c20f27ab6e6f35741fb9b2bc345beab271e93697ab757d142bb3cb *83e8cd0e2e2f66b67bdeb796edc2c91b3c7656abf38cab37068b41b7c0f5e6625808f645ddf0e6 *513eec3f4cff9fbdf3ea521b4fdaf8bd3e85ef397b500e7df52a1245834004dd299244ce7cfaad *2a811bb79b71d81d1ffbdd3967da1eab8196fe0a5dbf0acf336a6ce464c276a7fd5658d61b25b1 *33ef31677f75142cbe590985e1f4e23925f6ca5efb27aedacd5d3f6b5f22c7ff2725f0bba704d8 *9f4d09f8a1d189ea81b8661651e552d3eaf64e1a646c20f58d96306b8ab56b3f08844ac06e970b *3f2eadb6b3b3a8e6e5a69df6fd517b56d6daad4b699ee48b0513bc1efbced2d484c0bf5a8d4eab *feba9ffb4dcfb2b3ba751c73e785d9dce96179a7a9491cc72d6ede1f07728b1f6bcddef968180d *46955e5963be50aa7cd43d0ebdaa186c25594bb7915792458fddf1bfbc4b40c26f4b7f564a40fc *7b52022437ce7f8701c93d25707fc3ef9012f8b135f993520219290708489c0279db453c660550 *b78a2ce7d02e30c6c8f8e39480448579f926f28e65f210232a9c5917b0142551134048aa821fa3 *b046362485188080e3f83129b343909a14fdb622f9875283eac79f40ec8bba61e476a7c837cdb4 *906665232af34b6475f7cc10162d0e251234cbc8a721c4c1018d04dc35220a992a4a7f21e30807 *9850cf3ffc1991a1086653481a1225c84849131bf2d9a71614283b28531f31952021809642d25e *e3b13b014806a085a3fd7c664151580003a8a8114e4da318229970f0851c7c8455c88c2696a527 *bd0e101073d4c98bdd15a41b98515d5592be7af93f29817f52025f3f227fab94804625701cd68f *f091a45137804699007828c0b326e16f29329459cdb0daad3de4ca249ad7c7bb9ad4fa541e9f2f *12e998a259a986c90078dce0a03f391aa1c5e9e33cbd804d49982790c83f84431097a8db009e23 *b03dcb10d98582d4696aebd18322243b1a7880a28eac8c357e78a225e4e12a509eb070c7e4e935 *f04a89cca7dfa05cc0242a1a2209f8f860490713c550a9fd8ae548a337267f656a0582efc60f8f *578574672532cf49c9d3091eb2d8dc401dfee8f943c2a8282c2a9091888ca0ffd664403629f0d0 *4489c984e6a62819836d5334a5060f26ccc126247d189289f5433206b305a82530094f1089b521 *d42299e69bf1cbf33cc0072302328a02583c6a0622ea5bd8de6019e8440347ccda2fa281b915db *2007941f500db06a08ffabcddb88c0937e80cbf54bf81fcced33e3f4f4de1dfe2d27c921b8cfe3 *8538eef0ce29e8d95dd7d0efc60575dad635fc48480eaeb73a55004399c2d5d2f1c38a2324151f *dea81d62a1bf4b2af921b8da2bd71cdd4d0a32e0f90b6c5f8483d604fe3e4653a3c70087f2b001 *d0c1b0c361b08e79f8c6cc9eb8864a6fd4cfeea85f994c12d8b39a6300e3b78ed1c2d9d5ecfa04 *5e3b2b68a13b3ed5c7ef21373fc1875f235e9a4426371d0d5beb116bb0b73d3d8c786d8f090180 *ff39ef5af6c9eda189277c39aba1d5ab9d8a8440eddaeacd39ea1188775f2604f2b5e17afe89b1 *4ff78cc079180c5b4046f503ecd524aef8677ba677ee5914d3a76de37e4513e01043d718df1c2f *26aef7f9186d38be658b8baade3a5ac4e786a52feec9912afb458e034d1dc63e2c2a93c08660e8 *8ebd4ace87709ce8f6503839146e0f15c75b8d86090ba7aff3b62686496b72312ca6d32b4ed583 *2d485df746415ce95f629e7c25801a9d2b9c293db9ede9cd01829204cc37b304cd4bcfe705ddb7 *4ba69306b5dc1a2c065be9d839aeda5e49129864d84c66fe22caf3749cb67a8d3657b9869d8397 *4c800da56473762abd6ec96c29d7b4bfea9c5bfcacdba97a693d2fe9dcab93349853bb538b5fe7 *aa57dd77b245259cbfba33561c7bde34e3cc53fc7ad0042fbbe88d69331f9817311eb7b6675112 *d7cab9ab99f39ec200ae8ed8489dcd2ff62d4be0f60043bfcb87136f32e636c0be17d7f9766771 *f2344982d5ba63542fc7c49eef7ba70d57de6c627d5877f4fea5df786d6cecb8b90cc67a294fb9 *abc2c46aa871e27a32d4dbb366375d3925d39ef8cd78b83e56f64a7d7f10ba47c92a37d74a7a12 *1dbe94d6dc3c6f35a37147930c9e6b339a35ef0ff29a916ae2859bb3a236a9c7466e6546ffa039 *f661225c16f22b5b69697c6bb04ad4e9ee97cfafb3efbd0dfe030c0d7442ae41ba83dffdcb4f26 *fc8647eec2bf3ff556a7259157f1e84693ae43be87273291d5db81610406bb789cc6e9ee93353d *4e7777d5fd670ffd1b7cad6fdbff15e1f6ffdbd3ab7fcc9400fd2d3f719feefe0cc8a3f2f7f028 *040cf00b5ac2123540e9131efdcd17e74f02531ad7466d1f0103059cbaa61a874adee6c0a3a28a *0d98c2332093919f22b22d13795258cb280a49a9c62921902554fc169f68da6b11cd162ae45da5 *de9ac6714a939cb350a03a22717e198b441f0319493f690a16b96311df884c19ddb4f9520afe34 *9a38659f0019d6c54392c3231f2e3447d0687a9325fb4b9a2f1749a63e7b82b62cf587a6e44d09 *c1ae42657b8584c3b12645cded180a53e3e7879fc0917362a1f7c752bdbfb04543a34f1217e759 *1cd687b7474f5612d599226c11802859a5e6808c1a4b8b881c674a89d7e143c4274701f08a0afc *11b6bb623b3df599c262f2dc572fff6f1926fe3a9b413ec1f6658d6a77114b125f214987932b5d *58f41993983b4fabce517ee48d5304b2b048c87221c4a21f4bc2eb706d8a242ecf53ca00e79743 *ecbe50be9c504ec809166e8e50ba75eec2622b02e5748a0c4288170b6c67a93599a7ae83374e51 *49a39cc54f5669523b21cd77b87bf01328ff22d3c403aa2c9231c8a39906ca9b29f4b2422f3ec1 *5b56a1e411229b8804818687248aa89028bcfc400a22390a0a1a991b8498bb41a97a32e510784c *69c10d04078e1aeb3c1d82fcc5b44a52f82846a4b02fe2aa868574858654224428b5a0163322a4 *62527cf7edc401dd705f738ab34d537c1e7fa364f935ad70362e9249baee8289667458a19450f2 *cce45f14e7c57670bbaee39fd60f942aad26d2ca3afc26adb0bd3f8956e6ae59bbd34af431ad04 *9760d0dfdf7cd9905876a746e73db19c1f8965112ffa793470d691fd462dcc1d5bbe9b5a12fb0b *6a61eed8f2b3d4c2dcb1e567a985b963cb47d4f2e68407d4c27d482d15e6f3c2988605e4b275cd *f97b72891fc92558d6f360c04dc2c199e885798f2fdfa217aeb21c724dd30f9cfd59f6b3116339 *155e5e36bc5dcd4bb32edb9a09bbae20fa79d29db0aff3da6e7449b37cb86f2a82184cce7c45de *b493432c0f02636b3a15c966b6d5eb62569ab42cc1ce3ad674a1375eab693b92f25a906ed3ad3e *5c465bdeebce860349cef44bdee5fa6563325f67921cd6f7fd0d73b88ee76665333a2bd570254d *bd32bc43ea6fed6a73fe5df4c27c5c45b3aa4abd5eea1d675cbee92f47d3cd5cb5596fd4328eb3 *81311a85a7c581ab71437dd666dcf661d55d878d2a5f376be2696895bb72503f0db776bc16247e *34dcd777a3aa13af36d7384ddbcb686c54ab8adf6abc8ecd65da0d99b2d766d7fb5cdd65b37878 *71176650d1634df72b9a646d466eae1ec2b8791e36ca9b703b1d27dcf4744dfc91b795da33efba *4ca7ccf81f7cf9ee08fde177c1fb203dbb7deb7f1d627e7289fe2094017490299c83ff8948124b *26932e855c5e004a0acdda67f6e6d8f65554a4a8cdb5303d52a87f0ddb7769cc0cc29bc2bceb59 *954ea1ae3174122313639e9a6fb17d3423811492e086485c79d22ccad1b41847ded129f5ca61a1 *8b46ec34ca5473a415c3894fdb4d0bb91e854a89b0cfa94aae65a4cecd51b50c0354192fe76775 *3ed8018562b98c0c6cb0dd2fc5b8372500c2359129b7ace16e7c0c85c24dbd07026c85c60521e8 *c5315c09836796cca579d23bd39e1c85462ab9e8d846d6dc02791d0163c13fd1a94c21c77b5a1f *edd92c2f4746471a86b52945ad8086689ea4fd3f401958809406add1639b8696332a98c032cb0a *165251b259a40ec284acb2582cf27e7e7b6166041b0bd727b85e60b123526c834818e37795d486 *58eaf256116bb42fdda3b1ec5018010ad8600e6852988e47d4ecacd19690263de13c27a463f456 *2fa2b6f4842a9ee8594fd083e39964c08602cad4612dd3f0237c02d62e1e6e38961abae1bac6c9 *d0846c9b423cd51c95b6d1aa50c38b0e2e105816842482d837989049e789431a03fc42cf39aa5c *01ca8854dd2e9008a59e643c103e43e8796c60cd52aa92935c3d4b390e35c26b3ca1497bb4158b *70af3242e898f2206f1887365e5fa34c7b9b2ea687c55f93cc07fe4dfa8bc1bf5836969b341d13 *0498f8d0b0edd2b65e4c152b32aafe622b58a0637fc0bfc96a10c834be0932d73faaecf2d9541a *4026fc10641c0340865b33c9802d9a3167faeabdc17645787b437358bc2119705f540e98bbdb76 *6b063f0b410621c632d06cfbe2a2d9f615bf7ca9d5cb43b7566dbf33db0eb166d1770df7ee4eee *f679ec76eb5fe0f8acd1d0c85daf0671f0bd2733a76d35c73b2668853dd347ccbd8bd5ee7fe60c *0b18e39a0cce6c389096b7aad2add752b31e5b26d16c9ba9394836b8a17fadd9de1a80e68adf70 *bbeea956ecaa058fcecf67c97f6392b15fade74c34c8b9a84b10b3a156b92f21267a849818de40 *aff7dfd360ad92bdb774d73bbeae8b95165e81d34e0303fb7ab05f8ac0d5edc3e874501bd5a3cd *f6778c9194d3fa39f05a73db8b2a2745c9c44ee6355229d89b8ba33476e3d6622fb872b721bdb2 *564dc86b53ce8aa2402dd76d3e19d4187bcff1bdac16962beaacbadc9ef9fac4e98de38e720e4c *d60622f4b7a9b8d9d6dd4ccdf4aaa1063bb553ef4ce5d241d4651f2ee5601a7b4eefb019941b23 *a11798bbfda696746a96ded18dd5d93dd93dbd8d67aaeac15d91a9b6d1835b0d60e67ec8cc671b *7b9d8e196e9d393fcd62b6316b5d9a3cab7066e372a894c2732f5858939dba8a1c6e7088b456d2 *1637ed5a9589c4fe72b617b787b436dc599bb1aacb53bdbecdd473a71f6d8fb5497f331ab797e5 *e3b293b4b376c935875eebea2d4b9bfe39ed1913a6316cea22dc6a252e9abf6e2647a9570ffcfd *9e6b384660b5c7cd4adaddf1616930eb6a1dfe9459f2a4b4754b16d7b856eafff0cbf705e76fbf *00dec7e6ebe23bffebf4f2530bf407b14b4c7a9910baa03d258a36610006813f04573c8d82841c *65f09fc4eca244ba1c12c65a09895a70324623824c46cb1cc55a31f9b73e33c44db1d944a1b437 *44e568431b911f28053c32a9e0c602690c3d29c3403485d0a392f84e4aceb03c955e442a5a48a4 *85541ce393a3c8a851085e80ca472ac15682b401416c460ac368534de11cf7841b14aa7900e7a1 *6a8744938e0a1e5721a88959731aaa410de4678e49212e604a5628684cc261031184a028b2c162 *6089b2a6197e26ff840221788630183d8228824dc94693a5a5c3f3c2613c2990e390f464e81095 *8fa81b48a07d46976b2afc287f437fe02f67174074382c55c374bf40e6328280d45d186bc1c200 *bdf374d0458327da433fac34bc1716127d59231aa7e230d25708f02060070e28ec63e0360a6970 *9425e1a9377621425253ba4ba8fb154e35477511b87843d2bc820f0f49c80b7e34dc4f8f572bb2 *82846882b6d12ab9781391024c64e4f682651511015e48a8af33458a7a830fd27a11e8c0657284 *c76a1035ae0a34d7c653076b4c451a3ea64ed2c71214b5dce27ed2caa434042b91087712dd520f *128b5b50a147c56a20f750824a29358096f4e4238f93b1a42a9650b5116eee94c00ec806ce08ec *001a8f3dfc74f43ad6ded8e5f640c6c737f626fe48bb180b64e5d068b086b7259c4f8db4643914 *8bc1ff741ecb3378ea9c1741ff016ea95f915bcc6fface5e67ff556e614f95d3676ef13ee6968b *311b7d835d1884971f6c19bbe1077b6f95ea5ffeaa652c5ef4f7e1b0bf6f0e29b6cfe3f9972d63 *cc5bf165fc1d2d63e2572d63cc7f507c495c6357616ec517ff49f1653ce2dd9f2fc03c6b1bbbaf *0b320f430b33256ef9b86decce2a5dee8a670bbedec3dff7155ed8d9880f57c7e1293fa4fcca31 *462b5554e6739be9271120c629cabda0aa9c27b5566fddd5ccfdc658a94ab3b41e8872a9320bc4 *a126c9b0b8bed94bcb4d33ac4dfc641ab195acc31cc67cd7987857aede6ee69795be74ceaf56f3 *2a3bfda6aacebd033f711ad1789a352fc2ac14aee4c9f295f7f2d6e8529b3bc791eb3187aa5bde *8cd39666d75b126b26552bfea1b631e69defc9a26b9e06a77c26cb46c05a8dcd66c875caea3eab *a715231d2e446174a90bada57c71d40e7bc8fc1a33c9ae75bd372bf722e5e2cceb96a4ec43ef78 *34ce133b53fdcda96147f593ea99597495375c7ee0a2c49b1ad5d9bae607a1587799b57eeac243 *6abe9d95cf2736cf17abab73b1c47c2f75838354bbc49dec34c995bd6fa60b2b1ccd4ad1b1b91e *c77ee78f7642fda9b0fc531cff7064fefef97f8fcb8bedffdad1f69fc216fd30fecdb0e597aecf *1f442d0979656048166212345168449d9af53162e5103ed06ce48915090a0aa6772f1409fb4892 *22548f31bad3a8235f2cd4f09f64f945b20b14a82505079b22dc13962a1f1049427803210d464d *02c63c1f573b2810821d862010f50452ecb397a99083bdead43f1693e369c87ffc093c470aab2a *0213ec3fc475f06744a2831a4fd50e9132cde253e552f87c4dc14818634ef25a4070a1c63c0811 *b1e78647f429f0e8c34f9069c1b1852ca4c4394910f0640e83328724b322909b8af2641f505785 *24fe2595225b723888124c87c3c742288e78479d4fec330dd8044f81582c9a82a5262dc15329fc *0d4227bfbe798c1a212124874b12af7195008f1c2b1432cbc096b090647aa9f30ace55f2b04e40 *92a82d41e533b4be4c1102b032c8637900070253241eb8066311e100b8247bac79106ac025009f *c372d46a9591c06d4a604c942852d52422a15c38938fdc1073d824c6510530a36b047d8c547c19 *7c204ee5d17943f90abae2d06cf7d15c23452007ecc7f206d901a7645c09bbc451379dca23a914 *a6211cf5c8a58f233622d96dd08f8ea93e01b717a0951a93f1a68a82983c7dbe26d2dc5084f7cd *1b7690ad065c744066452d12e70c497704eb9809fec9d3358e4c460aa48f5728f69bf19fa9e539 *ad7c4d29a684c46f8a4823b645ee172a368b99645804ff84e79b2cbe98c68bc5be703f525db191 *5296976f52cad9fad32825708df84e299d374ab9c14611532f18d7ecbc0faa873145ecfd4b7340 *e1fcb553bd47e7d22ce2d9537512b75e7ba3d3aba59f99a29aa29f06b0d1c50acbccc52feeb5e7 *4b83d9c70bf7b86ecccf2cdce3ba313fb3708febc6fcccc23dae1bf3bd0b370ed493f5452f9e6d *181ddd62c62356776b95babeaa187aeb75ee57945a990bb6d24e4bf687951b56fbd5d5666bf2ab *4e5e6ecc588fab8693c81f27f56ea53ad638e692ce6ba3ccaf443de3e0787353ee37f5d17edf5a *04ca341c9fed5757281d0fadb939b49cf2f6dfecbdd792e3d8b224fa8eafe8c719e39d21b428b3 *6336200425a8f51b34b596f8fabbc2c1aa625627babb7a776f3167d26af7aeca4c92c0c2121e11 *1eeeeea919cc6e8330d5042b741a7d6bcab54a712f08cd7defb09b0e9d6e7c2f8f16c178904cc3 *f64c0eedb538bedeafed271f1bbad8393785f9b23e10f6ec1652f6acccea8a7332b3ef99888b23 *8722907bcff54c54527ebc6787ee9982ae4af9e0f9e34cdb848f2aa7ed27f670e0dc57e7d3fc58 *351ad56be08fe2761a569fceac5f5d54cf8b7a77b3b1935169dcf5abadcbfdb2dcd60ec2f222d6 *876b35e67aedeb3eb31bfc75a2b71fd74ed6376ff3e5b6e437e7d779d54a353e6e9bcdc6c1efb6 *2782f23483a57e5c1f65e9308a76cba1f59873c7e8a89c77a3c058b79e9a9e3cabdd6de3d6ec96 *974bef1a3ae1ff8b447e1769ff88b07364fdbf483fe0fcdf37fef8d951f94f8a3a803e1434fe87 *8042a47e1050fe37845c5fcee42a6af65075f8766be09c804e1581b09f371053d6187db48a5028 *afc8804fa010dd8274b9e597f81771ac14c2530cfbf0e0d524b0fcfafc1aa03ec8ae5f0086228f *84dc4b11320811941a0dd891c50551878a1b64f1000383614489e600d2862a7ccc187061d88abe *29d0c87c1eb718d041cb25dcf5af99778d82313614a4888e9e69062a8d02e789bc5f488492b901 *e61d83810c8746b068a3f4b140397d86888d82e88b442d1072c402b2dea8fe28e8cf08c0de09d0 *4b132584913f8f21f10403b85f88d0896461a4aefd2d8e0bfff4a883478d800d2a1963a216c082 *e23024e01ec30b833c3b221a66369bf4983aa7a277e4adbf14fa051447d8745680dd55d4b25488 *84aa280ffac24b924e7e0bb4192e67fb1995cb22ea0833e0b7c97e9345fa0cacf3014d554307c9 *4f213214f579bdbd5c4619904d61192506763121dc353584372a99625058429ea8124de45ce3ff *9d6596577f484d20a0f92540e893e629ee42c6d463bfc0021e294488f2163291341f8453d9d586 *60c3e562a0b4ce04faa018418b08ab42dfa0c1796fd761c118bb29723f40704574b084788709ac *00c8d6c0a06089f4541228ef4954a7fdf672f20ad0be451da3dd92edbd677f03718cfdfef213b5 *1216129a2ed89b2a6d105a850271164089b0142437401ddd46c217c3fe22487f3c0ae9d7579665 *f5f696d9337f044b2e034bf771e6748986f24ac857bfa2528fe125ae76ffca1c5a7c0b24c613e5 *404834145d7481d4ddc62d907a9f26dd3986aec7c17643c9f38c18433dde49475be316d93971aa *33749e9e3d7a78d948f4ec3111a7b27666f29eede17b1c7dd373c3878dac73ce75aa6c5ed877f8 *bd5e627da8978caf0c74137d6bc1a1bf62501904a2c1d33dbd6ec9fe03b7744fd374c97d4e4b62 *f1dddda45f689afb7addecd9cb656f7cb94ba5cb61bf56cbdaad96cd79e91cd7065cbdaf06b3c1 *7eac4897e95018e97ceba68843be743865e74b53186e17334bbd5f9ee5d9e9b9e27bee23be0d95 *4014fbf66e5be2e332e71fe4e6a6bf5afa9dd66473992d4eb39561f41381370ed6616e5f9af3c9 *241a9efc855a1b1951a726a5e3e5e1dade468d56f7103c354e1257e5703a9ef4c66b41cddafe7c *537bf247af799f659d50b8f783a7e86d66cffe3991ba8a2f4c58bce7aef79dde78546bdc77c985 *2bf96dbe971ef656b7dbe3275363febcf3e567bfac48bb7a253b6fc686b8b61ba971bbda5e7532 *0df4cd6079e25ba35ddcbc2e2c6fc359436f7099ece3e83c6889a3b519b8aa5a2bd703719b341b *ea71d5b7bc20955b1dfd78ceb4f1602d79dbd36432ed774cadd25d5c76dcca980b665c19d72f82 *18959e1d291976e341e3721d87b6315fd70fd9bdd4eede1c579557138f5febcf6ed34febfb8d59 *adb45bfd33e7ab6aab7aeeacf874adbb9ba1d0dee86b59319afbb8b17e2c02fbb077d5863dafad *ce6e6cdf6e8a3b4d1d2155e6e25c98cdb7ad01b7b1d64fefbc90af9340bc8c8345e0cd4603653e *98cc1dab513d8cfb4658be2c3d7f568ba7ad6bc33c29b23356d48b134e1b3dc9be7183563f3e55 *1e87d652b584f1b575db374bd57e3f56eefcf2213841f9a106fad0ea8643a77ace7abb9560a8f3 *7da3bb5cf2c323dfea72f5b11f6f6465db4e4b936d697432cce6a1b93d7a2d6f685f6be6b93558 *c75da122d5b6fc71dce98fad8323efc389303f36c4c955ee7237adbf93078bab5d72c4fdacd5bf *197d490efb3befd0969f9d68342acbab389eef33cbef198bca6a3a38dcd603711d668d7e3d696a *9c1b958e0d7351af5cd4c56ee997affb4e39690eebfbfad3e06f257d515def9c676ff67046b3fa *731e572bc3666bbfaccd8eeda1b2ac4adcb53ed6b6fb89e60ee6cf526b27f9bb5e77302c0d6ec7 *b57b51d6bb9ba6375cfe3a1f36f9be53cb92c8ae89abe73c39ee97d78e9bd4b9f1401a968c3418 *cdb7a546ffac5ecf15a35a923afc7aab64e5ae9bccb6bd345a1c066cc3db9757b7f5c69979fb73 *bfea99e5aa3c9e70d92669e87bf6cc2fba650d94a633283d1a222f8d6ef6ddddd61e73594a1652 *f3b6304edd92608d82cb60b488afcd5667bf30e6f326d76f4fd36c7b60d727f52a6cb5b9318b03 *9a83d67c33beaf4b4aad72764bade368164f92ac599f3ec26ed849d57e69dc50fc68d56a71f3fe *55ce925bbd697607e346ad7fd0272edb6ba6d171ba6d89615d6c5697e992f74a5ef53633fabd48 *144efdf5a1b28826bda9b4be708f4e36756691b9bcba7b793b94c7c3961628de59dc25f37ae84c *95e1ec3cdca9bd447d8e9a5963775b2d7ad16979ed05bb693d1c35b861d5aeef859ad36e5ca66d *a3dc7a0edbd365e9a645077d3e0cc7c7daf3e09e96b74b4b1677879eddaa74f79bd952e107955b *b3b97faa9ca8cd4bc6e96c25cd9d2d0a0b791f94efe5c5be37eed73a6a75d3d96ca755f7de9d54 *c4a537ae37af35ab31ee966bbc350ff7772790b8617aded492b026dcd75167b19876ecdbdebb07 *bb95b4a8d63637a1720aced7e6acad07fbe1c098cdea6de1e0f1fbccf555f9d95836b9c6f339bc *5992a6ad3a651684b7af273fa86cc6e986bfea7d4f28194d36e99665d35ca60b77db90c5fb62a4 *df32bedde956578f87cd8d75b5575ddfc2d6eabc5fcfd6e5f8c24664269fb5f5ee6cd89dcb73dc *d9af1aba33cae475cd6d359cdb6639563bbab6cc4ebdda3de5ea9279da249bcc954ffd7bff7138 *9c4279bb4da4b022a893f4616662bdbb186696b9564a9724709bcbad737ee852f35a3d86eb96c3 *6993b3bf52eae134d0fafae6f63caac7037f9bc807c7393515f7eaac574db6d6a555b8ba98b625 *5cd27e273964fea29399a5dd6dc3d566cbf588f7ef9b4e3facaacea6651a75b6e54ead49769e3c *d22cbdb736e94e6b2fd8b1e724fc6ea897d7b5ebbd7c18476775b0bf73d5c1b1ae84ed43a779b9 *75a66e79d1712bf752cd6beed7e968a9dab67857bafcf9e21eef6cb50cce66adcb6f35afdabd4f *64b73e4ab8a3a284dd86b2dcf5944b47361b65b375dc1f22fe794e1459081677fdb8610363ae3b *e6dad97407f7fdcdbf5d79ab27283b79b69d7171acb58ee7935d35b2dd61e46f92ea79b2d0e67e *b39d048dec111fd839388af8a4a7eb5ae39caaabc178711fedf86ee5d6e8778e37aee6d54f1bd3 *39da2bbb3f91cfa77e696af3ec78dfde65a5d59eed84cefc3eb96c84ec799a3d7ba6ab543a75cd *f394921c2d3c7b6e73a6be8c77cd7af5be2cbbe5ae65ce3477546956bce340ab1ad3b92ab6edb5 *d0e8f595fe4488cd20bcd6adeed65fa75ec6f716a3073bdac27d69e22ae95a391e671bc91cf566 *e17462a5f6fcd1ea95fd9dbbacae17eae9791f68d7f5ca92779772e298d5d622dddcc5ea73cf5d *d8c1e61e7cde1013a33ddc2fd6d6fef9b857b4612fec59019ba2463a4bb6f1bce2e8d5b26bd716 *f36bd46b88d96695a887e8f9e4c2b5761ba6eb73795e338649ac1d8e4ee9285d97266f6d8fe3d1 *4ebe9d946aa8d622fff4888641c6e670bfd4a8d94b69345cadd92d3004a2f8d711afd68eecd0d5 *85b3691b1371a7f79e816ab0f3a2bc4fe6c972a85d9a9615b0a3bdacaa0cac0cf930ad594f6551 *e3b61dd7bbf46333f5d4ee61b9bad6d6e363c9283f6ac9c3ef18c1d1a8dea3d97a33edc8c7eee2 *7aba8feec3ceae32df97b5a352aea75dae5f0ead7ead615ebdbdd61a7722c97e4c56ee46f32bfb *f36a5ad502d3ae55cfcaadd7683ef64fbd2b8e86cfbd645e7757b9735ab57a5c27535b95d2691b *07edb019370c5f5dc4a5f1fea19acbc97e7fb7b74ef0b8d6c4ded80a2ed1b655da5db77eb0d11a *83300adbae77e0c6eddd597182456a13c2286b7134a9e9c131561fbbced06d64cae65a3b2dc7dd *ce74e73d4e2bc5a9ddce7ae3f2389893947fee86dc70a72786c5ef63ef31de4ccff17a50f6c68b *45b6d45ac1adbaae29177b362c89cbb2b074f7a2940e361d692eb1e9e53e82580af79cb91a3b71 *3a1c369d6eddcfcce974d8949bc3891a5df69aeb1cc4aabb5c971a757db7e6b3809f9facf6fa31 *a8ae22a37b5e8f57832797899bed6dbd1a2cb7b36596340e59d8183afce8d01bb426d3799a5c8e *83e75e6f5dcda5d1af1a4ffbd079dc1bfe6a64559d67501a2cb874a0e833a9a53627133d7486dd *e98bc2fe2304aebc20b0d9ab8cb7abfeb19ece0fd66894710f553d4c3df6b1876bf5e6547b42a3 *3f30cefcaa39efb7ea67697f4bd4281bb79eb7583c2df4ede9c8cf9c4b4b5c769ff57b5fb04d6e *203f44fbde15d697e6a315f6d5f63c6b8472723a1ccab12d75dabc549a8bad639701a5ecb6385e *976a73d43ed84b25beb62bc950e7e65169ac8783d1b01f4d0445d75782a92b525cdecc66db79f7 *722ceb81afce9ed7dee9725086ddaad859b71f9bd162103adea5d955b82d7f09a57dbbdbeb753b *cddd66cfe0f47decac532398f5caf755e889fe645bd6ab526ac582ae4c7acaa15faed96de356e9 *efb5a4cd5ddca73b3b0b0c5fcc4ef5e72dba8b8ad9bbeda5721686c6ee30ddd463b76e24a36718 *25f7117f7bf6a4e9b4f30c1bb11a7bf5669fdbec9a72c4809935594c375afd3228c91badb65f37 *63e52934ee4351bd85e6fd341b2c860dcb8d9ca95f1546b2c9eb8bc134135a31b74fd5a6d3598f *34a392deb6d5853e1847427f917515aff73c04d7336f0f44b53dce84c83ff4946e344a12f516f7 *b65b49082d39e2d82920cdcdfe7cd4b2c3703fbfedecd0980e96b75098def8abbc8e6abda16664 *8137da695db12bf0f7b4e4a9d3ddae778a47cf479f5b6d9360cbbb1bb6dc0ca1399804f55877ae *d6e861744dc5bb6413d3b265ffbe5b447e345284f0d6db974cbe13da8d9a104c6f32d7ab3584e3 *c315d783dbe271dc27617523869551a37ce8f684a528b9936330179ebc3fd737879dd82c49fcf2 *38ad3db3b5ea5d2de7c24937a512f6a4f22e7e6487d3b93694d3cec409afc971673da45574dd1d *e3e1d5bc0fb7eddb22eaa5bd78a796d76d57295f5910dfea70077314d50f87d9e2525e67ebe7a1 *7c4927874959133d651297a7937aa7bceeebc2aad12d29b79b5bdfeb4e25bcfac6bd295d1aa9d4 *e4da8db26e2ef974781fa5a7a563d81edbe8ecf2bd521f8699bc33ae83497f75a9d8cac94b8fc2 *fd228cac78ef30c4d76a7949e2ce386bafd6b4d9f2dc3e046c3b35fbcb5bd3e75bede93e634793 *7f96e569ff543ff71e595a1b57b360555b2dd8c1d64d7a9df67cccab672ed89de3c94a726be3eb *f959b1ac76afbe3cdf1e825ab1faabb06fc48d766db77846a7ea65696e969eb0b8af84a321dff7 *56786018801b570682db58554bd6d96f789787c76e647b570ebe219456d561bfb5eddeec5de9d1 *dd2fbcdd78ba794ee469a51555d828357be179c37913c38932a3764e9e95a519772aa3757a79d4 *e67ecf3b9a8aa878f2c0970c4395f979b63796cb95ebcd97eed88b5a2bb15fef9d38bedfbbb033 *eabadeaeca7ec216d6e2761a8fcab7c6acbfeccf7713d1516e5dc1ab277dbeba9955cd84373a91 *edcf2e71b3163656212794a7e16831dd3e2e7365b3da9457cab47b942bc353ffdcea8fcc8e5059 *1aadb6da8ca4c0d0d7fdda6359eb29b5e15daca4eeb376bf73e13949f4e0a69b2beb6038f5eda4 *270e2bb3e6222cf1bc325cb0edccea950f43ddd19e46b9b95c2e9b51f66835f7fc58ac3fcce692 *8b6f8ef34c542ff276b7daa45fd9a9f778b38dd6a7e679df0be3c8d0ad5955946bf76ddf98ecdb *dbf13215779d44abd5c24eb3693b9c215e944eaf972ebc68bad6eec1be73d455beb539566aa572 *f3b1c9ba92dcacaff8c3fcb409855a7a6c9cdba6147594d89a9de595cf257150ddedeea3f9d961 *87fc7150c9e234b9ae0d2bee8d13af6c5c9dea465394ed2eecc79587582b39d58b7a0d6ffcda5d *55ed44e1dc4ebbcd77a652afcc8fe5f25a0cefb3ad7477bbc7b0dd9196956aa42cf978d93b75a4 *d169b859b6b782b87e3cfcf46637eb5db56a73faddae97da8b993a694743eb2ae8b546456c5ea4 *b6317f464d86b10e59fdb06f370625bb314ecf875b6ade9f8634793acda6c90e6616783a7c9834 *82793d111b465352d9eeb16ee907f1598ddbfb6c55b74ae3bae09eab7a732dc4c1cc5cb777fbae *1a8cccb69368b735175ea67da57decae17fd7549e0474ea5d1dc90d47a2f3d3c97d5556395f69f *83846d34a1530e0f756f67acd8b1ca7be34a7761ac532e6cd71761ab36711a7c369d2eedf54418 *a7d7cc57aa8dd54376abc263b3099707bb3ab764e1d96e0f2b59da6f6eb67335bb86d3f58e6bec *16172a8b4e47e7d565fad0e7f17afa58ed5b7624c4b54dcd5e9c56e7440f7783e3b8aa56f7976a *58adedf5eb7c2d47ebfd6634e286adc83eccbb53c56874e291dd9ccf37d5eed050d3dab1ee9fef *b1323967fd5bbf776f8f122b58b5974b75d1285da2504df6fefdb4e1c672fd78ee66cbb1db98e8 *cdebc139cf569b345cef3a96de3f4ef8ba39f4ad797ba544bdeb7da7b95e2c0aee745075b56da6 *3ffd2657eb358ee2625f565ba747a52a8e46e3e17272eacfd38790f2969065662c34f69922e87e *7d1d97cc4ce0bbfb89ddea477dab7ea93eb8b022197c2bbcafed5375501576cab0e5af8cdbead8 *f1a2ba3559d6188ebcfa43f1b132c289296a8f534332fb7e7ff708ab7610995cf7fcecae0e8f96 *dc104a5b36ec47395d962edebe2a84a3b9b32f35acbb3c1cb807b3e65d79777489baf5b1dae8db *ddb5797c9c7d85f337b7787fbecf466e3f1a2e8f6ed0f507cbe77a9eb09361c09051f339d10d31 *e846caa1c25eacbba6c0fbc9b897ea52bbf5ac055c7ded37f96ed4af1ec6533d9db4aa8bdda5c3 *4ff7ed73e39adc2ed37a6a26954de7703ab04053728ede68325064e5a21cd6cb7bbdab739af198 *ce775177bf9a3d4aaa335cc5d3e65e191b66efb10eedcbb0b75d9a0fed1a1d4d53f0e7a977ac26 *b35e6972cc94693a9a4fd69c9b19d62e489decd256e270355c2e66cff5d59eeeafdab4cddf6fa7 *d682cdf8a9a8f7d36c573b4b87e5707e73ac93d9d9d96df97ae2c456904df76ee75ce99f2a999c *685e4bec5bcdf155eb6e032350c2ea44b5f6edcd3195872dd91bd6854eab5709d46c59d687bda1 *cca9c6f2fc1806963b8eea9dce637cd67af1f5280d7ae96c6a4f69c8fdd2662d1ef4b3adc54b27 *34c2cdfd386bf62e89e309b5758fbbedab5b75fc58ec6a91b23d0eedf6733e6deb9b41abbbaf97 *8d4af2d8d64ca3e697ca6d8501fb4b7f3badd52449e385b35e1d2fd6436e74bf5c227753afce2f *c3ca408cbccd70a80c1ec3a5d82b09d5be26b360d4f5b292bb9eaf7cc93d94babb56a3ecd7c7ad *877bd6658b7b3686d79e7b537a69cb2a6bf6acd539ef13416b34d2eafc70ffcba9c1c28f3d8b7f *a2a5f1bcf085dfafc87fad2be7eafb059589f712f2afcb16dfaefef74ae85411ff4581dda0fa85 *57a8846efc6609dd3c9c7ef945fafe029197b4cf4be87fe16dfc936adeaaa4ff6ed1fbdbef1456 *bd63f145ca54513325153a70dfd837251fad470115a8c282be362322ca612050a53512a9642840 *3d8e9a8ec031255fc1dcd1aea856aba0ccc6d307250695d024587bb36b20ab2dd46ad9252912d5 *e43e7d074145a53ba0529f2652b396eec3663041fd4fa19a35298b48d4daf4394b15c57d195a74 *31488e327c05491724266543220de736e5058ce1180562035ee46c107cd42cd995240a18c0681e *8ba0dde2175c03893942bddfc845cac13f260a8106e13af9f5263a0c1b3f7f9a0acc1a50fb5441 *2025ab714803921c27eadd2a880d5a81560d35bca1b5533188001da3654bf1e9dd14e89147f041 *60035264f048eccb986a8964d920a0ad32224a26bb291da286010454c2a4f059d0b3565f05695d *a15bd0e1e340e2eb0288a520b7b2b14a0a042bd9156a609eb2eb24850a9d5ae6d8048b04aa70b2 *4f57352ad04a320dc5e71c069916024d5d7018780db46f85a63189a983916ae8345183227b469e *ae5f00293582e9a5228319023d53226d4336d28fa9cafaf935403084872f869053117cb8c1a9c4 *abd551d5966105a71630529498f8e20258c32445e2d38d93c59d065a31aae3d4f41ad0087ffe34 *457a9a89f8b5790fa40b76fb1128c3399f57cd9b0f0bd6051fc3b0147d952a04f523cc6d5e8060 *240ace7937ae56c0ff663b00f55582051e424552cc35290d7a1c3c082106b8317ec13b908d5f8c *c71d40ad47a36117734a3a34f81388a8b291510b7618b6bd88fa4bc853871361005f1535c0130c *c07290a0ab54c0abe121e14ac5762c64b2154c20ff2f118945f6d1882dc2d2b3809122c0539476 *6681b811ecb512da18748c307bd66ca8136ca142c1ca229eb14ce3cf838111c10381b47a60f212 *41a994ed3fd45e5d70176c2d68108a652f49549a93d4058136f0507d69701a20142845b2bc02ed *d5ece2d9502ba04b451a91b803b0add930aa7031258e50d1ca1289a2e143e4891a3cd05ce1438f *2804518a9825e8f7900be66400092e3fa42e02d5a00f627fd8548f20264a3414fc93fd5728b80b *01ef407ead11cdc610b42e627524afe32fc9a933c53bad2410892b90d0ab8c75c1e683869d9668 *ef39f903ea434516b232f676ea125169040ccc04156d333c1a710d28548941b1b8b0480c1511d3 *5e076785ad0e36c702880eb37f8a388f84f883e6ebfb576e39cb7e81ad47f2dd95896a45ce1b3e *6df52409868792d3a83edfabe118ace45ded099db9017a986318f0aaf8660cc101bfe8c4115f9a *c26c53d5f0c210ef20c1034843db097b52ecda94227d00ec061a8e7e15742211adc3a43bcb433b *167747b4a1826b107128502b8b483341c45949361a504ef0fd97cc189b9045cc3d76a6fb303021 *c92cb86ae8f0e0d4d000c16ec1e7e91991a66fc1da24a89653af0c080248f4a10cb484f00f2292 *93446fcee66d51d793008d6c5a0b3ac10c1567bd025f557647a4f28b7e1106e78a9018311871d7 *ec83088961af48a0a0adc1bd951d586c2e1962e1b9e9e70d421a6de9b9b733fb43de491af61678 *1be58b5d28600fb21163634e5279023dc1dcea55c153d0212291eb6eb3212df2b412e19fc5f652 *72540d20fc6dd0058b606e31541640b28e442d0ad6263b28436891b1fb25993d74fbb385c05e42 *0ae03cede1eccdd9932adaa38864062d3d368631468c76189d26181d37f83bbb06369845d7a063 *730e73132b0378f8ebf942c2c9228d2a7bd632fabb3ebf8684d09a08cd6606f2a95b0c4206d45b *2fd01647077a04e5c222ed0e001e82ac3e0601f2e5065406a39ce30a90995bcc7e3e923e561320 *b10c8571b64b13b88a5f938a7d8764d6799a369faf2c60668a44207cc17ed3077c224c8b561cb6 *4b50bba056b836c9020c67848f754416b9b9c56fde3e25d09b24d0552fc251b439c420acc6b4d7 *b11d8f3dc73080f55040cb8aa8b6907e28b21ce7012de81d04daee18d461d38914bb25da580498 *b7fb10d6170bf66a159ee711f6641f9381142821e810c25048453361bea517f17219e091f30721 *d0a7b36741c83c4765116d350cad455ae18cd2d1bfa7c33248d55f8027c14a6403c24680f65878 *271771a4d9b531dc22c2619e94cb01a5447436b211661743016c082453b02ed807b1a108f27d80 *a7710b726d1901a6751ade1cc05b2e627af3d890255a92795f9d810897ad91085d9d2140bb02fb *b6cf677500997695b01fc3186c028739bc4fe8a061dbb50f1991382a7c9a6cddf930b726919f80 *805002e73e12698456888cbd8bf6f3a2bd3aa47d8cc52601da04134835b26d814e1c74efb11f29 *c07b45272f5944f3c40667b04d009817a04c18e73b5bae2daa001916cc281ec6853c8404d9f5b0 *e9ad232662c08cc12a9a1568ef4b403eff1c4f6ab464d84e48bd891a1a5c11a909d07de7012fe9 *f88868dffefcd4c371208101ccae9cecb954020c04ded0cb48c65fc16fb1eea92f20c42c42e320 *596cf974fe9261b68a9317c6822a66c5e7580e6a35029e7b00c442e22f88d444b8680400636cce *c405e7a604b4c0f6b418ba46ec020220401ebb9c0ad63dd9328685bdbe6c0ba2692023db00b701 *11b6e879ec238229acc2cb3c2a98d56c7ba1e8266f2ac6ba886144a0a3f55ac68a08b148858267 *412306652a0ab775c869023068c884e4fe860ce5b231291a0776e0c6f9a74b8413425831fa985d *6cadf10081d4180ad1d6cf31ad48af6211378ba4d8fd928308c63fce3f37a01d8cad11f64cc582 *a749e0397859d1334c28c08421cab72c441c3ed4ae24bd1047a9681ad7e01aa281894e4d193c9d *a1ec92784805b3703214e9e97c3e0ed80f19f066eb9a2ce7c177d7619727e4b675d8847d281317 *c617326d412ac25b1d20845d7f6ef21001e22ac12b39f0f9a9e783012fd2daa1d521d31ecb4646 *84f30a75a988b44d857ea1da2e9b8712300661f888f63a165505b9d7a7fc75cf0f5f8d3645d903 *b257f109b5c6f9fcc195b069c096762ee74c314b5888a3d87260fb097bf43c224a457cc5a76c57 *51919fcc7d4dd87c2b3afd2939a9d0cec6ae96ad325d79755608488589488d86f0d628d21f639f *22218fc766237d28a2367a07fc85dd117bff10ae364579181f67ab6440162aa1e18a21a340f24c *02421e9896b059ad14e91100deb04120c137ac4ab65a294455a1f41bd15920420a8a2f42e690d2 *659b52803d56827d47008f47eaf986441401a490e6f6e7bb7d8ce69088b056aeea45e627c6cb68 *9594ad457a341a0299cf77390d1e86d22b711122edc306962d4903a8dec845b2649a9c9fef0f40 *62217078048f229a996894a7167c44a004f201143f7f9a311aca7dfae810f937b6e9c538cd65a0 *380d9925412dc4d5014266b643922a79405348826d8b0f6d8500d9da08f68c72913644ae64a1a2 *45cb87689742a89eed516c0ba5fd132b82d229452bcb27d0286017a2158de418894d409b8ced0f *792e45442efdf377c0a465bfc9d6324302745ac534b508fe41d48ec1d118e6994ac1d3244d6605 *69109fceac10e95036a96829c1128996bf44ef991445491add35bb604aa649741974f86257f1a1 *b21142422e4413dfe771374f93908167162bb1e38fdd0b0bd5658028b664d8f1c7763f4a6fe20a *3fbf8bbc430d0111a920288404d82ea7215d10015ae8c8261945196fac5cb605491121318a0b42 *825e6c6990eb554c404e81dc62915688019d093aef72b32ea4a7f2dd9e5c8f79c88e84b4e48b66 *143b687ce84352f94346d902551836a3d838b039cf8e0f09fd7745eaec24320909441ecd60bafa *6a39a448191d94a415c1d32629142031034ed69470d05e9a7d12e247b6a869c344a68e1417d108 *f9f95e0d5d471e613b7bee24b0a223e8c3d236a02923436cbe683eb02b24e758085db29d2ad72b *21975a95ceb25c9b8f9ea9587cf2c6c85ec688d043ba915c755e06a60da045e123a95e74f2b21b *a4d98b6636fa650399768d02ae0426ae02b4ff75c88c179ddd090410d9ba20c14164050d889f1b *d836752803d22a2b4262e14b90833d2cb600597443c19a4c185b83f0bb02a97ef68c8282f3823d *2976d76c1b51b1c3cbc85fd1f52bafdc60825ba04da0e01a44e4fc032c49ca7ec4af2a4c920069 *034dd184910b9f059b8a21427552fed4e8bf746e86b43c09d761edd3482634ce9f5f03d488d8a4 *9511e22528c325b0cc6537a5c0a82a426771519e964d7ef6cb2ab2490a4a513af0586ee6904034 *844dcb10bb5651ed202ffc056847649fcbf6c6dc518fa224080069c8ab07057b5488eb14f33a6c *04a7f290ce501d8d8e6cbe915733d2387ac1ca62c0834d5d15f0802d10aa98c42fa775ca070a04 *b3d98a63571515ec7232820b1fe97d112da031aa1e7e6e17c6d3154a28c7146909c5685865e772 *8002a588764d0d10d7c70ec996063d11816669518c43860822dd380f9b080a3c7325a308c91099 *66698c92d6e74f53a4794b176fd0ea50a1dc13a296979b394b40a7ecda9482f91021c66147860c *0ca3e3c6d9628ce0894089855cea56a30bfb1c3fa0ae1d07af7d80fce245daebd8e0d0a99d17c8 *14185c173c0b2a8ca2e813a06d55c0a64a91174ffb9e8623801dc43edaea3f5f1706fd88303c84 *7049660b160c1a32f0e4d48d5433d5538af3932126a10019292adca0c93d4090c5e6408c741fdb *c08bb807ec31e5bb8182549e0fafca18e6d8ec1104384734d84c1675fd2bc0ffec3a3524227858 *5dd06af2516b43925006a828ea972718afd1392b419a5644e53d409230c2a2a3b21afe5994b757 *10d1d0ce2cd2aaa4d6e888c0002d2e281850de0f9ac345d966557f1558d9e4617b261b522a71a2 *c0a4a2d8c7502e7b2dc3bd7a51c48a36f9108acaec25ec2f246725210d827e620afdc091508a98 *243a2c3954ba9700cb9cbd032d7000b0bcbec6b61d1d2a0d45519206fd641f7e9fb95a02a5fb10 *5bf928dd52720ce63945f9ea0491b20aca04b55bcbb9f8c3af7efdb7bbfeff049f4ac16129a132 *2a027ad2243668f82498d1b335e9a35f3f44f029a3d0f8ede53ae83232b04e0e25295fafa2c28d *ddc44075367f486c770b20eef0ede56c4f67df57d092ce7e440b031b415ee6f791f6e551f60eb0 *6658f026beab69c15285a00f4f9fc236470d65c857791ed565aa252047ac2195f37e56854894b0 *8f8b016e0ca88df3805f3a8a311ab06f04096c76f2b1271abe4d024227c842e6c5f8dc7353420d *2f46ec1da3479fed4734c5814bde8d200d24f1430c9a0c9b56b60022982bb1e5a443cc584284a6 *a122455c96b7cd5d848352028d40b6958458b73134d629ad8c42207b9471fe1c55ba8b771db35c *ae40415280ce00d8c9126481f898016b27f6d02384df6c23638f987f9bbe6cfb66d0966a123a05 *ff1ae2707672c8080912e44ad8eecc2e8c87f285247da8c5e675e204883682b038892c224fa720 *2232a0ee906031d0f256e9fdbf4f5a1cdb01f86101d2283a72d0944c44c990dd1a657ca497f929 *2529de661d3bfb73775f42c6484bb1902341b0a4e40aef40d2e4708b6830c419f9fdd313c4abc8 *9253ec07c353054919b2d8511075201cd561bf65a81f705e00c516c2613ab23948041bf03c6513 *5546b295de247cf12d082ebc8b31e43c9e90f6b8086b240226e011e9515d0d17cce736bf326d7c *ef9974224f4838bc016bd82fb38fa6bd46a40741f03da6dd5680d43bfb290b093e982df1b04786 *c6468214157bff48799d8512ea28ecb521a036bbec00c1c0b797e7c6ac54c340fcccae504164c2 *3e544e5e423611742e1308b5105279dbb813e505c20458af428e111a3132b48a78c2f4e4ba24d2 *4aa1a20e7ee1fb7611a1a6ae530641c335d0dd61bb27ea15feb051a56f86749d92f0c1e799ad35 *09f5aa9c12c743eb8f12bea01b1af0226663a8a09244ea8208debedf7b806505361871dd7894d5 *416ca28a4548b32e80e4608cfc209b72ef202617940961b3cb8e5eb6647424d1280b86e94a44c0 *af4059095fdec8dfef3d466026d198f0a0c425205f320cc1e6212597a111e2a3ca4b2522e14329 *2b86e8a28f5a11a9ad18482ef09432a044584ccf9d408f4a733840e1f39dd5648086a5608761af *25394f24bfb49c3419c0990ebc100d19de106a2bdf4f19242344ece41102303680a4a318d1fa25 *4e5b48c3e2e7c5246436dfb55b78642264907b341c672162720df883400f802905c048f5b2bfbc *1fd52a12df2427c4d3e7b27591c0464206c8608f9e7cc5502d0870e53906fdf67201b7461b9a4e *d332022cc8e1af8fa18b20bc496e67c9abfc1fbedd3bdb0f35d481686c41308aa1e8c4f63a1564 *8b04d61a249e09a44508e66dbd93b531dcbf0264587c1cb2222a46616e129ebcf29884836196fe *7ef1ec3b04ca054af1f079d20da79284221c5b777a4ecb4be081007adcbb9384815590db54c420 *1ed11be26411b16fc8d8f97d1cdf11c4aa82b7ad92e16c0d952d9af03ebd950e0a2625d3431cb5 *f010209365e4b57302eef74ff741f0955ed5140297883d7c78f0b129adc1de4c44c9414211917f *1bba28275e80d82aa0702be320a3a98e0032ce25d250ff63d74316816f4b4640d15d4291554042 *81fd4e08b94d1d789dc61cd61074cc29d05fe53f0e5d8e5b229aa8e48506ce19dbf4d884f791ab *5551895150678ad40fb52511354e1fd544ca1a438b97748370a6b0939aecd315ecff3ad285fa87 *f52ee0d742c4541228ade4368e54a90a95d408753bf6b96cfb8d0070df970c9ba53c42ac000923 *1d4347fb92829a8181320cc4b9d85e21c3952478dbe77554fa43945425d07965b0ac24e40e0200 *031df2ad3cf8676cc6be6fd46c8e056003b0f083d0ac84043136c600d5505d7eb9614458b631aa *32df4fd89c52a9bfe26d0a270cfa2c05f94d127c82a1a48cc92f42c0e9dd3b920ef13ca18ce463 *9e01c97349394a61932a867d245b6b3176c2f73212255c402d8d80d964642bd88d2b387188fd13 *116a223498dbfe251fe24c1965785a1a70a9219e3d4a7a0660589493c211780be06d84e08e7fbf *77031943e4c87460ce1005121de91e1fdc233e801b0dac4522f9437cc81ea29883469f9e97060f *935ce959ce5199f025cf3b6b3074ccb39cdf372b28e8b24849c279146aafa41571f4b147b1effb *c64b9859442e8f7ff762946826502d5f405a2142e24f01e5220f345068a1d30a805c4085f5fde2 *73c93c7aeee0f56a1013a6b010f6870a761ef61da2308a5f727b9eef170fdc95605168f83b497d *47b440283e024144c8d909002dec9fef89548ad805ba6503f9d6108f8ce8cb70fd09c159614f5f *01458f5844ea07d68e047fc7fc3062fb8006629008025f98e7a691a091904a166108fb01d36aaf *7a3ffb44f61206c082bcea8c40c6874e32bb351a1f04322112c4dfa11128443a36701f11257b95 *06aa0a3b527da889b327c5d6a086dd32069beafb83d36997662f67210cbbc77c5a1a8899c91c56 *7d65f3a97aea43865cfb80ebd8056b486cd12165a00c836a1671bf225aad6c607d803d035c5523 *fa10c729b9af5284d455fecbf0878da11848743a8136370155e12447c56f7b5dce036377444410 *09e69dca4ba75c8242395bad62ce7e1368a9e63497f7054bee3da0926848f506f257e41fbc526c *54cd02862171f7e0432ec3c7731470020650a463c348555b81e6090b5179d0861270b014c480ef *1b357b2bd28d0b50b3c7a293731e06524b442d42f0a241f53a00cdf743040df6890e1d6c8a5c60 *fd453d4f01852d41fcaa9d87382f2294fd64f1c33e4f0a98482c0a39a15f7e2140cabf23104bf2 *9a9c485b7a1c7c0881032c67161a8b30c615c16495901d8e813444ec6022e6a19a5716c50f4317 *610f8cf45725952d4c3fdf1f4019e4d1aba0a1192946aa3a7ac336a4db278304907314e4573cae *e4b1090f9e017a787828935361ec6dc18a28928979025aa53d4a409f89884d4f83f43ef1ab80d3 *645030b5b77d9e2a7f382972caa902e4969725440822e66d51ec2f642e8c60fcddb65602bd9861 *03ea72c9752db173c6a035b0fb62c7908afc0ff91e202ff1ce4a274b01f8f2ca381c8d5ce052a3 *a19631a3d81614238de52391a7c240f73b3c885f3e51c4345221261fd11b522f01224a19c17b80 *55ac61c379cf5d08384a249fa61945df11e8c531887112cd900025580d1a874474f03fb43f51fe *1ae6cb442340ea43073e0cc1f43590115251b0510090a8eef2b6dbc888f80c240762cc4c3a730d *10657c149fe09146ed6440177446bf85423a3e3ac459c0360d152d2e94cd975f89ac08a404aa05 *82a0a9fb1f7a127c5063634c33022a1aee250042035143c773614b83edd531b89befd40a058914 *caad816c14a2ffc100194e445621c636921302029c14fcdb56c9e6068f2152d1d54631518ccea8 *98502e153022a04a4c4b1d0cbc0f3a94d891d813a70c03e80b2a28560c6d4a70f70e70a4b24f64 *f3817289c2876a04dd8e8f840f8c8d85e865052d6228d890b2bb08c002673b400256e57b5b8b8e *22223b0574fe25adcb639f54b141c9b81d19983cca7dd84084fa7ec6619f270615b61d926a858d *828aceaedcbe2cdf0dc8a41bf4aff76342407845612ff84caf7a9e811c3ace3bc27821229d08dd *8fea8750880e7490e10c600901bc611eb136d9a0c7e85b4b080ce7f5f2f8e37ad7b0a70980ca04 *e774ba4d16c6e6a5020144d27c0793fd1753ed9d1b2de92f6556155c070dfaa051de491501cbe5 *7812dd4a32b86eef691f11634577848aac12bc724db40a729337e4a964241575b83f26efd942b0 *5e44d48f3534c0b0d3995d273166c002119137279003d1643a46df569c2cbcae50029ce071c12a *3c29146451428043116d2d11e241f9a3417804a6b502595903ab2c816069de82c5ae2a062b48c6 *0848ea87534645ce21c1088b30e21390f654e0cfed237392b31535105928e9a47cb8f738efb101 *2e32d08716e2b269812355a5e0c635e43d7cf183b83075230410c4454e9b82afdc681e5d013cb2 *be042c51cc237cf5b1d75447d13400a5c047d289c5ad2a68463ca032f9c3a0d44428116c7be35d *b616940ef61d1ffd6f12ba100d40b2bc721ca101266f7724c6bcff816341bd34c8864590b78e91 *2296a0cb2c024e532a157d5332188789f0219a9090ec62bf20c15c43841c730046235b02b99925 *d1744098f6917f08de3e3d01b38a8ebf98b65301b902429e313dc118c9903c0ca4f40e5a5082f7 *1018194876f2266093a8a8aef1397ac75891eb236acf3aea55a2f4a1534807e35300f38092edc8 *d2b035c8a3e416e36a7d788ee4f34dc0b4fc3ee791968f51d164571580e4c72ec047278f9c3bf9 *a0914c439950d13e300902c429ece37cb47010973100280597344108af2116a31437c8911f42a1 *106d5128d00618436a0f46154915f050d0e36a40c9387f04e2dba7e7a4f6101ae2223c5c7804d1 *1148ff21fa40e89264d0e81195bc3727b3e79507ad790b8d26bc02c99c671c618be01140b1952b *60d8f9b7404cc5fea0a04946402944415cc9363a03e552457e35758b480ee840aaef89d6081ba9 *865320670a524e3e04671dc644ecf454915a516191fbde511c8257471d44a035d374c5130c5192 *0cb1c1c6d85d15745dca1fc9b821eaca0122eb9c374cb5ede455eca7bc1fc6c4d7386ed41dfc62 *efc3eb36de5d7e711ee1c2dfa5f12fc1f3177b302c9474fe5cd699013853f9e256e879cb952f8e *8cd4a4f3c566bb4985beef8a5f2aea174ba49feace4f98cb946ccb32afa6e5f4ec5e6d6db54cd3 *b41293be42facfa7926d5ebdaa90033df766412f8499d3f6ccf357077a673ced2f7cdb997a95d1 *579f94ce4874cf11fbe16c7221a3c60317d5d68f866d2ebf2a3257f9fe612e6e7898c28b9b5db0 *75f968da20abfa67346df3e4eed85a39b157b9e34d39ebe18da1ba5c1dafeb6e65116edb9bc0fa *6e9ce2f5d777f79b5273c51909bdb4e98e7ba3e71afad15c04fb4bc839ff607fd958cd4695b53f *8932f63f3edc8db3c87a3797491fdecab993b9ccb33dec893097b1e99ba6f4ed7b2bab721d7e34 *9789a6dec31e9aad6fe6321577ccee377db89939fe6a75696fda8ba0d64b8755f7341f546c7fda *57bc41ef5e4fbf1acb5c1c7655ecb6dd335777db6cd09445541b3fc98526bfd48a1d3ce5476d65 *865fad2fdd31c959f73773abd29b4d1bab39061936a09bd57cf8d154a6efb647756b311eb9de21 *97b1ee93a90c74b27f30e3197033d135e7d5cd2e648f2caab1b920f5e00fca2658a5befad4d9d2 *327bba493fb7d2a6c5b16f9ada23399f9ebbad3838efeeed8bd668185bc31cacee47bef93cd9ed *85753db6cb1d733fb16fbd7d79339d46c9986f8ca4c12de06641e3313db4b540289f1ad66d77e8 *b64efab49359b2244ca2f029a9cfde6a2d3faecb71fb923eb77a3cb9d99dda2610eab61bd612ee *b6539a87e36cd6df99654d8ddac7762644edcd225e9bfa7ededbabe7e668e99d25b7379a771be3 *e57571bf949e4b8f0f97f17af5083867dcd3e2f6a6d651ce97c175568ac55b6274676ef65c89d7 *432a9a0d596fcba3e6aead4a87fad49d954569b6e85fdc87e62df796cbf556f5fed9aa2d77d3a4 *9156e695ddf5b671eb9bf245efe843bd9a2c94eb44ab76c5d2bc32b10f9355fd7ef4e6ed63707d *3ca4b3f38838e5bcda1b5341698dc37557cf56ddc173963d9a897bff4df545f6442cad53971dae *be9ccfeca5eb8ccf4f6332bd1f7cef12dafab23ab64b95b8195f56faa36a3c1ea36b6d7d994875 *d7bfa60bbe738f6a89ba6ebbd512a75da54ed6b84ffc4e2362f3bcdecbaa7d7f619e1cafd1f293 *55e3345feecbc1ea661c6ff7e9b3767bcae39315f3b741d51766b596c9a94dbbb66d9f3bc6e392 *ad86bdbab5bbb991d83c7a56273857d456da588c2473523bab9be52479b62e8f897f7286e72c1b *f9c65dbf72d379a365860b4d3b9a9216f7a23415e7bd91373d45c3f1f3da55927ebc3423f36ef3 *9622b5d64ebaddda97dbba5b4afd81a1ae784e5884a1ee2ae587b5ab2bd7dab29ccdf7f571f55a *56b7eaa2d1bc2c77e74c6cd883fb7473f1324f899af7a053ab262d33eea90b29e57879933c4bfa *683588468740a8fe5305803ed05922706aa9312ff8f272a7411bd857a71ac25adfff2e7c7fcb3f *2f1a64fdd7f50cc39ad1c55f9051cdc0df5c7e69f9ebf8176b7979925b8dbd4c971776c5df3f65 *78ba9e2fbf58fbff0d8d9ed16e7989a35fbafe298c375f4d6b20d0c38ecd5ffe073b54ff276479 *be59d584feff8996e979995ee87d7ecebb878487049e18a9448b53497848ff5def9e5fb4ef2f10 *795e2ff2eef9b71a8a7f8e7891c8cbfaef68177dfb95cfa95a7c6ee9a911b4f69178a4fca18120 *1449fb08b43cb1d8244645aa87975f54331f65fa10191bcaf620ebebe7d494227914fe95b58811 *4fe910b5a1749006c7468dbe4918352a6c468da09414c08b504104aaa15187bd3c0e5e9967ea0c *913f9453dfbf62884d68703be14173a2681a29174a83e4ddb07071918b5a07d1af48d314ad2314 *4e2282a34032a17fc6f8bb9a14b606f1e85d0c05fab800513625fa54fa238020aba1539d8d5291 *448b8ca8364244a3213c54a17222a3c64dca0832e1e7d8ff10d1bf7f115948a7f49104ce030f03 *2409c24344f2f6d1538a16caa2166b2add0a5fdb3f90a350c0c120e7cd001405836a6752f08177 *f7fe450547308c2514a0d59cea8db4129fb7a9a05e191437bc9178070af11208337a2ea581a82a *d05ee698d42a2c7d28fabc7f05106e1090b813a0cd41f928243fa92d04da2ee4bcca5308f9f98c *42664043dca723f29585175d38461a56475192c85d45a6af215ada901fd3353442a045962e1b61 *38f1a421436314b51f200ce7fdaf756d1f6d635f0b6a011a6c94bc3e5524c8a5632e45afd67405 *6955098ce1187d3222249cd843296af44272ef573ff9cb799f0138103ac46cc4bc98aaa3642880 *34a6d215071158f660acab98e5df437434268660b4e41eb1a40f84a2298990252f5fa704d43a05 *25f3f7be34117c080d493415d6b3afc2307a0e0490447df4f2b2183e00e33e7e9b7921a6970165 *a3bca19fb63f541c7964a3d8e642550df0d8d85e468cb4b7e1968357e04d34d3889e87afbf2a85 *6cb3a08ea2007446240473c764fd6dc6a83050cebbe465e81805e875d6902889f39a2b2a791108 *1334086f4397b34b2530857974889244472e7c82f64a114d6901e0918ed2fbfbba5540b8e141b4 *0f904354a17b44f482e045bda2c40a5aae631441a5773612a875ecd9513d159ece6c34786c401a *a887ece225906ca88c1a517ee743891d946a19edc53ee86b11528a79bd53c3e22712219e26bb17 *3ef9900826a90364bd79f4dcabc8e307589cec3713b85db34b6257983bd7451f9bf80530fd1530 *4b423023a94317ed0831121f12e643ee61edc768b8792f3fa061d7c0a1ab63e425f03c0c54cb42 *54a45470d82574ef69f287aa958025a3617f11516c3050291740dea7f4a581fc54008820a3bb51 *fbf0e0f2464959e538827e84af7fb136fef9cc60f3f8d726be9fa65a548516aa59a1c76cda48fd *5a5f04e78bc9bea97da9203b6b5a5f2aee17d7fde254fe78aac552c8c77763b2c8d7f9d4412b0d *ce6fc990705815e68ba0bab1e7d306cf827cfc633d9bf60f8128a7c3ed988f44e3e967df532cd6 *c2eb8cb7eed91f91b76bef5c7736d7d9537eb48766c67dcd02b4dcefef5a77dae7d9b49dd56d27 *1d558db33f692b3f7e506f3ae6fdaaf1e4f21cc407e3ab7d54ebdf3b4bfd164991d4dae1852b7a *e3d6b67d0b06fa83059ef1d7e09fa3e8dfea391367b2b9ce59681fd1a5c286f6952da8c8537bb8 *563c7bf66c0feb4f6fe5f11d77cfbee7e07bdcdb377f73b08ac68afba383553456dc1f1daca2b1 *e2fee860158d15f76db0ead5e47347b16a9bcca097bd6625edd9b3c9aca12e83e5e47a9cddd895 *cdb8d6311ad5ccf9d5e81cdb83d6fdb1a924779d57f5f32915d63bffce37271b330a4df3515f56 *7b2bb9fc70565b5dae198171a82e831237bceefa89c29f7b1561ee57d56dc95dde77fd6397cfca *0fa9b2aea67eda91ed53f474dbaed50bb6b664dba5b5b5b5af8d49a5a7cfb861724fd38b9b8da7 *8376b46ba6b5391fdddb7c39fc4d97886ac5742bfbee68c773adcabdba6997c6b35a69123f92d2 *50aa5ee6de2a8a8cd66d329eeebba565a732d82ff434195cfc68503e3c1f976b23881e91a9ee5a *13aeae9ff7e9b0659bb5f54c73d7d365b8abfa0be5f14c44296a8e36fdc9ce1d34cf7379346936 *26e7b9769d68ce6d5c3654bf3d0abb776e371d48c7a19a1e929238e8794371d9f2b469d56a2abb *6ee79408ad69abfecf55fefd4356bc7f2c886ffdd7b7cd1301746e1fdb8e2ff7fd694d71ebd71f *ff7fece2c33c54fdd576dbddb3a8f0f9fe06e6f5b2a00b7922825d5c2e872fe5f2fd7effdf37f6 *3b64344bf16af915c92e596cfa7fde7ff0c763fac675f78ba8fc42984b62f0e1f7c5847f7c81c8 *0bc6e731fdbff7c8fc2779f2eaa01880e2a7838861207ef2a173a5c288949dc2455a913e74ff18 *58a16e2a149d62681d30b048142d849524cfcb1786f8547244b336fb68099d4c1a644348464c41 *c384008921fe4353cefb9700228380469004d533167ee5c83204df8d7a74c04b2d52c5a1aee79c *146f5084aa81682fa27c2a203050d10ded833bfce93bb0210a4043c8855c22e925ac1441a29687 *a6a88fa8232ee8c596e0c34af54970ed79bc2a468f17350649309445b3395facdb090d6e7a8900 *164302159d5cbf31ef02d180d58a3a67494d0eb76c203209a1aa44d41ee157bffed777e7f168b0 *8a5eea1862f89a556c024528b5ab20001be811a029157f20036ba032aa50728c105c47b07e55d0 *991feb2fd64dcea016fd9782e4f7326ecebb5328aa53f2fee1908831a43c05861ea970827f1243 *d027523f881385487ae820908720226ab0bd8dd1bc4d7dec065aabd4af12c3e0bfbdf36d0288aa *b0e94e6922405b162ac9602712e9024c093d1720cbbff33609e25c141232406c881214b8d963ce *496209e6a506fe390b1124c43def24b1044da132d8e30244b445f05562b498e9b9f80834164999 *11cb497ce7db50adf657305ffcc330df34200eca967ee54bc58480251b2687360f4bfc62a3a2ea *80f6c17eaa6bff97c0fcfabf1bcc5f99776fb816da1f60fef76ffe4b61feef0fd6bf0dccef7476 *b5a6e2dfea9379632ca8b71917999aa25d76e27814cde7a3b053194f435549c5aefb184e23ef9e *65abf36d546d6883b1650dfa276ba366495b18b446d95668cf0d6eb2d91ee651bfe13cf9f5b0ff *e805dab4b218f7b4f2aeb6e68587559ad9e9babf6f4eb2b5382f7be5f1f41e74b57e32af79bcac *f506dc4d8ed6a5f67e50cec2dd3d68dbd792a1054be560fc663992c17cfb5266037fe3468dc17c *30a9cb9d8ad12a35a7f5ee31b6d264767a94566e764d55a7de6a554dab330cc4fda4565ac43d4b *b896b6ed135f9bdbd9f0cad567ce7c6f371acdeed0596d82f168d53546ed71693bb9db8ab7f1ca *dee57c14fd6cb0ac7a4a30f2bc95dc3b9f1fe77df4f4b7cedde226e56ee73a573761aa342f99ae *2b8bf9bed4d22e91f3d427c67859e3bbd17f67982ffeab61be4a605220498d3f08f3df5ef0b7c2 *fcbf7164fe83603e03c2ecf026d801f2b40f295c064d0c30bf8974089a9d5624640ee11662251a *9434ce75e5736b0219ed370c5429e8b68a0b2a3706d8a254f201934c81e880047672cedea36c21 *74dde282ba8b88e20a2936c92f16b882a66b92a386b082083a3e15298b645dd4575b11bb723ff7 *55401b3f5112615340da04213165d5828a6680221c093fa3649500c9c520c9b1fb922169a943df *ae485245003392014a29c739a87d121f1a0d0002faae89f69d7c60dabd7f69d24bf83380845e90 *bc48fc097a8a04f1d5e74f35da22711a74470748de6a68bb12d1eb98fc138a3154e84b5e43ac26 *2fb56a03e23caa089158a894c8e8d5f6d12427bdf70480f5af43785c846f0e03f5e44a00515cc9 *7fb59c86508ce4f3aaecdb7c0a500555c013f49104e773b9cb007a1211dc43d04cc9622809f4c3 *f7221efb5ceaa9e509e693fc0312f7e415022d07723710299f9ea0fd8efd93a8e8efad24502f88 *d130c7662a8bce42e835f9d0ca0ed0f2c53e8e7a7a204fc7871f7c22888dcba3f13ac4ab105d1a *2875ca6819249a24e89381815663e58318038fa271006eb28475f212add25f128b5adeff81aa6c *94b76fbe775bb2c820fa15cc97fe38cc17bfa82e2dfd8af6c571289262d05e36e90a18ba774d7a *60b6f1a2556ae2ff2530dffb7784f9ab7ae6093fc2fcfc9bff5298fffb83f56f03f3575bb73aa9 *7556e373cfaff89bc4666f30191ef5527cb86599bb694d5a2331698f06fb56da6f57f86db363ed *84284b7617f51249d9fce136b65dc96b0ef4384ad787e4cc89ce2abce98e55f766eb031b45cf3d *8841e086ba21c5bb45e5b19fad6a13e55209c2e3fd5a97c7da91cf9aba51abb80f21ec1d675ca3 *911e0efc667e8824f9c2b797b3a43b942f9571f7f760beeb6be666e970f37b7a961ee520e6d799 *11b577bb64c05b0b2b7b86a3b37c681cc369bad37796ddbb78a54cdd8c8c6e6db65ef81edf1bb6 *06eaadc1edf8c9b55b3f1ece35279b862b776c946e477b9225f2b6a6c6e9667d5a9417d3e35538 *dde3b6901ee7fab69f3d8f95ee55aa76a2b2c97517dbb01ade87c359a3729965b16c0b295bdcdd *fe5439ed77a5d5aa32bdfe7786f9d2bf05cc17e994fb19989fbfe06f85f97fe3c8fc07c1fc1882 *890a8498a8f34ea7833c105e096815a24fe4415840c8d1d0ec49c101fac77d68b0324821c0712a *57bc6170caf8c8b378ffa23658540b78a06912a831286f2941772f515eadd6b1f6a1cff4fdcb47 *bf6704828306b90906a174347f85689222e29c06a5dd225a11288b11dc80888201a2140f399710 *bd513ea86e32b4173ecfe6430d902cd004c2f5646e07351e03084c83241471e134824a9f5f432e *7f14bde88e0132cf02f4b27cd02e440cb2ac7de839fd700d504a21e51f203c11ea2522f5b340a5 *d480ca2d94b58a4692babc4518c948e8e2115f6d8c52f24fc8e67f35bba04e7eb845f1e8d28920 *45993347650894e40a53aaf6a1873381101e0f384f1d41c8868be8f235d049ab818225a23b5143 *8be07bb37d84b6cc10941805eab3095afda9771d1db3b9247608e9371f22dcef1cd6dc1e4402ab *8fbd4380479eb791878836143459b158c147cd2a903ef4abb31896b47b0c70bd50d10a107090b3 *1314f422280992ce8e86da9aff413c8b2e4678496eebd09489216027417c3444072c356ba1b214 *42dae33dc4d1a16b10c00d32ca659ed03cccc32583484a884b54a8f8511824d16f7e67fed01c65 *309f9d82f4d85fbbabfc4bf7b4dcfaa7e72fd6a770bf18f60b952fb640f41d2a823060efa25607 *352717fdcb0e9b23f617d9f95221f0ff13b0df1b326430df5b955e73fb597f94998e4ccfd51f56 *663672e0391b9a9bf1d0eb8777ceedbdda77eeca8461c5035a9c96f774305156ad952379f60bcd *3ebc6b4f7c2c42c94bdbeca3a24983e1452fe546b5c62198b8cf7850018cf527f3c34c74d9ff1b *d7bae30a51958520db0d1f0fcdd8bdf30ac3d80f6fb5be7b36c3da76c5e7e89b9da1f3f432fadf *48690f377ed1e57e76b5dccf5cee6757cb7d7eb95665977dda275459512c355b5be9cc31f95643 *e08cddaa77da1c7a4667d33bce4b9e502af537357bcf2f07bd68bf75854be9aca42c34d8dbf7dd *bc5dbb350e9b5dbf343d9dca87c56ebce2eaf5ad91bacba8623ea3a3e7acd5de6de34d9746d9e2 *bdb6788ce3ba7de8efa68ae6773547bad5efa36cb02f95856eabb25cf18788eb18e2782eebc36b *e8e8c231dc6e4b99dd914ef361f0b86c4be9d88cbbf7bebab6ccbb639ac31f6fabee72745f69af *3294a2ee7d67f54bbde66959364d5f30f65ed96e2cae1516c6dcbaeaf871297bd2f3a6ce97fe2c *5ca8672d299fa3e79c4b8de7d9b93deecfbe2ef7ae8263eccdeb443c67beff0c7921db4d85fdec *a13997b83798f4e6d5792f70743b383a9d70a66dcae6967bceb4eb2d7c589b448f1ff77a796c3e *6423781e67b5bbe5c7abf0d4a95bd1b6e674d3ee91dfefd77cef9f6c65fde1b0e0617ffbc71a55 *b691f847fa54460320bcd786f386f0be6d3d394cfab6037dbbc30f18ef2780accf70a9f1cbd786 *1b02b2eaefb69a4802e98c5135d9f835f27d6b35f9abefe63f087c46484e69e84f27323ff4f428 *db8afee518aa95be51d82da243b32b8607a4813efd1882c8847ce02246e72ab401a38277f091d5 *e2e15b2641082eaf7de78272019265245a127d486cbd7f19da4bb69eb281b0d155a1ae43cc9808 *ca603ad42fe542b9ea5c3d80449c70cb3c28fd12d04a2eba957bc2495aa1152e8941c18e2286b8 *8a069723920b8663a2800696101f51649f967b4813bf1b26460cbfa8b957b70f156c281411a102 *165c9f67a925b82a0a300e87ed8498db9de66e1f68908f60ab161459b841be8984fe722b62f010 *646220fc15e0f337b7162587eb39f32184de299aef7c28fb2568bb137c08dec2f629f9986655a1 *354f971d5118958079a380d84e6e0a2838f8982106fca554e1438b04696342b037812420a56841 *fd8ea02726885f957e0dd8444124eabde221a3994587f4ab12bc3473c8d10a4d00799d21cebb9f *7c58544224f0dbcb45b463f0d05995d11990d3d8033c4a1e12a03a5cd8095106a488fbae362c42 *be49471702a968a2a641eacdb0dd0de16440c50acc7f0d0d20ef13c0cfdd85918c56817ff3bb8e *d1b9afe56a06f2975ca035f67f943b27d90a21c79ee7efd853f8a35be66f35f2ff146635105e3a *908a50dc2fb604cd29ed8b93bb415a2ff16bddfc52a1a5f51398b54b98d59f518f7ffbba33267a *bbbcbeb9c352fdf8ccc2e361fc5b1896fb23a8f0b7402147a8d01bfc362afc2d0ccbfd0862d937 *9f1ddb943dfb8f6158ee6721f78f57cbfdb1cb2dc6b0dc3b8855fadb72e0b727b381381fd46ae2 *dc5095557c95767bdfb40e4ea7b44a3727deafa7d771766c5a41c3e5db5c4d7f6c82f479e75d9f *3de7d8af1ccebdfdb49b5cdc54f145ad622ca6e363332d1f17f5ea6a583d279ac90bb2cecfe5b4 *91f57b7d4e5e2bee78bb4e62b3698a97476d3dd86aedf36635f5a6a9f0146bb15a95bc5345f35a *fb632bab1eb5637b275ecedf302cf723887d6158afab2d5b8fed2ad1d65e666fa4c3e17cae2d1c *41f5caa541b5dc134fd1725c5fcdf79c3379e8bd7396ed2ccda964fae86c1addb2620da2db6e79 *734e87952ea6a979921e83dd235d36a26bab16a583ce2a7e8ec6fd5545e1dcdbea58195d47c943 *b26ade6a7529f77a3dfb3ebc0b7a322a2dea4adde763d511ceb5f3e67a5a0d57c773b9d3e0cdb6 *69cd74c37d701bf35f0962c35c0939f9924b84e532c5019ab7c8a95a84de0eb2643e79a8ff3350 *ee1fdee4beddf75f8e72cd6bca0efeef2857e4c5c286eabffa6efe83506e8cbe57e21303922938 *d44830072a3a1a2ad324155540d20d50668ed1bec6909e8eb33e77732792459e29455fb05c40d2 *25ef70f1253aeaa303cfc83d45223adf05f42332944b62aa05d82c675793b710246d756888f100 *7802ff52948d721a4251172d8491d94784b85f0146c53e9a0b2518810b905da2e6bf020e820fd1 *c200e2fc1180a88434a10ea78030179644af5b5157b50cfb6d15384a83ac251b4986e818e420f9 *6801b29c10b57ea7dabe7fa94053a1f2d2dd12218baa41432c400411c074873cd58a88e3f07095 *60f349a95d2432e91a82bf1de5ca5026a7c43204f4c86026815c125afa78b43cc670420da1e5a5 *cb1fd2841a0c71935ccf33801fa18a36471d3aa2e2abbf50809aa8061c18be4da7048263a48828 *43280c5d80419e5f4cf0b6fc8bca9fc0028a1a96dfc630464a9f3d659f7fcdff047edb5423c829 *c7e873657717c06751173ed0ad7d044122d417497f32a75b839dcf50254964c32e518328710811 *c277881ee7f81ccaa579ff3b8b77585ca32039cdc28718b58318ba8e81fc9a12df7918ca6b6288 *103a0b723d3778c54980f4466ea42aa3d35c47fafdede5d45529ff6994fbcbfffaa52afe59a85b *80775df6a0ec2f0e72e58efcc594a0de67c31bc12576065ff952617f90b5157fa2d1d236570cef *6ecf9663ef9ae3faae34b2eacff2aa3517cbe76051597f4ed7089d3f857775cfde7f0590d93f86 *7707e6a5ee844fce1beeef1d139fda7232673f7bae536fb8563a56e5d757b0a417cd6fe1b2b288 *a6fd7d2031b81a6fc7eb7a6d9ccd07955bb07d285e5fbfd77aaf377cccdfdee49b5854673eed4b *ecc527a26d70f670cdd0f5e8d101e266ffcbe9d9afefd5b3f6702d74c6fb6f83f6b389ee5f0dda *8f63f6c713ddaf41fb71ccb89f1db41fc78cfba941fb84bec1fd9abf611df9d6b1e42e45393586 *4d3e2de9d1aad6dcb4d3682d3f26e6299b078fc36db49a5fa3f1acc98da36ed293c38533993493 *7dc9a847cac95be9c1c21e8c2b73a1d28eaf035509a2e3665d36c7edcb7654be2871fd3839d895 *6b38d8726e58aef7e3eb763a53c3eeadb26ed4fc4de69ffd400b66b1e02e82e3bcbcd057cb4b69 *c44b6c39a9e9c6bced3a83eee4b68b7a759bfb4dfe46fd2655177627dadc6b47b933972ab11964 *3d653a4f4bbe543fcb61bce462de3c5ca7cbfa759db97bf110efb68a2697eb56aff7d8de8e9276 *3ad647d9a195ed5783d6a5d5141bddd64688edba32695c16b55b8bbb9dcef6527a4c9f37533ace *addbf22adbb705bfdfb5d7dbe868b71f0da1a337e59a7b99944e4258f72f56da5b37acdaad9766 *cdb1cca587d1b6533fd4fe75b85f820eb5027d0d06f4959c98806e1f527281b236a5d80200a3ef *89aa7f4886e92f82cad8f7f1baff11fecf5c1de9e37bb25f70f7a75ffcfc05591cfd723dc7bfec *779b674e97f85ad0cb858d5edc8a3f1e4e78fef31741ff104efcb63ed3eb056fe184f07787137f *f318fd0705297e6e0703f36c21372a82fe7904dfee080ef74158d8072881274e9d773aba015122 *a6de420039d20e4a2883fa1b824512da41354074e23ba3c81fc12d9b616cd256853914495314c0 *7b1d3e29a4958262b584c463be34c9ca0702440638e3455c14166491a62eb4711886f4c1fb96e0 *4da0c0879242b604fa1f45ef008171c52734cb221d4a89cbd05c82d61029fc2b2f43bd22cfc55c *a45a8a29cfa0cac845436f3c84fd5f3e860164f9b5022609e9f90bafee530d5cef10323081f6b2 *fb8d604aa803fa7e3e1f20d84eb251126497e0c64a5e7bcaaf7efd2fe781b0e0248115ad801e04 *76f30ae44448985b82f54bf8b2f9551101b22dfa7d280db0bf55e8e788d0c90a21baa241325884 *89b406370e36d765c472febb9d157a04c809237e69d426c844cbb9183414757d4856f910e916e4 *0f7e5444369220332d437006fe280128440922f008a1233d0fd0a5d5e883bd0dd56920d94c4c98 *dccf1902d6212c85257463b289c5427d1dd1230f93c5ef4c0cf8b719586fe41c00df8b107e1e06 *04c41314d878586210cd2ba6b7fa5e0501e546c546e0c30530ff23a04b9bb8502118e2c82618ca *cb98e1fb8363e3a9fd43518af41747291581e2fa8a051d758d5825ec2f260f1e108b5e2ccabd38 *ecef2614bfa53f1ea538558a52ee75cbe959ad89349e2cdc816bddedee295bd4b35375fdb9f26e *adf9a3f2ee78f42b1ef4f8e98f491356fec683ae6566f44d077633df700c3c0ffd4974fdaeacab *6ca25ac440f5f9d15999f2d75ff6068b5573603e3a0c4bd7ddf9e6ebebb8965569045bef5ab7f8 *b4bf359ef5ea3754aece27bd94bde9a65e35ae416dfde80f2b76fe86deb0fb7a130e9ffe2e4053 *1b2f89445d772b4f7f222cc2dd3aed89e36754dd6cfd497bc1feffc6c077e55b9813d5d6696b50 *a979595e28e80c1d16ad38ef7582ac4d6abcc3d9f73ac16b00ad575de04f0fe0f75bf8930348e3 *c7fd230388a7f08f0c208d1f970f209b8983fa8f71319b71a69da64ed7248de8dede627faf986d *d1115a5bbee42733fdde97b95d5b36a4ea7de85e36aa34e8f7e767bbd6d8acdb277356bf1f867d *ef51bea7d9280916b7ba743c5cdd91326a94ca4ed03f9dad92d7e17467b019eb9139a9a8abfec3 *7868555b0ce6c37ad5de5dcaebfa6cccfe3b74d6bdd8912bd16abc725641343fdd2b15db5f8d27 *ab31b75fcd1aa7e679d1d8f4aaa761b9e976acf3f3c8576bf3e9b2d4901e72d52edf7786d0e433 *4fbca9b5eda076bcdee4d2b89d0c26d355c075ab5a77cf029dea29ddede34169ae04cdbd37c976 *6da911cdb593d738247b5d9a9f76e9bcfbec1ea6edf3e1e60be367e5325a55bb22a73683e3230b *07d3a677a8a5adb9f8d0b54b3bec8ed771c5edf59b27d9dbf1e178b6f46a91713ceef68f95ef37 *0f17675c5bdcc4f189db2973911ff2058ca1d14b30d9318fa2df16b48efa508ea2b299f62a090b *3c6782cf1d2fdb637f39eb86b1b8398ddb9359ead69aebe1a1bc3278ebd109ae49bf5dd55afda9 *d614f9fd223c2be5f6d318ecc489355ed82799bb0fc368169e76676fba594787d1e1787fa4be3a *95ce7cfdd45a991bb9520e76cdb522ae879bc92879343cbd3cdd762bed5e69583a49dceeacb5e7 *d2a33befb5caebd97814ea49b97d8babad38eb4dd7e5b23337d878f972f5e67af660be91d703b3 *768e13367bf6d6e574e60e03cbf427cbc550d216beaed77ac9d15e9deeb214985727704fe775cb *db9e3265603594c162dd3d2feea57a6d38f7cf9d92be5cc89c23cc95a128f4d4c5f57e19c78fb6 *389fd5cbddd036f4e6421fde16e974dca9f4d3addf6e49a93f0907d953d466c9a1a397b5f45f59 *1a6287b412bc70ab0ef3405288846a6f08c6a784d420f5589103fbdf1c227e1e90bc4738c64f44 *3856fbbf7ea075fedc71fe6d5c7f2f56ecb02089bdf77bacf87b9d029b5f04f53d5694d49f8e15 *ff3d07eb3f48ed37027c65212279acca94b8f7617942ce6a328c39c128960a429d085d8902ba05 *1864d5a0672342d692bc6a2014f96b23c3f72f1f822f3c5c3c0d786d4a1265e41310bc25984591 *9b6650a8494a5e3b3e7e47818d9c0c07292828aad0e6894350b2a442119d24b7f202c73b84e08b *a21366f6c12113605d4342abfc07db9ef7afdccf2984dda304e65602937282ad5f3d7159a8221b *1f3c50dfbf347861f2302796404113508f61e3a9823ace83be4e059b024924166fabe8fdc83d72 *78e365c148bec25031e551ec21b5d682a0919cff78d8aec049853c54401a2306152a1c09fc0e55 *189f7ffa0e21e8e52f4bbf90c28d085ec2546e342037eac3042bfed0e0fbe12e501a8ca0f9a941 *625482f52cedc43ccdb49cc815e81fc427dfbf7c74670770a73654dc0b4f416280f215e92d1950 *9e890bfbd62538732be0c9b3e02b828f9106bb14367a6cc7cabd5e2298367d5e6d8d680015b432 *93fb940cc95d08f5c6f01424cd6574c514e9e4b2f727b95e03a6565f1395c41e434c1a41e394bc *e4e160f7f9d354d090e323d89460bc27a09101b173881a5b02d3eb22fd681fae90ec09b279e5c3 *aa5c80f4280bc9a9160e59222397672a5817b49ca3bf3fe3903753eb70aa27221e06973dc2006a *5a9488e229759440db5482f3b0f2b6067c101bd97f655859f2f9828fa04506cb71aa3943f5954c *b67d28cfbe2b39c5d0cb926997117271dbdcc41576b20194b8d864caf308111c2c95775f5689ae *8a82fc007ee93039a4562718e74a3e947c05cc9508643a58777e7f392677ac50f53b42a69b34c2 *a1c3a64325d6003181bd3fafbf4ca5c2776f52ede5b24be91291daa4a8d10afa084417c5fe4bd9 *0789d66102a6e13b8194c7e1214197eb656b1f13520ae11aa741b25a85177402926f2ea3f03d5d *020fc65cd996bd5647da921ab920839b5795053c350de48208e687dfd325f0d3934172640f4ec5 *5645c6c5fc8bbac85e1883191a438c38c261f0fdb92be0f9c2ef9da638fc4bc9814da0994d364a *b97b335cad7468d6bda74bc85c1d9c4d015c4b15cf3aaf991b30984d400f1145d827c2488d7f1b *ba00356a09e6a82f75769f2ad2e4f824c2d748877d938a97837ba2bc3d3852e6858c7280732bc0 *0c51a1732dc28730828635f9b2fac820ca74287ecff540352e827b30e99af3f04d9260541e8318 *82563cf2a71269eb6153f79d40ede3dd485f2dfe55c248fca793372b6cb25a549aaf085f2c5833 *918f15dca9d82e48dbb9fd45b6c147659bee4f1834595d0abefd91e5587c5076f6d395dfe9aba5 *a46ccc2eee2d3dff18b45b54cc9e66b9e710f7d574683cf6defc85f6437bf331114179086f18de *db5f0b9e4fc50eaa6ec6854ff359772bc26cfb38cc9e951e7bd165366d287587faecfb87f976b3 *fab45d3eeffe173922697686ef65e4baecd9e9dd1b7e2f237fbddccfae96fb99cbfdec6ab93f74 *b9bfd17fcfbd1570c5c9febab227fb552a574e59b6ad199633f4ee73afe1b72ee37e73faf063f3 *ca02d7fbc04a4b4b7d6c4f9f0b6e56bd94e241a656525d3ddd6641a0d506e5a7be1f6d4a7632ba *39f12991e78b9239ee3ea5fb5e990f16fd69ff52f5d79a5259f73a1ae7ceace1b473db65e6e2dc *cdd46c70cbca03f1be12c696d558f7e6ab65d70ee3fdbce184ce6e37293f9b33b3f6d67fcffdc8 *eecd0bb8fba059de2bf7e9703abda4f379b3311b2c7949b6db355bcd2e867a0a6ad741abb279a4 *5c433fb8a3b33cd132bd3aefc423bff648bdc7a8effba568b61757a6d0674b41db68e968363307 *e5dede36f8e6725f4b1dcd50db217752bba1b2f4cd7af694fbb5a1641d95c65274e5cc1a9497f5 *e3cebe1eb2eaa8660c7bddfbb25ddbc47571d35c97c5cd9d9f46fa69f6af0bce451ca209a84454 *3400018f7c4e51ce48d0efa0c39b92ec98bf53b0fe46dee61fdedfbeddf7bf336ff3a7efe63fa8 *24ca0e2d32940f68ce3088409ec812ce72fe75c04b68db4d0adab145f88a4ab03827534e845631 *703d83ed06d86b3ef053501007e4d0813a83509049401dccdb4cb4f065734395aef8837dc4876b *085fbe013ca43849f55fa515a1e69d26c055223c508acab20ae0bf06d7e910deeb018ce0559ce8 *3adc6913784017b9c090d4518e6064f8efa8846849840860256f39e1212e25141455c9e4216f63 *c1b2252f639d3207c49d8b5f2a48243b0011a8cf23ec909e5d947bdac2d04326be06c13211443e *0dc1a500a9b0cfb9a3e8bb3750a10e50c9cdbb1a85bfa435fe37b7161d588dc5c4c4f5458f9586 *188e61dc0861e5cb8f5b871a5404b58437a827210fc1c37588520b1a6afdf03b8e51a5e4516265 *734944a551563e4c86107c801cae91643320be2113e4d5f02a094e4302fc3a7de820abef2ef6d8 *72d9f355a0c1e6a3821a43d680fc8074349acb34a472de7f0723e9ef48110c6101b90d0995611f *33c147781da17d4fccbb9f1063307c2fbf4708320c3d30f3495602d64e0c198768f22221341d2d *fb50a4239d5ee983933bc177e857f0680d63bf1cc177894aa008f0289c83298a01bb5876c468ef *7df96c9cf53f0d70ff0edea668132dd38166b02d51455485b3bd6492c816ef90aa96a37e712ad4 *64ef083fc3dba43ad4f64e1551a525dadeb2515ac4eb59e3ea5eee41fd782ba88856fe5445b46b *9beab71a1dff2efafa27ca685445e3bc95a33268fb95d8f86856bd43dd7694ce304d3fb9027a51 *3590eae9ecbb26d781cc3985501ca581a89ce3a1937815feeb1b4edede241de7369b6fca61669c *77f7dba6e00dd3dfee967a0dda8f63c6fdeca0fd3866dccf0eda8f63c6fdeca0fd3866dccf0dda *af7bb6b8cf84070e725aa94f7b67e5b1b7f5c66ab1c9eedd7a6ff5d8b5af53757ed2ef291b444d *4946e795c7d596f7c178f994cdc9fa9c35d6c929b026a7dddad1171e03dbd7d9354dcfaad7749c *e7f3e8c7eb86e1c507f3d8b718eeed0e2eab3b671f5b9a37c91acab6346fdc1341b9f5bdb8a15c *5476c7a5d3b6fa1c0f9fe7f3e02638b370725e8fbdaede0ebaa38bbd953a89145adc6f9411a967 *ebd9ba6dca7ce23e4afa2036cee378343b98dbd6625f6a9cc3d4582db95d209535bfb69d5ff737 *2b193685d271d354a662a36a5587a3de3555a74ecbb787a7dde210482d3f68ca75bdda19b44bbe *f6b0cd29779a26de60383966c6b2cb07aa546dcc6ba17818d557fd752b984db6c226b8b8eebc73 *f25a6eb73790c438359afc73eeaa8ffeaebee3569586f6180df8d3bfb430c75015f91180b6c276 *6e23d76f449a8e876d0195ed78c21174027c3fc6ff4eeee64fedfdff49dccd7f4148f1ffb89bf8 *22ee66de04255089448311420c065d8e5a0c9d52920ca04805cd5d3cacdcc80a03f6f3117abc63 *38d02790d0e251fd113e92cddebf14d03a43e02a86d54474ad2b2afd25c085316828a2a0631404 *2a2c96f091103554944bd0919e40f7e7057903ba91006ef745a14e8c3a2031b125fa382a3a1890 *5440423d047d8e4796fa73882fd2cbc94706c20754c7e40917326c9d049411675b45084fd322b1 *5faa52692fff901856a6329ade894f88163eb6f7e82ae1f8a2904f47ef99827b27dd5699902e69 *0e439d8d85a3a40280a46451118d22d5f0e5b8c0e3734358c269ff04a95ee25c42f7997d1e43ca *64822ad0d885889c184ca602524c45201dd624f444df1e672e2d6bc0525287f95cee7b49321860 *dd52714ea5d03346289c3fd70f705ba31ff9a8201a901511919d66c3ca503c8b0cd8e5b177263a *ad4c03e4bf851a91f42ad4a9602b9365870fd5dc186b83a70a1c916135ba860037f5ae06977bfe *69084f49a74ca1f9172674173a4623805fa800bb1c1690b150e35dcf4381d3247534e2c20268ed *b2a1a0ed14453b36684446f65fa6b282fce1de05f8caaa1af204322ab522bd9502da0989828834 *3575acccdc55f13d4e62efeffff954fcdfc1dd74f52f15e78b25434e45fc621964e247f7219328 *5885c5843639fbc9e617b1f2c5557f86bb498a0a77c772aaeefdc96fbda9b2709b717c3f5c36bd *89b42fe830dbffa90eb35fa159ae18ce160520eb0f589afba3603a1ebaaee7787843f3e1e95fdf *84a34fffd6b7b5fcf95e37eed5b7957d5309a612c1873281277a76f868afdebbcdf6dfbacdb87f *6400bfddc29f1d401a3fee1f1940fa70ee1f19401a3f0e0358af57eaab4f65272cb3a79bf4732b *6d823d78baefdbf7cbe82c8ab1d28a2723ae61889bdbd5ba0f67a56c369ee9c22eb30d8f2f2dce *d7e5b2d35a88cdfee1114c9737bdbaed0b95b8bfdab684b9af5e26fae8f6b03b5ce3d1892ba338 *f0a6fba15829cff97b5d5aaafcb95fb63a69cfdfd943d353cba16e3fcd48aa35aada71643ddd9b *fd1ccf0f436f34e3ee7357b38cd1d06c5c754d6fd7bbeb795aaf8f8ec2dc1233162965762bba94 *05731c347a35d7bf6675411a86613af4c3477435f6dc7a7fecd5d265657c6a5e7cbf3de0bd73f8 *b03ca3a6ec4ac34e3a99c95ad5aa6ba2970483d2752c4ac1285c1fdb8d2ce42bd964d5e68e93ad *ba2f9d237bfe5cd79b4165ef4dfbfdf57d1a44cdf37c559aac3a9623d841b9bed9b9a5be9b1e5d *dd4992ba6f2cc7d6ac5776b8c1292d2d7fd3bab0ce9e88c9371623fd5e17da3d7e1ddde2f5627d *89b6bb5612738f60d5535c2189962db371db3a9dd589cddba9a655ed87eac9ced95b45877ba7eb *753b33491d6e0f762de11ff756fff278d6edd295d3d2917eb0bdb2956dcf616d910d94f549ca6c *6bdcb2f61d61b2282f66fb6cd434a2aa6a8acfc839e88a338d7ac1ba91b66bebe6883bf7cc73a5 *5de1f777b6d36ddbab6cd6114aba7b996d2f872811a2d0a92a4660e892a655bc9db7accf2eb374 *7a1eafa7475516fb75ee5c2b6bede5d4df44f6a351e94da5fed2f4f9d9aa331e0aab6dbd51a988 *a375d30f94e574d95b4f8ed78675b9a5cbeeb177b1aa8d61970b57bbc579d44d9b5e495284c3d9 *112f8d73b9bcaad69e8d65d68e4e76777a28effcce66da98546ce57835fccbd9680d0cfdf8af0b *0f2911c843d0d340af5202557c3494c7b0b3f6414a5378c489fe7f386ff3e78ef26fe3fadf93b7 *f9e706eb3f88b7e983d6c143e920824c2e0bfa18780ce0cb4e6c20d020a322d625caa5310fd377 *189a334ccad693a2bed4df3488be51cc55f00e12744c4228caea80f931e476596896fbd80520e3 *e442cc9f5f0340b492337d2075abc38322f7a224cff15c602229e44cb2b088dd233195508a2005 *1044799a0f4f3b988a10714ea298f1f3bbd0501dcc8d1f218ba6c7449be2a17fc786973cbe51b5 *4a0a3872125836221c14a390403abb9718461c3c026ab6f7845033568ab8a3c6ab8b4d00cfcb40 *a4cc632872ba2311ca42305a8bec34d131c73e972a403c71ac441f23890a287b82748fc8a24905 *e310c18c902a25508b66712b7b2e02fa3f7d98d1eb088cd854090bc641c44462832681c21ac347 *d480d69b0136160faf44d2882eb806b272040549816875882092823c89e8c7ec511ae8e0969125 *f83c05a152acc19e600846b18e8055825a0d154ae182a481521b14d429d9271a105294a14743a4 *39015c361ddd9b065d2119a54a85dc51018a3c4608c1711c41ec99e604d408619c8ce64716d447 *45e3802e4509bc4ab285e15f0c6da2c8251049c1fa6231ba50b0b2d83420c79b0414ee0849181f *9134dc94d832e7c1e993fd0fb1fbfb17adeebf44b4f1778c81642afd0950ac0c7978c846d42e4c *3c69240d629086d92389c06d33c20fc2e7446b54a0c5c253215489e89ed903262b4b9ede999c99 *40a124162540c2fb834f82afac6e01892708d807fccb4d94d6bf048d22f8d81ad0da794f3cc52a *fd934daf08deaf0258e6541bc72ec09e3da922c5af32a9840921bd2d602ac6c211ca8736a4a653 *3e4186eba618400b9fa7cd5dc12591c652402bf37b5955a0c5407dde989aecb90670f351634822 *05b433ca6093b2fb923138ef16594200b51e1d354f50d5d98141a6013c6d85c4ea0429d1c7d6c9 *431c487d6fb205315a97683c293b04d97bea860d6885907c69449fc8ee4b460b75eec6fb3dcb04 *51f80052526c4bd290202017a400ec64ec800218ad1af8e2f1ffcfde956ca98d6cdb39bfc200f5 *4dce2440b402210402666ae9fb4682af7f7136b82ef99c94af5dbe76b95c1ed472e54a030a22a4 *b3cfd98df82e194b42f02ea59ec2ea896deb38a066518caf5290e02385871faf3db81ecfc65a02 *3a92d4a193e91ea120608c5d320f12bf8e434b3ea678e5e4aea17d5e791c1bfab5189c23748702 *d8bede19ffa40440f74944882b756f9e968e9d67faca5288b9556a08de15140aead810fe4c0988 *d76c95343c149fb70d5b5522f78ac86f536957c7d8dec435d7a15be0a0e20810840b0a74f46c73 *0ffbfb988ce63f6b16893f9cb7c93eab55a68d2557de2cd000c42a99105922c89c5572e254f5b7 *72854a1be56b6260ffe06dd6cb8a6c723da1bfe44e8b452bc91cfb7cd0fef7bccddb2fc5dbfcec *d37e4fde66a539b2d689363bb70cb7cf553b5ab5d7b92c868abe7707656766646dce7326825b77 *d469735cbf8ec4d67e562d98c1e168e4ba94ca8a779e6c8dfdbca3f3fbabb55d77ac5c6c6c6e8e *6be79b61ce2d36178f6b6771acb59676d06dd48ae34a697e2c34783d6b79c1f23a0e37c7c9767a *e5bbab5912e9978d1094e6ae65ebb960259cb3dd584baf36384ffd99b5fb226fb37db2abf38bd3 *2e8f0d2fef796210aa2563ebce1ab75bcbcc37cbb9ae9d8e23452c55b6855598c50b213beeadba *1de9f365663999c7707d561f9b43a9d61fcdeb3917d64bb26ecc7c9bdf59c54eb5decc266e65dd *1c75ae51c130747fd16b4dd4a0d57307b7e5392f2f9dd4b81a999adf2e8bed7558b3e5752b9577 *25230de3ebc65e0addf539f5f68bd2c4e0973f0f9cabb02249705765c79cfc0c746a8e87b01c88 *0214b922959654ec7f6176fb7d789bfff5fded8febfe3bf336bffa6a7ea17168047d958c44c314 *5e850c467008060ae1e017a3b6955ee0c2186a3f592594ac800ec77e933da435585813b482ca90 *a0e1ab6126c25892e49166c3c0077b1ea510ff04e0a771180e2508777c350e559100c32e4187b3 *3af96dc2a547001b33864a4703a7f4e32a5ea44fcef0d67df0c34eca7d1a19298f90a0f85e61c0 *7df1d53894215af6cb7711888e2c240d821305cd32860352888284579ac2946a3801b1a501322c *19e84fa03661972300a5c998c669afec7454426f644413631c9d207355c6fac38c88c26762901b *5f0554f154fc4930381580ce15b4f982ef320efdd35b4b0815232f3c929b58652c80322aa133c1 *435944815920a8537211ffce0c46438c14abf618362031a240234f56d58518a3323c1a43e79ac0 *7e93d281e277da2aa2bc4640723c7dfbaaf8e8af306c23dfadf5112b244068ab2204417e42471a *80938c34538a4242254ac5a54a8532fba10ce4405a2f95ce0bf1699ff805f7ac2109f63cda5def *083b7a8e7b480f195a63a743bfe71408b4bb9eab6482e91228c11c904f0cff1b81ce0b79def204 *4bc8ba53c361bf07a03ed5e8ac2827ed9602691c479b27c441d031c0a754e1e0a13e648bc09628 *7d9f9d4b23f4cffd36ffdb5be6ff82b76920255637dfa43201ab3bdcab30bc5626b3cd324f35af *56792b9b6f32fb89fe2d7e9b7571529aa6cede54c46a7db5292a49b3638f7f84dfe6f51fe8b7f9 *79c1fd7dfd36afff74bfcd8a3d3a55ddd130df71ad8b77f677f6dad527eb4ab96b6d075377cdd7 *1dbd6f351ade2c0c1da9b0eb72b6e6464eb7b4de14fba3511615abe352531b6bc5b95b6ad7fc5b *b73ba91ad5c0ae1967bf17b9a3b42ed4547ed55f6a83ee942bf0e234ddb777a79e5c1b2eb8e168 *b451ada2b65f9addcb7e758b0776ada81a03b6789a180de5d332f0ebd23ae7a2f9408f26d997fc *362dab730be5e82a4f271bd3bf1ade4a6a2f3967229ad93a1af7fc5d7f591870fc20ec9f2f9521 *6fcc05cfe38b6a325cb3325f09ab75d79c754ef6b179bb6d5bbdb55cf55deed61ede3679ded887 *f9cc48d479c152c6b6c4198d6ea66e14cebdb576873c98b42f91eb55ba419eefe46a332cbab979 *e82afe305a27bd8a503484b97d33b67c6b372e6c9b421c4ceafa4facfba1974fe15116a50fea3f *b166e0d74cd1e721d86e000391f243389b5f75dfff4d399b7f9335fa95404a04fd0e6c2da9f51c *512945c67b21b58343c8b9a53fe54bca8813123174a28c4ac8d12584904af0578fa5c70f3f661a *4a50aac7681aa2324c903395220c8b8357c4ddd0257d252e93a98d1801ec68206a51b4269c2a22 *14e412c236196a7895792a62dea2008b719014b157bb0be214d49312e25f2398ca7c0c7312eac3 *ea18db8b11cd9d584d780f085081bc02904695f85d17f5f90f051ec9c8ba82129e7d292a0603d4 *980e6859d80723dd5940acd8576340195c4052d5850fa30711155b84b19e8cd1a282d9e6c757c1 *7f223ec6e03e42b14f5be207703659f52c6156c55016651b8067fb480bc52c8f9457705361f049 *02d67ace1ea5e103d4ffec6b6677691926b06cd564648cca70d161f88726ce68ea13967eda0d6c *516274a3195a8e93473606018f14c3af4f0d20f64372b301adf7d9b945c4384f00c537c4488bbd *202b9023cc6a547863d036d290ca1a617af534f6626f9a08b4dd49cb1701c620f6946d7dd283a9 *a0ec4a983004c09ffcbbaf90bc62d347e470247e9ac6f0746648d3081a2983312a26c2776711f9 *e99fcb703722aa33ac81528c5302ec1b116d7ef2f308086805f750baf8fdbb9338ed2fa194efcd *d9a44ebbf6662a6f06c3242a9137cb556a205439626b4a16e49fd2e31be6be02a53cfb6d86e974 *d2dcdee4f9391e9d97d559de4af4d1efe5b769ffebb7f9d7fc36bf7e01bfcd6fd33e2b1babad25 *a616d4d75a58e8885dbd68af0e2bb391792543704ba3deb277e02d6dbe1a4755bf5715d5f9bad6 *9347e369e6566b293bd1e13ee4ab835ab738174e85d6da9aec6ad1daeb54b617ab194665a3ea77 *2ce51ab8bb4bc31e4d5a9c35576f3ddf563a0b6774d0aacd665916464d21ba86e7dab9b0cc0751 *d4cea65e5f1b8bbb5643a95dad615e0d9491ba68ceacc176e9fbc3b1d3b21b9badd8992fd4fede *70445d9e0ca3a2d537d78572b9385caac5bd7b2d6edd5d9a55cfed62c61e35836422c887b8762a *363abbe3759b71f96438deac15ab13d5bbfb58ab35fcb292360ba3ec9689c7a670db97c4e0d256 *7a4130b773af298f760b4e96e71dddb72613a92bafec656c9e92badbf47c2d3aca52a7d9cdfd73 *61be9ecb4339faa2df66d5edfb5970ee979da8d4d6d6d7d2d90d3682971484abe5cc764b2e5e4c *46626c0cdb9a7f4af341da119a37e7e46d469a3432f4235f9c5fc2c3da688e72395d088a5abe89 *7b7f6627854acdbc9ca232dfb836ce667669ef475edb558f711627ab40cb2edcb2adf76361338f *74ef7cda1afe7c5e9a9e4ad27966c78346502e94c652b6b8ae6a4753d23bf1561acfc6e3fe5e5c *9f56d651dceb7385a1e9fadc2b265bad5f9b35b767e7b45ebbbd813bbc9e6545de152ca97af017 *6973343f70f9b9351b59fd70b7ea19b75225cfa2646c9b5bb5c390f15650f7a540b866a7c3c558 *46defc58c98fb7daa9e0e5b799275f2f95ec1aebe2b423383d7eb8653763811b2d642e99fadeac *741c5ae73d7f38f7768ab7d4dbb3aedcd6d88a557f6a9eb00ec303f25400dd47c4089e3dfb6368 *caa98f884c2d01bd6df93f05d4afc9dbfcbac7f91febfa7bf236bf6db17e21de2699c3075499cb *f75058201cb2ca4f40770c499cc48ad5f005eb3245bb5c41d215f9436214418d757029535060a8 *700de8ef1fc34e640904329ce478829d12987b29666c54d8710f9adc2bd81901f1b2e3ab22cf40 *881e4105292c242896009976022c103f869d7823b60d03c4bf0920c5c5007e2156e6aeeb150029 *3f9e4bc1c7418598eece380d213823661db4531c5c81c2e89d15c5ff7b8528a1198606a91d313c *ef86f920f250adae124e51d4979c4905467101c67b649f011a177bc73b13927c5e3402443af8b1 *1fcfc6e081a201b5b2a523ab521dfe732268713cccfc403ed25f70476519fe32019a089fc27769 *4a24522f80adb3061a1a89075f0157bcbb08f7549a0b8239c93e3c43d434b644b01fb91e02877f *3c65541e89c26c432608d621c16940985186da4f850b63a8be4c3724269400e8a420a140232c26 *61004c1708c126bb34597ce79bf8fc872d3ec17b0c99d8c384ed6a0e6d469a2da5e88970304114 *5e3a554648524811d19d822cca7632392902cdf1987dd2b908def1e09effc4e0212bd017c61888 *2a7019251caad08717006cc90ef485089790327ceb8833ac3e54c01ae8902208716cb36970e37c *253ea53ec50fe838f000ccfa9ddb8ac415d257a265c5360a5ba910fb803899010178ea113c5d73 *0c535a76e7d214ea3b88084861b730199cbd18a67df43ab0df546198f4ec3d483e87200db25d1b *4b8f646c32b90163931c63315c251625423ec89fe619b423d79a5c91607a19826c2dc6b4816410 *c779a4682af76e904ce3c767d6a870272ba2c1cd21ed23d0d1b00811388f0e1099abaab8c98630 *aa79faf031f884c4b4d61f2c53b6bf2324108630a8e4d082113478db40139a3e1dbcf0fe096105 *4939a2782976c315417010901e1f826fcdae480431f2d9b2f27e3678f80cb1b5a563a9c0ac192e *cf449740780ec7e35bc0ac3e7dfae2d8ee67efc2834fccfeab40fc9bc27c957d8f3c8897d48483 *e4967d2fb4f84f2bcfc3ac96ee0b011d123a9c09dda44866a0d02d20e0c1fb90a89116dc3d8b9f *6edf111e75299e5be4ed89d629fb242258a0e4400da32f053e40291e3fcf5cf3087260565272e8 *6bb265646729c20b8622f23c630cf61139c3fea247efb25538dc4774d82fa968f490bc5ca24596 *95470c690862378f68531dc4dae769bc827e6d8adea48418c900b13cec30b3db25f95ac0f25442 *de11a57a3e75d948881d83d1fa7958baf433ed889437a5f22694d16f44e7880c3934da74329cc5 *d8cfab652a2a4818cd7d538c64abb1d81dfa7a72f4dcd2ac94970db1994e7fc058bb53fe77acfd *b563ede735fb678eb5cb8ad6f59c62d43fcf867dd9e45379a10d4b8159977233c9dcce6d61d79d *616bddd89f3b15bb50ef725b5f54f4e074bd2dfb5eabe737b492d1302f79e6db939eb51227e7ed *5ed0c76e7cf416e59a6655c5d6aa52dfd75aa6689d5a85fdb1363dd5d443bb381ce561f5d0ab57 *427f29cc16b3a26ee4a5b1a1f71dafb9ca2fdd56f9662db6ebcabec6496349cb8c5dfd8b63ed86 *6f578fb5cd79680c93e3b17868cf2aec4eb117ddbe321f5b45c3cb1685a85f6bb4a576342e6dcb *6e905b7e1cedfdaa1b9ee4a2d9959b5b2769884d67a8860d5de84cc6cdbdb58ecf91b4d88b9e3f *2d71d742744dc7812757622738e7e37520f31d4d195d847ec931276327598cf791d39877bac38d *b65f68f345503727abb2192d6fa7c6da750a9eb63796e178f713632451c553b21ba2f4ee888187 *2f5f0a9a5f04b90f7baa115150fb2163edafbaefffa663edbfc91afd4263ed10497509342ce93d *fc3079d8b653a1a252959ebe37817ffec36a1b357da48853b7024a9c10011b31e67314dc0d234f *e1450a858200c6bbaa8bdc88e07929dccdbe12ea8c28c87b0f6103fc717f0189970cbf11188bc0 *cdc410344475c74313a883c3fb6a20ac22ca9261bf00323405137556244bf74a5ba12592e1b8fe *ea2a64649f3028cb3e03abfd68861ca2ea0e1e82c0105a2d7617115eac6472cf239189b62920fb *5085b08b15cf128c74883580c0cc3fe120b31a954304288dc741465079a84905c20e4461000753 *7fa5030ce86229ea1cb4fd147a540aa5f82e9ea95f8891941f663711e6b12194fc3c2038c35a0c *fbddc30c24d4f131cca29ee5cec4150f20a0e2d16ee6692b08f08915109d29dcf1d53d9723002a *78567981bac0ee3f31be6319ac6ff2f141a880062f531d1088a02340ffb3f12c7b40a821ba3be9 *23d145bf47b268607dc4c81585752dc3cf6406ab10d0ffcf3f8f3fe9e2409c60208a04be22fd66 *7a97e4a22fa2230a824147357a9748c1de9afd1ac30f29cc87157489e27bbb0bdd4711867aec7f *4908a7d309099ef6b10899a9864d1621c987d0260f71f3fd34c2994802f33c4293e9f928525aa6 *fe9750caf71e6b57ccb7b2f66681472f542925a06abc2906ed64e12e3eab42fa5ea55e4fc5faa6 *b176e5b86d25ed7033dc1b51a99adad96565a9bfd958bbf7ef58fbaf8db5bf7e01bf6dacdd12db *3bd7dae5abf5411b17f942ada7fbb7e395af5f2bcbcd7cbcea17cddb64bc9a88a772457606ce29 *3c9fb4d16ddb486f4bc5b89dd3ea605e1b05fd93d9151bd6b15928ae6be7bdd3229d60b9750a93 *c922ecafb336b76f36a76933df9d1adab27e2ad70697f17553b5c6f5794bbf0d86f3556f76e66a *615c18286d5b332bd1b0de6d9b2dab66df3a91c595e5cd52f434551e4e8bf37c3e9683b4b9f71b *3b439d9747576ed56d18d3ac9d38ed75a193c76dbb3aaecb0df3c41e247efb3c3d16cddaad6bf0 *ebddeeb2bff63ba120a9732def766babe5693f6d676aab5f9f9c6ea6531a8d0be7d43b4e8f61df *990c6239329d99bd996cb9ded65c1f466e70cb02e170f15625a93a6e24dd9acd4d569581b3ebdc *8a8b4a65b2174b85e55518a999fdc5b1f6a2b45d059c1eca2db7dbe4fd4363369c38f69e2f944f *6e4b502ef176a87b79608eba51bbeb5ecfc5ee71e65fb4f6a4991bcab137609036cacfb783678e *4ea7f52ccb168d4a7b29dbfbc254395a8331bb4599d62628751be3419c1ab233f43371aac5fd99 *bdf0ade3e2101e1bad03171d5b976ad1f6b561dba81cd3d6b6b52ea48bc012eb9236c9cabc5c39 *f5a5d6825dfc48ced7627670b9ee2c4c76eb8d3df05767a7d75f187c323d79819bdc82c3448dd4 *a82074065a6fc68d32b719bbdea2d2751c6dd6572aee727ee5af66ba5c048e2c2e9db5a54c14a7 *d2dbb52ffc40e5f6b7d53a3b0872a910b62ffdfab49c351251eaf9adf2399e5ff3f6a93670ec3c *1f6be6beee1df4d174239c5371b2746e9bad5d645753e9f865f7f653dd6a9388caba008e22f71c *7405a2b508e0508d1e9d601d967ef1af3ed6febac7f91febfa7b8eb5bf6db17ea1b17680f4b2e0 *53884084c84756d9a63cbc85e447f6d52b0b9ce8ffd8bbb22e45b12d5dcffc0afae976afb895c1 *3ce41b202a2aa2a8a8bcd46576c65008d45f7fcfde44441a833974e7cd5ab5bac8c815990a87cd *e10cdf9ebe9d3cc57bb248a59320d92857139684c08002549b8878c51b8e2f026e63ac189920ad *0383370d91da074ce77590290b4037b9e152860a611198dd6544fe04e21299097427203fc45c3f *82fc39a412636ec890a25b3ba8f3d1384c8a8c41738e50a125089f0829a1a3eb16f58b1a62a534 *015a00e5820161540c2c0f5185036e8bfa496f398439e4bcc14439817daa63c9213908b08460c9 *7a55c4ea1b379c90313a8163ac7b17a08a08ae5d0635580ca4857a1302164bbb21038f355344e4 *b91130145cc5b8e318cb92419032ea23e0edbfa1c02b58d78328ba3296525391d2057c08212a6e *22d624ab2b7cdd505c41e1c7545f19df452261fd3c1986138f31f68c8cb5331870d87cd80290c7 *21d32b97e0e089c09cc1d6be2274ff905e7a220ab96102886aed02dd900ac62993c76731609ec5 *3862089140c533bd11a490206b8c82dc37a4ff812d050b1ec5ca538941728282f1f9b746148f05 *3c59a4048b305a444157765c177b13c0b00235419078f763f7be088a768a2c2a12facf04f49ed6 *bd41ee0ebe46059468fec6ccaaf5c7ba4ca0cac3104a316021e2b10f911a987ccec537cd31e0b4 *e3df7df3f32d0e29fa8dd16d0be1fb210c11f20204e41923a316c25d38b0418898ab1005af3cc3 *5060105995c00f19a277170b3f92610aae6c06032d54580e80924706a3ce351d371f205d98849c *6958f193c3b429200c669f388420151629b6c8d2463e8faf4c064c6d71c02c6ba82bc880f544c1 *8823d2b92a06c02b686e20678af8e6ae59d1a0100e8b342b683520f34ac22c08089fc0cba1f44e *08e33e4197698c4bc017e139b07128986ec0630f8458a727c0647b220383151161fca1252c125f *b937199cdbb0fa07789504261b1e5362204b3cc122b0326002a09513900ce94af80419929210d2 *1358a4c68a308b26c59d89451a6d900df9c3d5ba48ccd560250b0d11092c642c72f330188aa8c0 *88044b1b02b608e76a8cd9cee4f5c55781283156dd251202fd0fba7f21448ac35c09acaf18f14f *c6b314a37d6a06eb97cb81134cc132a1f506932247b504f22432261760ae3e9141c5081f0865b9 *aeaf8359d6645110316c8c746084e59a4224099490395c8ae09c18e72a83a47f5fc219b0d22999 *ccb5b954a923319527eaf21099934464c0e2b17a2c91ea3aff8274bb8cd93529d6d4017315daa4 *525cb3045cf1557cdebad06510bc62b1834ac7683c8aaeb8abef01a318f9769b1c2200db86f615 *73d07b638fa87d66f4cf8d06925a999f75eeb32ee0b687a15c72137e18edb3a67d5635321f7f80 *54c80215dbd70c7dd8d1354d9bbee3bec9269addacde7b53475a45b5b3276fea291e4d1833735b *4d663ed2c7feb4cfd64ed017cfeac136d6cf9ed5e590538b70ea9da939b75984c6373ca9e3da8a *d26f9827bb313c398d89605f5cb0a2889433860fed970f6f897a4b52ea7b45bd2529f55a5443df *5e3ea44ed69758fc6562a499b1be139acb4411861d95cf2955168fe1d1afb67129b0c34923182d *8d5dbb73bf59dd3972b7daaf5777dde66061c407499d0d1d71dd1f0f1fb5e03c19f7d393ddbda7 *8abc1c6c437f696d1b31a72a59761877f3a5524c1c6e621772e6cdf949e0f4b271bfd7d7dd79b9 *99fad1dcb384f6a695670f6d9392cfb3bd5106bdae209cfc62277029a73adcce97aa8f39889137 *8817b4f830e5cc81b0a2d4fbd89fafcb6a265ef4a077ea9472bf139e9bedd9a88c3d7ba8751b77 *f332ed7633b1c8d2bb6278223abd6930aa3c265a71e05914f3286e72db50a487f9aab9f58fadf3 *68afdc9dc4bebb18748eabd581d5bb27293a05aaaeb43aecf0515a6fef96f383bbaf260f611152 *766761747b5e6f22170dc3ef68e5c3f261fa306e1579311b47933f5185061b3c5b6b7e9fd96fe4 *06ff102710ac28201eb9795482a675ed28bc5a69feaf8440fdfc912ce834947d872446d01c85af *aaaf7801ffea02f5ebeaeb4f7a945fe591243afcb73c924fa7dc562e058c4ec6fd090a1f24808a *6a72db04c30ea1d67b7453a189a4a7fc460025b855130044300d54345160c35391b0514e6f46d9 *12d00df83d42a61c15b7e7141c2950c141816d46c69a7821a6477efc14350310a2e018a3841924 *4215918848440b51846cb9e10d19140428e42942ac45cea17608d192359b1f82ad10fd9eb77874 *a04a24c60d26c87348f6c218298045d453634cde051a5f069c3c1fab861c32a28a483b99607df0 *baf0200b688c475d933c5180bdfab152c53ed5a10666450c7b239a9982a5112188117d4d401fa0 *dc64664ad121cb23cf24a0b1f0dd593f9b04085eae88e53c18a42fe261c8911f82b1c88b1010e9 *8a182e1821355188d543be78c342ac6f89a9a45c0da9319f56c5dcda08431cc938e411e4815687 *9cb95f74122c282f21dd2500dcdaad8c201e66418ceec71855d2da532a029abc0e3725324ba87e *4438f0a0ba8a044fc1621d16209f0cc1ae409031c16a64905f478af3c84a4c503b900c29e0be27 *9892c840949c487e62fb250a438c860aa0be7c5da33c44624c0eebe5803907d124a425e3ed48cf *88a88eab388920e4f5b55620624d510222199c74020627403d498cd40d306a34c4f123d6dcc4e2 *1b10894b64023bce23596dbf8a233f849240d4a3a3a6c483184ddc9808a694f4cf3a0f718de46d *ea4dc0f41a84cbff0094ec233fa569985ab7f077a2e3a662e2718ab2d537091f69dfcf4f495047 *f2cc4fd9643be3e14837e733776135fb9b39ef214fe30bf9e348a87a5aed33eb9967ef097b4eb2 *093898b6def93bf92919ca1e9bd56b7ecada6bd7bf7c9d9ff2595aea47c4fd485aeabbc4b55ae1 *0d7eca0ef2532e869d3badd3739263abcc2e62f0906f1b9e546db4d9dc3e0492d36ba48e74f104 *bf396c8873579b44dbfb55b55a2e738be0b045d0eab3b3fd71641a87999f677edeccd78f9dd1d9 *db5a1bffb8d492812a34fd703e6cfb336d1ccde6775b3eb605d6e878fb8545952eb7ebbaf9b8b7 *cedda95f25cdd8eb78c6e9e26cb7c6d18fc45d8bad7c66b5e147fcf4ac8bb296d944ed305fc606 *7535381a69a66ff899bc3896e74a581d32b9dd6c6d176bb7ec0fda796fd8181a7363906d23c1ed *5e18efc0f5a5294fcd870e373df97b47f14d433b5b93ea74d830bbf660358bc2de567e28d4a8bc *e48f6bcee01e26455f5936f88ba7defbedd2e1353da2d8fb3d7f5eada7d3a9e24885c366bcda1f *4f3ad3f830eeccaab1e00c560766a3b2338595ef9da993b52fca44fb33bd340cc6f44868608078 *6b11d647a86825c3024d94f89a3b015c346441617e11067db350fd1418fa9a97f2eb3014882c69 *f9da8bc232ff7b18fa634ff31742a22a9aeee43a84ebd9aa2162501798ac6bce492c14fe710b48 *8dcf443002e172acb3c723437782592b50ba4cc0b4871b115d8908f65b0183cf20cd06935818c4 *6d0a5acec8bf63ccf1b8e520e0d19049b057887150f574807037e4dd068e4a64a4845ae1371018 *f98a43e4c761854009438918cc794831c10380518c649b37ccb9048e1044ce622c160447250071 *a0bc0006088a98ca465a065870c3bc1f22413cc11f108b862931406d82048c624d7c82096d04eb *0bb732a5b0ca222411618d4140cf758945bc5c42ee72490601921b6f93ac0f1cd27846087ce5ff *3c1225fd466e2a63de21511e085623d03341832b41ed09329700c0c232e8e0aa505e598823f929 *ee90419614a0b2e4a0f3197ce4046d9604aac62c0ce9143d26c1d5b343724b5de71de980003e62 *5e5a84a5d819749f2998a507d9535882f2baf323cc32e4d1a00bf648c47f0172608ad1933d9b43 *478084652b0840bcc68202d631207a0e1963514df48f7965326a0e31f2520247a50c5853c632e8 *fc75ea117a24c90a5f57098f91b99e4c58d28850571dc0c10c585f78ce1abc0ee7c38c96146dcc *3172dbc822aa6d3108005e45a492571007a7c06244fdf6f1b15d47643dbc3f1e379f22f8bd0bd6 *49bedcfc1e1f03f8e0c6553f7690c59b9104e137a63edefee624917c27f312cf702cf943ce1745 *8efd8d667ecaddbf7194c72238d0f46f873cffead37eebfbbfe8f1ad8042acc2aeb432adb2742d *237fc75a4fcfa287c57ae538dab081694e81f2c670bbf06d775251668568d932abd338dc360f3e *41d7fe0c40f2f0645e34b7be201a1b9b7e399f161babe93ec69cf09636fee94b53dd8746958ddb *eeda1e0d2b2b7bcea3295e5976c94d5e87f375c9730d47eb5373ac8d9fe3dd1acdeb46f5c6706c *26b65e5d43f38ee6ce071469518b38711170de6330ad4abfa51657650acf44f310ecd59aadb50e *ed849f355e3eaba82c603eec9cefed1bea56e7dcec1b97a95ad573dfb833ca9f762ea483387f66 *655ecb5b84232d779b7dbd3b367d5b8f9ecb110e633ee67bbbbac190db1c7b5bf7311c9b290515 *13df740c9e3c6cbf3d998c95705e659979b81a233a0c24bd9d61b6526fc7ce664a1ad8ed457119 *157bb59a4bba371e94e6440df7f6767108a5c72ce8fb67211e2792375284bd4c55ad64ff201ac3 *55eaf484f62a0eee32963b5d8a5c294ffada6838aa32cbd4074532e682d8f6d7770f52ebdc727a *fec86928d1b04d550b369f0c24f1288e2f0cab384dfdb2b7f8b07d220a55304f36d3f965d95836 *bb7b563f4ce232b8db7785d1d0f2b441af3df2d42635ba28be6cb59d8cf50f625be1f2a1b3d1f2 *96361d0da6e7d49b0db4a6b2e05a8df02e4a55792d08debaeddfb9a77d4226cf629352fa4eedf1 *e6683af1fb4ec74e1bbdcdee2cc7a3623e51156fecf593f5329e97817e7c3c9bebe6817cd93726 *db65198c763361b22aa86663dd5fccd495380f0db7d5db1e234512b5b12874dd92671dee3eeeb6 *7bb9d4cf9a83e561b96a9f55b5dd117aee5cf5d5f67ae6519763d5c8e6430dc48e34d755d7edf3 *e3402b97a34dc1e569b9d31947e31fac7d18cdcba2645789cb9b86d2699cf6f79bc3d4a4b6f353 *19464e2f7878b03a044237d4457ae7968b513f631a778c269f573372778be57b792e6f1efa2553 *1c5ac2a4e709adc9840ba94b4e9a1a0c874567a90b3ad3e8188eaca877fe319eec3b7d761c147c *1e596e7638fba1d4ce0fea326daacbd62a5ce9475b3fa2a5213687c389ad7775b34dc620a35f70 *f24c61fc8beb90632a279b77e6966f69f3501866665f37986997631ffda67aa122aeca7cce2bc9 *7c58c42d6f6d119539e2c9d01de92f7364fe2abc95ccd4e1970629d2a24e94f68696f99aad1d5b *fa99cc0b5b10c8a2d2d434fb516b68476de1ce86d260cbee7b39d328ef35b997b156efb28b5622 *c567d6446f3ff64dbd5b3e744cd750fc42ee99c671b53d78b6fd3555f43fb1fedfdaff0fbf70ff *e778e6fdfe2ffebdffff8ae35b69cf7d4828d8df5defff6f5ca4c32698ae1ec6afad6bd3e6fa44 *7dd971b3ab1dd7dd4430c31ae6d82637c60b4e7677829bec84ec502a1faeead879ea3978fef9cb *31ec34866ec7ade1a9bdd2a297e0f9c92bcbdbe6d9b14bd59e5dd3b3f597b2bbf6756316591f6c *57a8dadab57d73ad373375359fe817eaedead25e447d67bc3ed90d8becf519d9ff27a729f9cc46 *0fb755bd7cb632f4fdc5ec516f3be547fb847adb295feb932fd8e048b041bc99effa1b2adaf99b *68a94ffc69b3b0dd75d5acc1011158279b7854be83377592f24b7f50d8210b38397e8f85be5273 *e739499922fbbe280a6e7ee7b599b8e3f41f36ab813ebd3364ce6ef45bfdb39acc769764353b44 *9763fbc80f2295f382a0908cbd659aad32a1ce2d4e3d0559c8e6726bc575dd6cefcda36d7c928a *76cc75d6cda9a8474d2f9dce7a0237f08443aa5e96f37ca7aca6c7b0cb052675d79316461185a7 *386c3b2d3f1e5953bf5345f7ac779499d1bd6c6da7777e7c54e66673a93db9ce734ea8c2861622 *126dbba6d96c68a3ccbdd10f8dbc654c8dd6486bb5ee4c8b20ca61d15c1645c8b969c4f78f94d5 *8a37e1d63bc3f0f40d7d05e91d644065d1b3adbbf57a08c338b86e90bc85a149446b91bde7fd0c *d41c02ae74c9768ff3d678367145fe7e375ebb8de1468f3323da2dce3cb5300fe976d0dfdc3b07 *713575b6659926d6ecc178b4a5b82bafa7f75d3dcccba5b04f53ab3bf182b437b163cdf53c49df *5b2ddba2c4ded66b76f96356951d867dbc5719d2a7c27a3ccdc7cabc1deabd62b890079769d6c9 *09d295edce7635cacab9e1162a7b9c085deac8c4e9f4185bc5ba12caaf73befdd9ebe2ff97e3ed *fe8f36d29fb6f3d7c737f67ff2f55bfd5f1084bff5ff5f728cdbd6886e5a3d936e6b237aecd0ba *49bbe6a0a7196683d6e7b446fea7f5e891e97aa67b3d4dff8bfeef51d71ad8e6fffc3d57ffc2c7 *9bf94f5e76c3363f19eef827dee35bf89fa0fd37f39f97ff9effbfe6a0e8f16279a4c94fb148e8 *e76140c7cb431215f9e14ce729aded836891dc6ff3f80f720245578be490d003d3fe3dd945799c *c4f4ec93c8a8579eb5e448a7f9811e8d7a74404e3d929692f81345d183e440c7491a949b026f98 *e69b4d5e2d77195d54399d2e37e44ab8627fc81f97a4e5cfe49a9cfeb22ba109fc95c4b5532fba *f2d2c29d5f8bfc4f3aca77e9322b891474b52c167029b44404bc12ba496efff4e4cbc7e413fd46 *dafaa6011d97dbed1965fd271d9605bd0dce7488cde54494ea40505fb2a3c333caf7af2d51a8af *c5fb074dc65b961474b98b49f361b9dc14bf17cb6df2a97ed42705fcc387fda361da4e7f3476b5 *b1e5f469a7df9bff41ff6b0497d0ce72f38f27d1def7c92768a96fc2123e199974bde83b6ebdb6 *f7ac2659cd2dd22e99fcf8fdd3a27fbddabf12eef728f850beebb740c6cd77897cd5ffd0dc8b3f *f653ddb2a141e3e591bcb8820800396c5f5e3b0841e7bb0f3a199a0a9328802cb863b2497f872b *491befbba61e6fbbbca083284af6053989bcba60b3a1c3435e91f38f1f751e11ebdfec5d7b77a2 *58b69f7f874fc1a46ba6aada4ee421a0dd5db30644115404547cf4f49a4240509ef210f1cefdee *9783a6ca98a452a94aa7ab6f67af559588b0cf39fbecc761ffce3e990dc6cab0d56bdf27c8163f *ea1c1fa16169ccf40a41f67a33c0ac2b0e2622e0513cd92c1e1db54a6ef0e1ea41d6ba76b92854 *c4356f495a830f5f0011173c8063fa6cfdd7166e29e66b23282d80fe840d9c9ac02a791d17dfc5 *808951aabeaef90749c3a67fb80a1ad75db045a22c462c7e5e23ed85d738ccdde1eb72526f4c04 *e0749ca6620602ff830ee981e7815246d8f183cc87c3038e7eba31e35a6b56660ccc6816a4a06b *f07665662587d5c78d1b80a906875af1b09ebada99eb00a35f154db85af17f62ee1208f4254a7d *bff451c7ce687ee99860f8151c84a65f4818de010778e9074121954bf0207c5970f8d9d73cf39f *6006a16f74957416fffb852101213ce91bc043f19f22cfe37f8d246b2ff1ff39e8bbefa0efbe83 *e1eb79074ed631cdb054755b8b6d38ce3d77e53b31308b7367216985174943f09001fc37e0d40c *c23c5a5976025f9f5c758915af78b0a2b94b787805b77ccb7463dd2e3cec0f305db85905dc1cc3 *8a59fa66e30a2ed84050d1d47f2465c02974ff1d04a521e0ff63e13accc2e3fcf5f25f85befea7 *58235891e6bdbb78f5e6e4eeb7173fc1ff86feba5ac2bfc01757af5e9ddc7901bf83afe05f7f02 *83f3c14d25945e38acc2df81e15dc1ef4ddd0ee057af247ad481ff0b83a87369c2afe3ea8f55b8 *6abd7eff136c04d70f5e3f7c640e185c3b83e29fa9e5e737032abb75b9842f5ebd2a1aadbe7af5 *a16b67ddbafdd0ee710f01ba29a5b3874b3195b4884ccdf9e92e26cbd5adcb67978cc24fdfb870 *b7e0ff7626f93b5b3d61fd81edf1da674f67398117ad280aa21f61df2cc25c11c05e1f27e67511 *e78b4f87e979fd61e69641114f2f60f49fffc03e74c0dcad12183ded0298ebebf8f03df08fa7f3 *7becdffb22cc84f0e1bdb8502370fbfbdb83bf1e6fd9d7c392edbf2797b5cc815fff0f5ceef95d *beb9f8fb254ac4f0d5d5153c745661681afff62f7e287bf2f627f87f5f9f32bc0057df1ddabdf8 *3814b708b42777f9ef901b62cf6c30aa5f6014f4f1b6ca022ff0eee2fd0dd1df0c77a59ff8f97a *b8b734e6a0be11505f70673189fe2735d77ff7dedc8551213f1faec0e8fb5b0ccf07f4803c1f94 *ebdfe30f22fda11cee2dc1de2960f8a214cdc9a8eeb421d7872fe3a332c01f6fbef3debb2df153 *2677fc0e5c83a0d23dfe08fc63e4012ff30b72d9d02e97f465fbd7efafc0875fbf3f5f87dc87ff *15cbcf27db02f460fc47cef13f12a1b097f8ff1cf4d0fe9f56b9ffe704ff635ff6ffdcb1ff672f *a2b7f6ff806b60ffcfddc2f9edf6ff9cc906ba4f389f2b1be83ee1dc291b9e671280190f3fee8d *28a6b10536059974008ef84d97aab1dc3582cce470b18bf938b30eda6abf52534668eae41a976c *37152640fd9e8d8a54a8f6f6d0cadfd273d28b1ca129d66b5bcb14d18864a78bce005be7548b93 *f93e85ef4c168bf681b05e3b863722a360c1cf6ac5306ad20edad1cb666762cbd5c8dbbb92349a *66b57167e0ac8d78d9ae53616893ea7c3de007fc78e38fb944c1888874225ba0ed315d8f0d019a *226a4fdaf9b1a593acea6d9de55eb36972dcb466cc9c6f2c8486aad7e969de99cdc42db1abe2e9 *686d4f64c3273a9c4b655a13e2d43ab744b6ba22cc1507a939bb7a3f9d2c7b09da45ed11be53c5 *314a0e057445045c5ee587f2245df66244186a5d22ec1a4b1b1a0e90f140c6da4b4c72ed5868cd *526db7df470e23f956c851cb31b56820819eae038c1e57ba69b7bfece188ee5b497b8dfa880929 *c674b0a7078c4dd345b7e978adce67824b84796fa5742bed65af4d1a7d1e659aca3edfe3d556b7 *d62c6660ba9e13fcbcb9221790916a8dd948cd52af96d517e9a05527256cdfac36e68d246c853e *2a049b25595f5b6b6f2f75c5501b60f44a969bc4d8d973fb7007b554cdcaf97d0f694b9509df47 *68a61718ab3c601d4fca0d29745d79ed73d541c3d788a0663991b58b376257ee7545b2dfb13288 *037aad200ac3f4b3d6ac75b706d275aedc2794155a41cf187a596fd2859712ad9900dddc18e44c *84e3c6a04fec0b62e521b3beb621a834a211304fd7b21d8bb1b73638440dfc69b6266dc959339b *750070be5f5b2d3a1bd3f4be557c536bb6e566d5a8491884781345190415b69b8a02ebfb6bb921 *7a60a7593726d87acb0e664cc678353e1bc4e9d6c0679340d57e439cf434fec751f52942ca2d42 *901a4211c4bdf85ff93b4580bb28ac56fc8e6225fe47fc26bd39a33f79fc3f9bffebbc6a1c3d61 *1b0fe2bfd80bfefb7bd117e3bff0b0f091bcc815dfcbe3d670f48207ff21e9ccfeaff1dfa1f284 *6d3c60ff2889932ff8efef4477e0bf851a7c35fe5b569301c8443137a919278fc7830fa9b6f81e *24388e3e07098e8f9d880e9db80319034cf4208acc380c7ca3c4788292dbd5d51d7ba2ca4edd87 *0b03567743c35f800b97a8da4768188cb478769500202fd156fe61c8859982ec9d6ec3f911f18a *4dbf044ab5234a06f8dc77b8e79b26fdb614c9513c60f45af14173af6138fd2636fbe6d05699b7 *038d4566e86abaf980bcde9e22729a1b0725f0578aeda396816e24a617069116addcbcd410d09f *628485ea44815722962b1f0cb410ce9b26c75fbe85633d5a85856e95d0221041a6f909187e6846 *0547ef3e2412809f80111c643e5442cc7ee1057cdd7c34780866e0cb41c342f0f7638671f41c98 *e189ff77ccfc1b5aff632febffe7a0b3f93fcdff821290e2dad7b7f150fc2748ea3cff8b622ff9 *df67a193fc6f794681c2ab6071df6dcd3e1e0e33957986a641f91e3b737696e06e78cb70fa06e2 *d519b5ce63a42b4d7401cf9481d26dcc8c393b33a54156a98a2b4980fc56358bebf388c1a33ca9 *4dada1b3134829c88c7eaa9992d30a74adeeaddb6d0ed158db27090dd53b123ea937c7fd0acaea *1bc822d49022d0b43bc67175badc36e7f266c2c846829918b151db865a4f5d65684d023de7f5bc *8545b1b1a0766c7edcc60f817ab716bf1dcf91ba8d1b7aaf4f3a239eb6d6732c0f6345ddaf88a8 *833844bb566517d194c436ce2cf4eb9b9931d84d0753da80f0b9a8d69865d25ae5cc4ab4f6d692 *6ab264855fb8f3f1c6d15163ac37485ae8a064733ced5797da96eed87c3034723bf2e94e1d1a34 *c622daddb9fb71b8edb103d35d0c8c5ead5a8b65643add180d56d0e78ed9d56bfbe60a279ca62c *b3357ce8c623963107946642bc456c7ca16a612aa6d616928dee461daab7de2576ecc4838d346e *25386b299ea26e2a1b93cdf39d586ba88db43d5bd68329eb42685bb7a548f369a745e3f1dacfb1 *78c7883cc32592dae3da6e454b1d4671c481e1c5b1aa33a911fb2b6bd0ea21eec2a84d5208a102 *07d99bcd944e2b79479909dd59cddc4c544e16aa6c321e4ae00c4a7eb353d3a62c4c8766254e52 *15172816ab8f45b12a41cc1c592c06689ab0035bd40d9b9e5bea80f29a4dd773d0b1ef36b3512b *ebb831e1129dd51c47373917b55429cc6b853cd8a502a91e6f30237dd488228f6ed6871a43cc89 *38ccfa9cbcea6a73b4b99e6c92cc9dcb6c2bd8d3d35ce41b52c6f094e5b02ba733b720841e56e2 *5e3524baea68190763a7d302929e34875638af3b544b5b0f5165c2739d2aa7b747554eeb4eebf9 *aacf4bd810a7131df25d2aefafeb7956414502c1db6d4453b29517e55339a9aa1d75b64e66f190 *b6c47175f5316577a759fdde66ff81eef3ffc65339ffbf3cecff31fc76fd3ffae2ff9f854efc3f *7b8fff67d2ecdaff3fbe7c1b02f5db5f53be0d81faedaf29df8640fdf6d7946f43a07efb6bcab7 *2150bffd35e5db10a8dfdec719409b32a6ddc1e465b75e6f924277826b7685d43b728d05669bec *5624464d44a2a3cbbdcc9138bf324966c339b4e68824ab259b4d607942a5f068ed2ac1916d1e63 *658992d96d5734e9717d3dd5d3d53a9d041835c4e2852d27536bae8ce6db41c1c0af379826e2f1 *1dab23f71d9edaee71c2dba143c7c15571839b766673cdade06e0373b5c584fa14e3c10c0c464a *48ed43a8e553b23bf5a7191a53bbe962917625e4a393bc53f77e6fdbf833d07dfeffc916ff7ff9 *8cf53f85dff2ff38f9e2ff9f833e6bfd6f7df0ff8f2ee3854eeb78bfa48c173aade3fd92325ea8 *dc75d01d6dfd36d71d3a63c11765ce24491ec9529fb39a343ea19c8516d1fb561bdb746736e7ce *6d41f67db2ae78aa4f4fa0703a6e6f99cad64bd26aa5263406de841162aed3de361bbb0e8e6988 *3411238a96d674375ad36c9d9b0ca939c9acd39d58976d169ab8edbe17ceec19bf1ea1eb8452c4 *658c590237c4943cc5f7693296b92c19330d294811dc10c02a9dcc93245379b1bd9125284dacf1 *1c15c69d48ac462d0a6fef6771bbdacc849030f0a8d731fdf9be374256938a23b2bd715655c3fd *6cd7a5166d4c2eac1b87647e3cc93c8cf7c132bd1f9a95b52df605b3c7f6743ce1f03dd8283942 *bcb693ee27136f84498225232a551f4fecacba1cfa90bcf137549799555971ed2e6d731f05fb1e *cb527855d73d5b43e85dbd584c37198d71f341227a0d79334051b24b76b692abace6d0442365b9 *6589030ee778dff1dbf3b4c1f7f4ee24ceb3b9d8a3979e6523963edcf88ec74e36239945a4c560 *8f0c9caa0be40159584d8896e34536a08759d6906c76bc4eab1a4e46a3ccb6e748d04df0965459 *776366d08abc8e3d97f045d7b5e5601e8c062901cd08793aec37ed21d59beb19db9e3b460bcb04 *7aa458fd85dd8a56cbca5cc992c654508c66400c77a499e55cbe5beb84b51de75da86b5a1ddd8a *d2eabc89879c9bae1516eb6d8a176291f60979644c6abd6e7da74aed7c389addf8db5fdfee3bc0 *b9ff3fe46e9fcaf31fe8a5fef7dba5c7e1bf273afc82f7febfa033fb3fe2bfc5fc3e611b0f9eff *732bff8b53b597fa9f67a1dbf82f5083c7e2bf657c8b565b00ba76cdfccbd0de4f54fe167dba0f *ef0d8fcd16b77c79e56fd1e74f153e7eb2f6f75800f994b5bf770df7749c9f5b5b7b38f1f80a86 *f9e426d01d5fc3dcf7150cdfc0734f4a92af8e95b080dd8762d893a8f06055ec4979f131a68058 *72abbaf8a924707f75319fdc59587c378e7d5d635c4af1743ebfa2c618f0ba51667c5e63fc08b1 *025ef7d41b7f46b1f1a310ef1bf6f6d9c837fc0630896338b423ad90d77163c42635a39569bcbd *058cc7dabdc078d1f0b75a4cfb07a44fe0bf4f06013c3eff4f161f5fe2ff73d04bfeff8f95ff7f *7cd906a8da80bea66c03546d405f54b641173320b20b6cd26f41fa4c66cc09d5b6cce63419324b *8a30aa2ff9ffdf9d4efc7f1879dfcefe2f0279d9fff51c7436ff37f0ffe2c293b4f150fe8f42ce *dfff09027fc1ff9f85cee33fadd0fdd6a8a50c3f86ffc3c9edec46426a825d9383f1642309f365 *b28bad9e31206a36e76d5bb3080b307fd35f0faaec424dd3755497595f8526a2b2355ba96a443b *925e264dddb6f8ad210c6bbdd166b9b5061e9fc5dc2c7769d6cb755e7119b563101b34d039d770 *cc1603ad66157d48e4db7a14a0bb1aab340d44db7936b31da518a32c5661a8752949a47b19b18b *eba6acdb48b70742bf508f46f53605891b5ea187e3758e32d98e42d0fd905f82d03f22947ecb5b *0bb5ce7420205cce7769336ecbf620c7ade974bc546bfbe9281cf6a17db102992c479b5dcf52d7 *ce76de4cc8e14c17bd50537c218fbcb1c1b1583acc18bdef4cd7385715f92ae5a34d729e32a304 *dd41e4a829d314e6cf6c64276bebaab3f0ec119689f940ecefaaf17c509d48e308d96cd36ae1fa *da436ce676930d9e29fd5a65dad953d07a86bc3b8b9567f3f4c5f37f66ffc7fc9fa4f49f50c71e *5aff23b7f2ff2ff9bfe7a2dbf93fa0069f93ff3b1ec3556aa31615afe6e04f77b5cb3cde9365ff *cede468baeddca0a81f6c30fed971989cf4e0ed137f36ebf411be59966873cd2a3132d371bfca2 *02836240259b7b9329c5685f92297f66ba6ffdf7d1e2bebe8dc7afff48147dc9ff3c0bbdacff5e *d67f85fd1f7e5cc5f613aad60702f67feffb3f8a503514ecffa32802c16b284181f77feac5fe9f *87befb5b75b1f2abb10d1d4f82fca009f0e565b9883badeae54cdf8c0e4594e364e5823f9b7aff *998fc8e3ce7c0427cde9ce11a6058b9538c9ddc369b6769284461520b960dda3048ba24bf03029 *56523f47c14273837fb92b3fdd15cb5447b3ccf8ffda3bfaefb66ddcfdecbf8255f3ce765f62e7 *a36bb774eee68bdd2d6f4bda4bdcebfab2be569194445759f24972d26cddff7e0048499448c91f *71d6b415b7d7d81605822009802000767c277eda6800c44c898a1a787ed733bad328a41ee357a3 *313ef3ccf3a867180da1324935c42f46239a4e26411863adf87a0240d6b68c86e99d07f88b850f *d6b68dc67be71a3eec180dd4eef04903f3d1357846497c8f7f27b4d274bc749f26fef26ac8fa47 *43864776c3017b76f4fc808d7e1ee23a1f1e8ed860ffe85e037081c64033071c9dd8ea6654498e *2c0daa1385e575a290ea00aea575e019d501d15f5a079e19bc275130066598ee05353dd04dc3b1 *8b1f220c29f62d276a5878dcb7069cea005458bac0f203d6fa48ff3ef878196f6f6ff27f1f6477 *e18ede1e0c7aefe47c7e4af63e8bff67acb3edc7ebecbbad75f6f0bb75b6b5f91d25ef7b27831a *ce034a02a40279f2843e5ec6c0c93ed2bf4b21ab47789d6dc2ff4ba2ada2ae05273a20b65f05dc *9bcd7cb3d27778cf894c8b8fb5ed46b005b966178e8921ea3cd5e6da9f08e3afd99c822a0eff62 *ad94c3b40d01e3c6fc434cc6c04f43fd698b953b82c70cd28d248f283ece27e6a42e67e959d3c5 *d6e5b9ce0db661a64ff8f2e9723f052307010bef9451f82e08b5d757b32524a439e16dbd29befa *76252583ba569db55ae97c69cf92b4a78b0284d94c99529b9a4b879bc9c30d17fd8ade6986a98c *b005372499ac305012596f8fb439f26add1894099451d78b9ccafe0dee58ffecc5fa77e636a43f *bab596b9dce8d65be60cb6e09a1337bf97afbbacdd3bb4f632a456b8fe24a7a65b588382d065eb *301bc0bbb71633dce65c8fa2af656bf253f675d6bad4f435bf3629fbf56603be915c3d737d9b6b *7aa1e9dbc1981b6ce951cb0ec8b10d9de0bab673d91535d044bc9ebac7f16c2fcea56b398cab12 *8113f9cd985d05e17b6646d0e0c4b1d02f2ef0c9290ef48c1833b844ed0602a4f6502f91937077 *2fcdb0eb05e7ddb11345a8f7f35f4c7b5cf805eb44d751ec8c3bf091ff76158f27ecf71cf9baef *9dd077bce46ff7dcf1a7befb01ea8f93bfb8cdf883c1dec1ba28be4c5a7280998ee8e379184c27 *fc63e8448177d9a1ed0b6d2cbc08f36c4b4c30643c3b74717d25da4a4a825ccaf35cfb19950c9e *9dba7c16cb55ff4cbffcb55b782f9b113cb9340e9bebbbb16b7aee1fb999d04858f9dacfcf0f86 *dd4e08b345c6f1a87f38c01003682fad00aa5f8257f6b82354437a8e8f5a1324152cad367bba96 *d4c36909f3057664e9ab625765fa810f8c9df093767eb405313ed026cc487721accd683717a3ba *98e8b94955dcdd6555819f7dfc800ca4cd52f2d0fe0f1e1455ec0f03ac6c6b2a23a7506a2bb580 *3b04d280897a0fa01e671c2f7d7e0b8a99f06af67b93d06db2162e35e4bd01b1a57b6d9ed33e9b *0994d35eafdb4fc200766b91eb9f8b1d1bd20609c0f70db805c9760d95c236d1fcfdf39c576c7a *269273333e19bc3c3878fd4670cddb96bd25e2538c362c2d4e7ced0253c65bac0f2d1c1c041d10 *6b9293c585cb9667087f2cade9d88cdeb3cdc78f9f24c0129e5e88dcd5f3fb76395b28c1cd5e25 *6ef67cb849a4cd4dada3e1f1cb5f47bbc2afbd90d88c8e1e4b2652f17b00c2928394cd1e122e25 *70182562cb853ed0a0ab5ed1525ab6240041032cbd86a9a98d4768660109ac654ee3606c621233 *cfbba64b007400934c6894d10c04e9a56bb2fe8bfede7ebb9374f997e1f005cbe2be84dbddbde5 *499777969f9f745c1f57ee5fba19e9564fb7591479d53fc244a8bb6c90a942a4f0f0dc7aa6b7e1 *b9674e1738ac3db568aa7265242a070cac993ea36c5a9ced92442be641e4b76a655c18b69327a3 *e1f1a88cf7aea0578bb0d7dbd38a8b545328773c82f5b0091d752cd7e6d90ca3744b9489590a15 *a1ebcd940da40e384ef6733e265982cc7e6e58d01540e47364fca61a1da04ca0b3531371909c06 *3ac00a3d98e88434de9826274104843b7980b673b6d53bc23fdb3df2c5c809342c309ce349dc33 *347b42d66a1db5392ead017c68b3933504f86637df48e13a99dcb3b4576536cdc8581738f03b58 *0c81d01aff6b28d06026da3448ca93e2ec838f88aec13602f5e7ede2cf7a2d3b29a40ce07bdaa7 *748b8bda6f4fc5e848c526546d1b4acbc5515bbce181dab03d47c383051b2ea818e9039ad8a91d *78f79519a227cb2edbf72f417bc7102a9cd5c0540a1a6c522405010b6d5034cf34fd3eeeebbb39 *934b087e988849f4e56986e912e7b953b3352a2df32eea0413d30d3b3ae8e957ee6f349e78ae83 *4e47664c9abc80e64e803944b05bc63df32970a54bd3f5f0c24506fb64275caf84cce529722eca *797ae59ca6216ad330043642f9565d107a63c7f445e363d8ca7a740f6625ec4930216725049a04 *b2215f438901accd27de143037eeb07ecc3cc704c944d2c487062b212327a36cb1091365983ed6 *b65d71d4745449eb4ad0188f96aa163815e8f236dc307a9ee349c3a4e8a1ab964fd5564b944b5b *bb4c92ecaab2d9dadadc7ec84eddb89d3339298269ee2d8ac6e6506afbc3921a9d609cc8c6862f *b2ec75e033d358aff033c43d3f503a8ea1b4b000c002a3a0ceadfdc03640546e9676a9c89ec46d *72cf60cdf168d1744a2211a5d128e156857d7701af122ba334ea837c2ba49b922227f4b89c7b62 *64dc6838b34d9ccab9e581b07543fdbb96dbe74ac5e0cdf1f65a7a2eadf3546bcf9e4b0b75ef6f *43f59667e96005b3f40eb0c2ed1c2b54378fc56cefe9a94e14aafc10de604f137ba37576cebeff *7ef87cd438a19cdc6f1ae2a0fc2d30d64837ba3dce6a6c97d2a64fdde8c2b1dfa24b6db11a807b *3b38e470e10380b602107ee1f5a152397dc7d8eab03d5e8b29d55adb204663740bc64d74db90e1 *bd4ddcabf3f07e7b9dab340661a736ba9daf637ed0d681cd71ec3c0f5fa09bb66f390a7680fc76 *075d73f006f09025f5926eb4cea6a066209dda58dbd0c1cb75a22776ac033ce98f1b5e80d6ddb8 *9478d0fc4e87fd2a6a29c46b39e7eba04cc5d7d43a342fc3d3112f697e8489e2373b41786efaee *1f646f525180c61f76d873a94e0e01de38ec624c1fdb3734f0f228f4b2ddfa3afb35b61b7275d3 *7be9bb711e0940e09b3c02a02761358e07211071bd9a10d0c3cb90e8b157cea95015478e396ef0 *8bb84b672e22f008a72ed652672e47e0d9bf078709f93378da0907f01e3d942be9a63754bababa *eaa4492aec60dc70c6c004fbb61d3a51c9ea351e77d8106b314d35c21327e98f84ac9183a7c3b4 *c71e6ee62b69e712e0f9630e4fe438c9e3b5dca5005c3d6532832a91392024ae4a9f95da5a4bdf *48641ef72293ee83ca6b9295d2697ec954c1be3552aa20a12491c4af3b95a8953e490c1adf7672 *ee49ffc16d26b2082c2ddbbc8eda593b273b8fbe91ad1aabb15890a5025b527472fcb1dce6804f *7b80d15d12c53b7388629dc151f2b3d09b1d17a5726e4c41f945a6dbda42d1b3031ba21d791489 *fe88e425af271d8bc574adafe66048aa4e03b423ac26c5dff5cb2081bb213ec91334afa5976823 *f01ef00468248246d0b5e372073409fe013489687afa5f60e77d2f91033d464c68d70a26d70d3f *42468cd79f88025c4f8470498649b215ab196b0c7c1dbe8ef01430799d57cb71ada2b1e59ebc0e *a1be0b12a894453437b79a59b779ed1b1dafe5dd60d612b25769eb1bb8bc182dc1ea7a7b7dd19d *42ef66bca43d5313976be0b1da8cd78b0c5cbd9ea31a42e2fc53e4e6b077033153f96a2a09cabd *918a3baccf88fef68de96f7f72fa1797c88a84b2c2ce57248a3906c0a5ddb3eb5d363663eb02a5 *872c37fe49f60de052536f2a1932e00774b32f717313d52b3dddd04eb8e1b066f4a4f3e080d7ef *3d79223948cfcd63a035f4f47fa7752c2ba2a2ea5d73a0a22c2ba549fb064dfe029072cd69182d *a737598af837adcbe55cb3ea92863b1952eea11d8166acd51b169a68734ca7f4186f093b684a6c *d1036006c4cc66f0f36539e67cadcce78cb15abe2030cb8e44573e867fbffefa70970dfdf07a52 *625427df827cc23a3c3e81bdf3946eceabb4b467c7bf78b69b847667192b3ba98f482bce9d114b *18b4d98549391a4f156785f7ce0415362b74e20e3b0ed81586d887817fee5dc3b058a4f2d9747a *02af3bbe85bdd4b55e842bfa3c0add89e76c0c86c7e2d4894e4b4cf60269f18268211d90549df5 *56e9f343092f99f07e70f5033b79ddf5dfec328334fd1c4852e1434b6fe0b66839fba8a14bdf0f *4beda7a1d5337cf540593dcad45967b306ae0b0dbe165b04f1b5b2f9eb059bcf9d732a78549de6 *cc647758e6328e93b8b39d6867a6111c25d292f6f372d37b8726ceaa2cfdf6ddebcced9c05248c *40e1754b1d0660a9f0f62bf46f96b71f16ae355600d1c8ac67aeefac23a7c373f8694447f07ed2 *539d679eecc9a53f74138e082ad4a93f1fdc0cd40b3ceca6a4afae95784e99564cecd40ef80f81 *9f5e43ca42377a7f678e9e6b47cbdad1f2ee395aea2812c9bbea9b5044b92b3aa590c15478ca7d *cb3e287900092d12b24db270db32089120b4653fbf142200499a4e2e6156b372b732c32a311071 *7531a8451a88a0752273b19d7100757830ee0646c1e68cb26d310dc89148bed6598723576a7593 *915f8dfd095d65ad6904d36f716759fe5e89f51a1933daadf75e1e8f9e1fcce155f3c579b8aa8c *3e83ae7371cd855cd70eaeb5836bede0fac538b856bbb746b57f6beddf5a904e37f76fc5610509 *2cbbb98a6c0777d8c59563b822f7d632609fa36bebd294cf125996d25e385b5ae45fa9922beb7d *b967edae2a7e6fe40f5b32940ab67398b33494b8431d5faa9fb5d7eb6d78bd0a8649a9846ac7d7 *daf195d3ae767c5dccf1556bc35989ff2bac4d310d56e6ff2a9b73eeaaefab657e5ad757abd259 *a7e8f6ca99675eb3ac5d5e6b97d70a392ce46e663b0401ea7867694ebfdadf552ab7e1ef0a9b65 *d7dae3a66e17bd2e808bf777e370eaac4fccf8c273fcddcd399d62854d381faeaf77898d3ce0b9 *251eb10bba43cee30a49d97416626dfce49ad029f2b76a2744e289e97bda7490abe48b72aea002 *e13f4bf7c334d1e5a7753d1493e3ef723bd436f795bb1c167dfc6e753d7da1de7a336d84e232e1 *3a1cfe8b0b87ff8c22d89731ecad2822bdb6b5ad80d17cb384ad4d309e3ad85cc0ab6d6e09ed6a *9b5b1d6cce1630b89dfdcff6eb60f33ad8bcb6bce5a5f2a3b983cd1377bd3accfcae85990b8bda *1d0f34bf0d83dda271cb18b3cc3446b7aa179632082e11972c4c82d5d1877528721d8a5c87222f *6117d4c4fe5af384fbd65643a6531b1e57c7f80667a82acc8cf42d73362c8ff215dcb78ef0ad23 *7cbfb608df198a47fa9ad65df0ae44f6aebc139f7f44afdc37f5f71991bcf2cb1aa9342b8a77f5 *f1bb5f74e42e89be6f678a3e61b5ae135dd462302bb5186475a28b3ad1459de8e2eb4b74015b41 *c4f7b6f25d701de8c6b92e8478c57d6b96bac1f4350029b03ea00d3d0b30f05a48c5086dd69627 *62ab6f334f05375ddc384785aecbbc731a9833bafb2ac93d41f5c4cf5c070226d002cd4703132f *36e7559939459e148b79d14e9340c8b19638fb297384c89aa181487934fae5993496c983b1e2a4 *2a393dae4eb172e3e9bb12427ee10957f2a4fa62d2aff033c9d22c2b5539553440e7cab2b2079b *24d8694d3de25322e01d4906bd334f3d37bae0d238999538dfa8cb72f28e8a5692942ba03b9147 *d29c49575e928e91bca44bbc7232fc6dff78b47ff8d3a7be10968e1caa6f3ccf74507618a80bff *1c56a82eb943b99d3c3bd63478fb73b5bdc77311d00ddd4524761907b42812400052984bdd2c65 *544bcf6366a25b943a80ee4df474d4cd97bba8b6d471a5e2b65c3c055b2b02d6efc4e2600a2bbf *fafa752cc9d1587703cbbf863fed1fb2bde1d168ffd9fe1e08b5ee3a7f303c1ce47e9e34f95b9d *075dbba9d9a37d4f54793a9b2cbaf63b9d4e2254d92fc3d7320ec547b3f1403a3f9deb1a7a2cfa *13d6b283d5fc0cbed9699875e158eff337750a03d7f22beadd39307cd69408d62c3d23a5aa47c7 *fd77154b504993a3cc50259f4d7dabf2d7ac897e6ebae7dfa1c4389169351af7ef0f9f3fbb7fbf *f18fbad4a52e75a94b5dea5297afa1fc1fecb06e6600d80400 newhex * rmfile ./source/network/apache/mkcert.tar.gz } From vmiklos at frugalware.org Mon Jun 4 00:45:51 2007 From: vmiklos at frugalware.org (VMiklos) Date: Mon Jun 4 00:46:03 2007 Subject: [Frugalware-darcs] frugalware-current: qtparted-0.4.5-6-i686 Message-ID: <20070603224551.F004C176813C@genesis.frugalware.org> Darcsweb-Url: http://darcs.frugalware.org/darcsweb/darcsweb.cgi?r=frugalware-current;a=darcs_commitdiff;h=20070603201634-e2957-66d7865bd752dadbe9a1cb1f838cd7412ae5214f.gz; [qtparted-0.4.5-6-i686 VMiklos **20070603201634 moved cvs_003.diff to ftp ] { hunk ./source/xapps-extra/qtparted/FrugalBuild 17 -source=(${source[@]} desktop.patch cvs_003.diff) +source=(${source[@]} http://ftp.frugalware.org/pub/other/sources/qtparted/qtparted-0.4.5-cvs_003.diff.bz2 \ + desktop.patch) hunk ./source/xapps-extra/qtparted/FrugalBuild 20 - 'c3a46dde93109b22af48c7d832a67ca0741e9a8a' \ - '14b31aac2d2845a382b93fac0cc3e5dff0e3a876') + '4df134390d78e89d8005198c710a8ce525021e8b' \ + 'c3a46dde93109b22af48c7d832a67ca0741e9a8a') hunk ./source/xapps-extra/qtparted/cvs_003.diff 1 -diff -Naur qtparted-0.4.5.orig/src/main.cpp qtparted-0.4.5/src/main.cpp ---- qtparted-0.4.5.orig/src/main.cpp 2005-07-06 23:29:54.000000000 +0200 -+++ qtparted-0.4.5/src/main.cpp 2005-10-15 12:58:31.000000000 +0200 -@@ -1,22 +1,22 @@ - /* -- qtparted - a frontend to libparted for manipulating disk partitions -- Copyright (C) 2002-2003 Vanni Brutto -+ qtparted - a frontend to libparted for manipulating disk partitions -+ Copyright (C) 2002-2003 Vanni Brutto - -- Vanni Brutto -+ Vanni Brutto - -- This program is free software; you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation; either version 2 of the License, or -- (at your option) any later version. -- -- This program is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- GNU General Public License for more details. -- -- You should have received a copy of the GNU General Public License -- along with this program; if not, write to the Free Software -- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 2 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program; if not, write to the Free Software -+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - /* About main.cpp -@@ -50,14 +50,14 @@ - - void print_usage(const char *program_name) { - cout << "Usage: " << program_name << " [OPTION]..." << endl -- << "A nice QT GUI for libparted" << endl << endl -- << "Options used by qtparted:" << endl -- << " -l, --log=value use 1 to enable log, 0 for disable it." << endl -- << " [default = 1])" << endl -- << " -h, --help Show this usage message" << endl -- << endl << endl -- << program_name << " by Zanac copyright 2003, (C) 2005 Ark Linux" << endl -- << "Send bug reports to bero@arklinux.org" << endl; -+ << "A nice QT GUI for libparted" << endl << endl -+ << "Options used by qtparted:" << endl -+ << " -l, --log=value use 1 to enable log, 0 for disable it." << endl -+ << " [default = 1])" << endl -+ << " -h, --help Show this usage message" << endl -+ << endl << endl -+ << program_name << " by Zanac copyright 2003, (C) 2005 Ark Linux" << endl -+ << "Send bug reports to bero@arklinux.org" << endl; - exit(EXIT_SUCCESS); - } - -@@ -69,108 +69,106 @@ - // from another QWS application (OPIE, Ark Linux installer, .....) - so we - // add a configure option to turn it off... - #if defined(Q_WS_QWS) && !defined(QWS_CLIENT) // Frame Buffer -- QApplication app(argc, argv, QApplication::GuiServer); -+ QApplication app(argc, argv, QApplication::GuiServer); - #else // X11 -- QApplication app(argc, argv); -+ QApplication app(argc, argv); - #endif // Q_WS_QWS - -- /*---program name ;)---*/ -- const char *program_name = argv[0]; -+ /*---program name ;)---*/ -+ const char *program_name = argv[0]; - -- int next_option; -+ int next_option; - -- /*---Flag log on/off, default 1 = on---*/ -- int iLog = 1; -+ /*---Flag log on/off, default 1 = on---*/ -+ int iLog = 1; - -- /*---valid short options---*/ -- const char *const short_options = "hl:"; -- -- /*---valid long options---*/ -- const struct option long_options[] = { -- { "help", 0, NULL, 'h' }, -- { "log", 1, NULL, 'l' }, -- { NULL, 0, NULL, 0 } // end of getopt array -- }; -- -- do { -- next_option = getopt_long(argc, -- argv, -- short_options, -- long_options, -- NULL); -- -- switch (next_option) { -- case 'h': // -h ... --help -- print_usage(program_name); -- break; -- -- case 'l': // -l ... --log -- if (!sscanf(optarg, "%d", &iLog)) { -- printf("You must specify a numeric value.\n" -- "Parameter \"%s\" is not valid for --log\n\n", optarg); -- print_usage(program_name); -- } -- -- if ((iLog != 0) && (iLog != 1)) { -- printf("You must use 1/0 to set log on/off.\n" -- "Parameter \"%s\" is not valid for --log\n\n", optarg); -- print_usage(program_name); -- } -- -- break; -- -- case '?': // opzione invalida :( -- print_usage(program_name); -- -- case -1: // opzioni concluse -- break; -- -- default: // errore! inaspettato pure! -- abort(); -- } -- } while (next_option != -1); -- -- /*---install translation file for application strings---*/ -- QTranslator *translator = new QTranslator(0); -- translator->load(QString(DATADIR "/locale/qtparted_") + QString(QTextCodec::locale())); -- app.installTranslator(translator); -- -- /*---initialize the debug system---*/ -- if (iLog) g_debug.open(); -- showDebug("QtParted debug logfile (http://qtparted.sf.net) version %s\n---------\n", VERSION); -- -- /*---check the Parted version---*/ -- if (!QP_LibParted::checkForParted()) -- return EXIT_FAILURE; -- -- /*---check if the kernel support devfs---*/ -- isDevfsEnabled(); -- -- QP_Settings settings; -- -- mainwindow = new QP_MainWindow(&settings, 0, "QP_MainWindow"); -- app.setMainWidget(mainwindow); -- -- QSplashScreen *splash=new QSplashScreen(QPixmap(DATADIR "/pics/qtp_splash.png"), Qt::WType_Modal | Qt::WStyle_Customize | Qt::WStyle_NoBorder | Qt::WDestructiveClose); -- splash->connect(mainwindow, SIGNAL(sigSplashInfo(const QString &)), -- SLOT(message(const QString &))); -- splash->finish(mainwindow); -- splash->show(); -+ /*---valid short options---*/ -+ const char *const short_options = "hl:"; -+ -+ /*---valid long options---*/ -+ const struct option long_options[] = { -+ { "help", 0, NULL, 'h' }, -+ { "log", 1, NULL, 'l' }, -+ { NULL, 0, NULL, 0 } // end of getopt array -+ }; -+ -+ do { -+ next_option = getopt_long(argc, -+ argv, -+ short_options, -+ long_options, -+ NULL); -+ -+ switch (next_option) { -+ case 'h': // -h ... --help -+ print_usage(program_name); -+ break; -+ -+ case 'l': // -l ... --log -+ if (!sscanf(optarg, "%d", &iLog)) { -+ printf("You must specify a numeric value.\n" -+ "Parameter \"%s\" is not valid for --log\n\n", optarg); -+ print_usage(program_name); -+ } -+ -+ if ((iLog != 0) && (iLog != 1)) { -+ printf("You must use 1/0 to set log on/off.\n" -+ "Parameter \"%s\" is not valid for --log\n\n", optarg); -+ print_usage(program_name); -+ } -+ break; -+ -+ case '?': // opzione invalida :( -+ print_usage(program_name); -+ -+ case -1: // opzioni concluse -+ break; -+ -+ default: // errore! inaspettato pure! -+ abort(); -+ } -+ } while (next_option != -1); -+ -+ /*---install translation file for application strings---*/ -+ QTranslator *translator = new QTranslator(0); -+ translator->load(QString(DATADIR "/locale/qtparted_") + QString(QTextCodec::locale())); -+ app.installTranslator(translator); -+ -+ /*---initialize the debug system---*/ -+ if (iLog) g_debug.open(); -+ showDebug("QtParted debug logfile (http://qtparted.sf.net) version %s\n---------\n", VERSION); -+ -+ /*---check the Parted version---*/ -+ if (!QP_LibParted::checkForParted()) -+ return EXIT_FAILURE; -+ -+ /*---check if the kernel support devfs---*/ -+ isDevfsEnabled(); -+ -+ QP_Settings settings; -+ -+ mainwindow = new QP_MainWindow(&settings, 0, "QP_MainWindow"); -+ app.setMainWidget(mainwindow); -+ -+ QSplashScreen *splash=new QSplashScreen(QPixmap(DATADIR "/pics/qtp_splash.png"), Qt::WType_Modal | Qt::WStyle_Customize | Qt::WStyle_NoBorder | Qt::WDestructiveClose); -+ splash->connect(mainwindow, SIGNAL(sigSplashInfo(const QString &)), -+ SLOT(message(const QString &))); -+ splash->finish(mainwindow); -+ splash->show(); - -- mainwindow->init(); -+ mainwindow->init(); - - #ifdef Q_WS_QWS // Frame Buffer -- mainwindow->showMaximized(); -+ mainwindow->showMaximized(); - #endif // Q_WS_QWS - -+ mainwindow->show(); - -- mainwindow->show(); -+ bool rc = app.exec(); - -- bool rc = app.exec(); -+ delete mainwindow; - -- delete mainwindow; -+ if (iLog) g_debug.close(); - -- if (iLog) g_debug.close(); -- -- return rc; -+ return rc; - } -diff -Naur qtparted-0.4.5.orig/src/qp_actlist.cpp qtparted-0.4.5/src/qp_actlist.cpp ---- qtparted-0.4.5.orig/src/qp_actlist.cpp 2004-04-17 12:14:15.000000000 +0200 -+++ qtparted-0.4.5/src/qp_actlist.cpp 2005-10-15 12:35:30.000000000 +0200 -@@ -28,775 +28,753 @@ - #include "statistics.h" - - /*---type (move+resize), num, start, end---*/ --QP_ActListItem::QP_ActListItem(QTParted::actType action, -- int num, -- PedSector start, -- PedSector end, -- PedGeometry geom, -- PedPartitionType part_type) { -- showDebug("%s", "actlistitem::actlistitem, move/resize\n"); -- -- _action = action; -- _num = num; -- _start = start; -- _end = end; -- _geom = geom; -- _part_type = part_type; -+QP_ActListItem::QP_ActListItem(QTParted::actType action, int num, -+ PedSector start, PedSector end, -+ PedGeometry geom, PedPartitionType part_type) -+ :_action(action),_num(num),_start(start), -+ _end(end),_geom(geom),_part_type(part_type) -+{ -+ showDebug("%s", "actlistitem::actlistitem, move/resize\n"); - } - - /*---type, num---*/ --QP_ActListItem::QP_ActListItem(QTParted::actType action, -- int num) { -- showDebug("%s", "actlistitem::actlistitem, rm\n"); -- -- _action = action; -- _num = num; -+QP_ActListItem::QP_ActListItem(QTParted::actType action, int num) -+ :_action(action),_num(num) -+{ -+ showDebug("%s", "actlistitem::actlistitem, rm\n"); - } - --QP_ActListItem::QP_ActListItem(QTParted::actType action, -- int num, -- bool status) { -- showDebug("%s", "actlistitem::actlistitem, active\n"); -- -- _action = action; -- _num = num; -- _status = status; -+QP_ActListItem::QP_ActListItem(QTParted::actType action, int num, bool status) -+ :_action(action),_num(num),_status(status) -+{ -+ showDebug("%s", "actlistitem::actlistitem, active\n"); - } - - /*---for format! :)---*/ - QP_ActListItem::QP_ActListItem(QTParted::actType action, -- int num, -- QP_FileSystemSpec *fsspec, -- QString label, -- PedGeometry geom, -- PedPartitionType part_type) { -- showDebug("%s", "actlistitem::actlistitem, mkfs\n"); -- -- _action = action; -- _num = num; -- _fsspec = fsspec; -- _label = label; -- _geom = geom; -- _part_type = part_type; -+ int num, -+ QP_FileSystemSpec *fsspec, -+ QString label, -+ PedGeometry geom, -+ PedPartitionType part_type) -+ :_action(action),_num(num),_fsspec(fsspec) -+ ,_label(label),_geom(geom),_part_type(part_type) -+{ -+ showDebug("%s", "actlistitem::actlistitem, mkfs\n"); - } - - /*---type, logical/extended, start, end, typoFS, label---*/ - QP_ActListItem::QP_ActListItem(QTParted::actType action, -- QTParted::partType type, -- PedSector start, -- PedSector end, -- QP_FileSystemSpec *fsspec, -- QString label, -- PedGeometry geom, -- PedPartitionType part_type) { -- showDebug("%s", "actlistitem::actlistitem, mkpartfs\n"); -- -- _action = action; -- _type = type; -- _start = start; -- _end = end; -- _fsspec = fsspec; -- _label = label; -- _geom = geom; -- _part_type = part_type; --} -- --QP_ActionList::QP_ActionList(QP_LibParted *libparted) { -- showDebug("%s", "actionlist::actionlist\n"); -- -- /*---prevent from memory leak: when list are cleared destroy actlistitem object!---*/ -- actlist.setAutoDelete(true); -- -- /*---prevent from memory leak: when list are cleared destroy partinfo object!---*/ -- orig_logilist.setAutoDelete(true); -- orig_partlist.setAutoDelete(true); -- -- -- PedDisk *disk; -- _libparted = libparted; -- -- /*---save of the original device state---*/ -- disk = ped_disk_new(_libparted->dev); -- if (!disk) { -- showDebug("%s", "actionlist::actionlist, ped_disk_new ko\n"); -- -- QString label = QString(tr("Critical error during ped_disk_new!")); -- QMessageBox::information(NULL, PROG_NAME, label); -- -- return ; -- } -- -- listdisk.append(disk); -- -- /*---make a backup of the disk (we will use this)---*/ -- _disk = ped_disk_duplicate(disk); -- if (!_disk) { -- showDebug("%s", "actionlist::actionlist, ped_disk_duplicate ko\n"); -- ped_disk_destroy(disk); -- listdisk.removeLast(); -- disk = NULL; -- -- QString label = QString(tr("Critical error during ped_disk_duplicate!")); -- QMessageBox::information(NULL, PROG_NAME, label); -+ QTParted::partType type, -+ PedSector start, -+ PedSector end, -+ QP_FileSystemSpec *fsspec, -+ QString label, -+ PedGeometry geom, -+ PedPartitionType part_type) -+ :_action(action), _type(type), _start(start) -+ ,_end(end), _fsspec(fsspec), _label(label) -+ ,_geom(geom), _part_type(part_type) -+{ -+ showDebug("%s", "actlistitem::actlistitem, mkpartfs\n"); -+} -+ -+QP_ActionList::QP_ActionList(QP_LibParted *libparted):_libparted(libparted) -+{ -+ showDebug("%s", "actionlist::actionlist\n"); -+ -+ /*---prevent from memory leak: when list are cleared destroy actlistitem object!---*/ -+ actlist.setAutoDelete(true); -+ -+ /*---prevent from memory leak: when list are cleared destroy partinfo object!---*/ -+ orig_logilist.setAutoDelete(true); -+ orig_partlist.setAutoDelete(true); -+ -+ -+ PedDisk *disk; -+ -+ /*---save of the original device state---*/ -+ disk = ped_disk_new(_libparted->dev); -+ if (!disk) { -+ showDebug("%s", "actionlist::actionlist, ped_disk_new ko\n"); -+ -+ QString label = QString(tr("Critical error during ped_disk_new!")); -+ QMessageBox::information(NULL, PROG_NAME, label); - -- return ; -- } -+ return ; -+ } -+ -+ listdisk.append(disk); -+ -+ /*---make a backup of the disk (we will use this)---*/ -+ _disk = ped_disk_duplicate(disk); -+ if (!_disk) { -+ showDebug("%s", "actionlist::actionlist, ped_disk_duplicate ko\n"); -+ ped_disk_destroy(disk); -+ listdisk.removeLast(); -+ disk = NULL; -+ -+ QString label = QString(tr("Critical error during ped_disk_duplicate!")); -+ QMessageBox::information(NULL, PROG_NAME, label); -+ -+ return ; -+ } - -- /*---make the partlist of the disk---*/ -- scan_partitions(); -+ /*---make the partlist of the disk---*/ -+ scan_partitions(); - } - - QP_ActionList::~QP_ActionList() { -- showDebug("%s", "actionlist::~actionlist\n"); -+ showDebug("%s", "actionlist::~actionlist\n"); - -- actlist.clear(); -- orig_logilist.clear(); -- orig_partlist.clear(); -- -+ actlist.clear(); -+ orig_logilist.clear(); -+ orig_partlist.clear(); -+ - } - - void QP_ActionList::update_listpartitions() { -- showDebug("%s", "actionlist::update_listpartitions\n"); -+ showDebug("%s", "actionlist::update_listpartitions\n"); - -- /*---initialize active partition---*/ -- _partActive = NULL; -+ /*---initialize active partition---*/ -+ _partActive = NULL; - -- logilist.clear(); -- partlist.clear(); -+ logilist.clear(); -+ partlist.clear(); - -- _libparted->has_extended = false; -+ _libparted->has_extended = false; - - -- /*---look if exist a partition in orig_list that match with the partitions into disk device---*/ -- PedConstraint* constraint = NULL; -+ /*---look if exist a partition in orig_list that match with the partitions into disk device---*/ -+ PedConstraint* constraint = NULL; - PedPartition* part = NULL; - for (part = ped_disk_next_partition(disk(), NULL); part; -- part = ped_disk_next_partition(disk(), part)) { -+ part = ped_disk_next_partition(disk(), part)) { - -- if (part->type & PED_PARTITION_METADATA) -- continue; -+ if (part->type & PED_PARTITION_METADATA) -+ continue; - -- QP_PartInfo *found = NULL; -- -- /*---if not freespace...*/ -- if (!(part->type & PED_PARTITION_FREESPACE)) { -- /*---loop for all partition of the disk---*/ -- QP_PartInfo *p; -- for (p = (QP_PartInfo*)orig_partlist.first(); p; p = (QP_PartInfo*)orig_partlist.next()) { -- if (p->type != QTParted::extended) { -- if ((p->_geometry.start == part->geom.start) -- && (p->_geometry.end == part->geom.end) -- && (p->_geometry.length == part->geom.length)) { -- found = p; -- } -- } else { -- QP_PartInfo *logi; -- /*---loop for every logical partitions---*/ -- for (logi = (QP_PartInfo*)orig_logilist.first(); logi; logi = (QP_PartInfo*)orig_logilist.next()) { -- if ((logi->_geometry.start == part->geom.start) -- && (logi->_geometry.end == part->geom.end) -- && (logi->_geometry.length == part->geom.length)) { -- found = logi; -- } -- } -- } -- } -- } -- -- showDebug("%s", "actionlist::update_listpartitions, looked if partition was in orig_logilist\n"); -- -- QP_PartInfo *partinfo; -- if (found) { -- showDebug("%s", "actionlist::update_listpartitions, partition matched!\n"); -- partinfo = new QP_PartInfo(); -- partinfo->start = found->start; -- partinfo->end = found->end; -- partinfo->_geometry = found->_geometry; -- partinfo->setDevice(found->device()); -- partinfo->min_size = found->min_size; -- partinfo->_label = found->_label; -- partinfo->_free = found->_free; -- partinfo->_unknow = found->_unknow; -- partinfo->_libparted = found->_libparted; -- partinfo->_active = found->_active; -- partinfo->_canBeActive = found->_canBeActive; -- partinfo->_canBeHidden = found->_canBeHidden; -- partinfo->_virtual = found->_virtual; -- partinfo->fsspec = found->fsspec; -- } else { -- showDebug("%s", "actionlist::update_listpartitions, partition missmatched!\n"); -- partinfo = new QP_PartInfo(); -- partinfo->start = part->geom.start; -- partinfo->end = part->geom.end; -- partinfo->_geometry = part->geom; -- partinfo->setDevice(_libparted->_qpdevice); -- partinfo->min_size = -1; -- partinfo->_label = QString::null; -- partinfo->_free = _libparted->filesystem->free(); -- partinfo->_unknow = _libparted->filesystem->unknow(); -- partinfo->_libparted = _libparted; -- partinfo->_active = false; -- partinfo->_canBeActive = false; -- partinfo->_canBeHidden = false; -- partinfo->_virtual = false; -- -- -- const char *part_filesystem = part->fs_type ? part->fs_type->name : ""; -- if (part->type & PED_PARTITION_FREESPACE) { -- partinfo->fsspec = _libparted->filesystem->free(); -- } else { -- partinfo->fsspec = _libparted->filesystem->nameToFSSpec(part_filesystem); //fat16, fat32 etc etc -- } -- } -- -- //'cause the number can change use ALWAYS the right PedPartition number! -- partinfo->num = part->num; -- -- if (part->type & PED_PARTITION_LOGICAL) -- partinfo->type = QTParted::logical; -- else if (part->type & PED_PARTITION_EXTENDED) { -- partinfo->type = QTParted::extended; -- _libparted->has_extended = true; -- } -- else partinfo->type = QTParted::primary; -- -- -- showDebug("%s", "actionlist::update_listpartitions, get partitions flags\n"); -- -- //---get how much the partition can grow at left and at right -- //---get also if the partiton is "active" -- //---of course do all this stuff only if this is not freespace ;) -- //FIXME: t_start/t_end if the partition is free? is right? -- if (!partinfo->isFree()) { -- constraint = ped_constraint_any(_libparted->dev); -- PedGeometry *geometry = ped_disk_get_max_partition_geometry(disk(), part, constraint); -- if (geometry != NULL) { -- partinfo->t_start = geometry->start; -- partinfo->t_end = geometry->end; -- } else { -- partinfo->t_start = -1; -- partinfo->t_end = -1; -- } -- -- /*---get if the partition is active---*/ -- partition_get_flags(partinfo, part); -- } -- -- showDebug("%s", "actionlist::update_listpartitions, get partition infos\n"); -- -- /*---compare if the partition has not committed... and if so update -- * some field (ie filesystem, and active flag, to reflect the change that -- * use made on listchart but that are not saved on the disk!---*/ -- get_partinfo(partinfo, part); -- -- /*---if this is a virtual partition do not show how space fill the device---*/ -- if (partinfo->isVirtual()) { -- partinfo->min_size = -1; -- } -- -- showDebug("%s", "actionlist::update_listpartitions, append the partition to partlist\n"); -- if (partinfo->type == QTParted::logical) -- logilist.append(partinfo); -- else partlist.append(partinfo); -+ QP_PartInfo *found = NULL; -+ -+ /*---if not freespace...*/ -+ if (!(part->type & PED_PARTITION_FREESPACE)) { -+ /*---loop for all partition of the disk---*/ -+ QP_PartInfo *p; -+ for (p = (QP_PartInfo*)orig_partlist.first(); p; p = (QP_PartInfo*)orig_partlist.next()) { -+ if (p->type != QTParted::extended) { -+ if ((p->_geometry.start == part->geom.start) -+ && (p->_geometry.end == part->geom.end) -+ && (p->_geometry.length == part->geom.length)) { -+ found = p; -+ } -+ } else { -+ QP_PartInfo *logi; -+ /*---loop for every logical partitions---*/ -+ for (logi = (QP_PartInfo*)orig_logilist.first(); logi; logi = (QP_PartInfo*)orig_logilist.next()) { -+ if ((logi->_geometry.start == part->geom.start) -+ && (logi->_geometry.end == part->geom.end) -+ && (logi->_geometry.length == part->geom.length)) { -+ found = logi; -+ } -+ } -+ } -+ } -+ } -+ -+ showDebug("%s", "actionlist::update_listpartitions, looked if partition was in orig_logilist\n"); -+ -+ QP_PartInfo *partinfo; -+ if (found) { -+ showDebug("%s", "actionlist::update_listpartitions, partition matched!\n"); -+ partinfo = new QP_PartInfo(); -+ partinfo->start = found->start; -+ partinfo->end = found->end; -+ partinfo->_geometry = found->_geometry; -+ partinfo->setDevice(found->device()); -+ partinfo->min_size = found->min_size; -+ partinfo->_label = found->_label; -+ partinfo->_free = found->_free; -+ partinfo->_unknow = found->_unknow; -+ partinfo->_libparted = found->_libparted; -+ partinfo->_active = found->_active; -+ partinfo->_canBeActive = found->_canBeActive; -+ partinfo->_canBeHidden = found->_canBeHidden; -+ partinfo->_virtual = found->_virtual; -+ partinfo->fsspec = found->fsspec; -+ } else { -+ showDebug("%s", "actionlist::update_listpartitions, partition missmatched!\n"); -+ partinfo = new QP_PartInfo(); -+ partinfo->start = part->geom.start; -+ partinfo->end = part->geom.end; -+ partinfo->_geometry = part->geom; -+ partinfo->setDevice(_libparted->_qpdevice); -+ partinfo->min_size = -1; -+ partinfo->_label = QString::null; -+ partinfo->_free = _libparted->filesystem->free(); -+ partinfo->_unknow = _libparted->filesystem->unknow(); -+ partinfo->_libparted = _libparted; -+ partinfo->_active = false; -+ partinfo->_canBeActive = false; -+ partinfo->_canBeHidden = false; -+ partinfo->_virtual = false; -+ -+ -+ const char *part_filesystem = part->fs_type ? part->fs_type->name : ""; -+ if (part->type & PED_PARTITION_FREESPACE) { -+ partinfo->fsspec = _libparted->filesystem->free(); -+ } else { -+ partinfo->fsspec = _libparted->filesystem->nameToFSSpec(part_filesystem); //fat16, fat32 etc etc -+ } -+ } -+ -+ //'cause the number can change use ALWAYS the right PedPartition number! -+ partinfo->num = part->num; -+ -+ if (part->type & PED_PARTITION_LOGICAL) -+ partinfo->type = QTParted::logical; -+ else if (part->type & PED_PARTITION_EXTENDED) { -+ partinfo->type = QTParted::extended; -+ _libparted->has_extended = true; -+ } -+ else partinfo->type = QTParted::primary; -+ -+ -+ showDebug("%s", "actionlist::update_listpartitions, get partitions flags\n"); -+ -+ //---get how much the partition can grow at left and at right -+ //---get also if the partiton is "active" -+ //---of course do all this stuff only if this is not freespace ;) -+ //FIXME: t_start/t_end if the partition is free? is right? -+ if (!partinfo->isFree()) { -+ constraint = ped_constraint_any(_libparted->dev); -+ PedGeometry *geometry = ped_disk_get_max_partition_geometry(disk(), part, constraint); -+ if (geometry != NULL) { -+ partinfo->t_start = geometry->start; -+ partinfo->t_end = geometry->end; -+ } else { -+ partinfo->t_start = -1; -+ partinfo->t_end = -1; -+ } -+ -+ /*---get if the partition is active---*/ -+ partition_get_flags(partinfo, part); -+ } -+ -+ showDebug("%s", "actionlist::update_listpartitions, get partition infos\n"); -+ -+ /*---compare if the partition has not committed... and if so update -+ * some field (ie filesystem, and active flag, to reflect the change that -+ * use made on listchart but that are not saved on the disk!---*/ -+ get_partinfo(partinfo, part); -+ -+ /*---if this is a virtual partition do not show how space fill the device---*/ -+ if (partinfo->isVirtual()) { -+ partinfo->min_size = -1; -+ } -+ -+ showDebug("%s", "actionlist::update_listpartitions, append the partition to partlist\n"); -+ if (partinfo->type == QTParted::logical) -+ logilist.append(partinfo); -+ else partlist.append(partinfo); - -- } -+ } - - } - - void QP_ActionList::scan_partitions() { -- showDebug("%s", "actionlist::scan_partitions\n"); -+ showDebug("%s", "actionlist::scan_partitions\n"); - -- /*---initialize active partition---*/ -- _partActive = NULL; -+ /*---initialize active partition---*/ -+ _partActive = NULL; - -- orig_logilist.clear(); -- orig_partlist.clear(); -+ orig_logilist.clear(); -+ orig_partlist.clear(); - -- PedConstraint *constraint = NULL; -+ PedConstraint *constraint = NULL; - PedPartition *part = NULL; - for (part = ped_disk_next_partition(disk(), NULL); part; -- part = ped_disk_next_partition(disk(), part)) { -+ part = ped_disk_next_partition(disk(), part)) { -+ -+ if (part->type & PED_PARTITION_METADATA) -+ continue; -+ -+ showDebug("%s", "actionlist::scan_partitions, create a new partinfo\n"); -+ QP_PartInfo *partinfo = new QP_PartInfo(); -+ partinfo->start = part->geom.start; -+ partinfo->end = part->geom.end; -+ partinfo->_geometry = part->geom; -+ partinfo->num = part->num; -+ partinfo->setDevice(_libparted->_qpdevice); -+ partinfo->min_size = -1; -+ partinfo->_label = QString::null; -+ partinfo->_free = _libparted->filesystem->free(); -+ partinfo->_unknow = _libparted->filesystem->unknow(); -+ partinfo->_libparted = _libparted; -+ partinfo->_active = false; -+ partinfo->_canBeActive = false; -+ partinfo->_canBeHidden = false; -+ partinfo->_virtual = false; -+ -+ if (part->type & PED_PARTITION_LOGICAL) -+ partinfo->type = QTParted::logical; -+ else if (part->type & PED_PARTITION_EXTENDED) { -+ partinfo->type = QTParted::extended; -+ } -+ else partinfo->type = QTParted::primary; -+ -+ const char *part_filesystem = part->fs_type ? part->fs_type->name : ""; -+ -+ if (part->type & PED_PARTITION_FREESPACE) { -+ partinfo->fsspec = _libparted->filesystem->free(); -+ partinfo->t_start = -1; -+ partinfo->t_end = -1; -+ } else { -+ showDebug("%s", "actionlist::scan_partitions, get partinfo flags\n"); -+ /*---get if the partition is active---*/ -+ partition_get_flags(partinfo, part); -+ -+ showDebug("%s", "actionlist::scan_partitions, get partinfo fsspec\n"); -+ partinfo->fsspec = _libparted->filesystem->nameToFSSpec(part_filesystem); //fat16, fat32 etc etc -+ -+ //---get how much the partition can grow at left and at right, but only if the partition is not free space! -+ constraint = ped_constraint_any(_libparted->dev); -+ PedGeometry *geometry = -+ ped_disk_get_max_partition_geometry(disk(), part, constraint); -+ if (geometry != NULL) { -+ partinfo->t_start = geometry->start; -+ partinfo->t_end = geometry->end; -+ } else { -+ partinfo->t_start = -1; -+ partinfo->t_end = -1; -+ } -+ } -+ -+ showDebug("%s", "actionlist::scan_partitions, append partinfo to orig_partlist\n"); -+ -+ if (partinfo->type == QTParted::logical) -+ orig_logilist.append(partinfo); -+ else orig_partlist.append(partinfo); -+ } -+ - -- if (part->type & PED_PARTITION_METADATA) -- continue; - -- showDebug("%s", "actionlist::scan_partitions, create a new partinfo\n"); -- QP_PartInfo *partinfo = new QP_PartInfo(); -- partinfo->start = part->geom.start; -- partinfo->end = part->geom.end; -- partinfo->_geometry = part->geom; -- partinfo->num = part->num; -- partinfo->setDevice(_libparted->_qpdevice); -- partinfo->min_size = -1; -- partinfo->_label = QString::null; -- partinfo->_free = _libparted->filesystem->free(); -- partinfo->_unknow = _libparted->filesystem->unknow(); -- partinfo->_libparted = _libparted; -- partinfo->_active = false; -- partinfo->_canBeActive = false; -- partinfo->_canBeHidden = false; -- partinfo->_virtual = false; -- -- if (part->type & PED_PARTITION_LOGICAL) -- partinfo->type = QTParted::logical; -- else if (part->type & PED_PARTITION_EXTENDED) { -- partinfo->type = QTParted::extended; -- } -- else partinfo->type = QTParted::primary; -- -- const char *part_filesystem = part->fs_type ? part->fs_type->name : ""; -- -- if (part->type & PED_PARTITION_FREESPACE) { -- partinfo->fsspec = _libparted->filesystem->free(); -- partinfo->t_start = -1; -- partinfo->t_end = -1; -- } else { -- showDebug("%s", "actionlist::scan_partitions, get partinfo flags\n"); -- /*---get if the partition is active---*/ -- partition_get_flags(partinfo, part); -- -- showDebug("%s", "actionlist::scan_partitions, get partinfo fsspec\n"); -- partinfo->fsspec = _libparted->filesystem->nameToFSSpec(part_filesystem); //fat16, fat32 etc etc -- -- //---get how much the partition can grow at left and at right, but only if the partition is not free space! -- constraint = ped_constraint_any(_libparted->dev); -- PedGeometry *geometry = -- ped_disk_get_max_partition_geometry(disk(), part, constraint); -- if (geometry != NULL) { -- partinfo->t_start = geometry->start; -- partinfo->t_end = geometry->end; -- } else { -- partinfo->t_start = -1; -- partinfo->t_end = -1; -- } -- } -- -- showDebug("%s", "actionlist::scan_partitions, append partinfo to orig_partlist\n"); -- -- if (partinfo->type == QTParted::logical) -- orig_logilist.append(partinfo); -- else orig_partlist.append(partinfo); -- } -- -- -- -- /*---count how partition are in the disk---*/ -- int totPart = orig_partlist.count() + orig_logilist.count(); -- -- showDebug("%s", "actionlist::scan_partitions, loop into orig_partlist\n"); -- -- /*---loop for all partition of the disk---*/ -- QP_PartInfo *p; -- int i = 0; -- for (p = (QP_PartInfo*)orig_partlist.first(); p; p = (QP_PartInfo*)orig_partlist.next()) { -- if (p->type != QTParted::extended) { -- i++; -- if (!p->isFree()) { -- /*---emit a signal for update the progressbar---*/ -- _libparted->_message = QString(tr("Getting info about partition %1.")) -- .arg(p->partname()); -- _libparted->emitSigTimer(i*100/totPart, _libparted->message(), QString::null); -- -- /*---get info about this primary partition---*/ -- part = ped_disk_get_partition(disk(), p->num); -- if (part) get_partfilesystem_info(part, p); -- else showDebug("%s", "actionlist::scan_partitions, get_partfilesystem_info ko\n"); -- -- /*---get the label of this primary partition---*/ -- if (part) get_partfilesystem_label(part, p); -- else showDebug("%s", "actionlist::scan_partitions, get_partfilesystem_label ko\n"); -- } -- } else { -- QP_PartInfo *logi; -- /*---loop for every logical partitions---*/ -- for (logi = (QP_PartInfo*)orig_logilist.first(); logi; logi = (QP_PartInfo*)orig_logilist.next()) { -- i++; -- if (!logi->isFree()) { -- /*---emit a signal for update the progressbar---*/ -- _libparted->_message = QString(tr("Getting info about partition %1.")) -- .arg(logi->partname()); -- _libparted->emitSigTimer(i*100/totPart, _libparted->message(), QString::null); -- -- /*---get info about this logical partition---*/ -- part = ped_disk_get_partition(disk(), logi->num); -- if (part) get_partfilesystem_info(part, logi); -- else showDebug("%s", "actionlist::scan_partitions, get_partfilesystem_info ko\n"); -- -- /*---get the label of this logical partition---*/ -- if (part) get_partfilesystem_label(part, logi); -- else showDebug("%s", "actionlist::scan_partitions, get_partfilesystem_label ko\n"); -- } -- } -- } -- } -- -- _libparted->emitSigTimer(100, _libparted->message(), QString::null); -+ /*---count how partition are in the disk---*/ -+ int totPart = orig_partlist.count() + orig_logilist.count(); -+ -+ showDebug("%s", "actionlist::scan_partitions, loop into orig_partlist\n"); -+ -+ /*---loop for all partition of the disk---*/ -+ QP_PartInfo *p; -+ int i = 0; -+ for (p = (QP_PartInfo*)orig_partlist.first(); p; p = (QP_PartInfo*)orig_partlist.next()) { -+ if (p->type != QTParted::extended) { -+ i++; -+ if (!p->isFree()) { -+ /*---emit a signal for update the progressbar---*/ -+ _libparted->_message = QString(tr("Getting info about partition %1.")) -+ .arg(p->partname()); -+ _libparted->emitSigTimer(i*100/totPart, _libparted->message(), QString::null); -+ -+ /*---get info about this primary partition---*/ -+ part = ped_disk_get_partition(disk(), p->num); -+ if (part) get_partfilesystem_info(part, p); -+ else showDebug("%s", "actionlist::scan_partitions, get_partfilesystem_info ko\n"); -+ -+ /*---get the label of this primary partition---*/ -+ if (part) get_partfilesystem_label(part, p); -+ else showDebug("%s", "actionlist::scan_partitions, get_partfilesystem_label ko\n"); -+ } -+ } else { -+ QP_PartInfo *logi; -+ /*---loop for every logical partitions---*/ -+ for (logi = (QP_PartInfo*)orig_logilist.first(); logi; logi = (QP_PartInfo*)orig_logilist.next()) { -+ i++; -+ if (!logi->isFree()) { -+ /*---emit a signal for update the progressbar---*/ -+ _libparted->_message = QString(tr("Getting info about partition %1.")) -+ .arg(logi->partname()); -+ _libparted->emitSigTimer(i*100/totPart, _libparted->message(), QString::null); -+ -+ /*---get info about this logical partition---*/ -+ part = ped_disk_get_partition(disk(), logi->num); -+ if (part) get_partfilesystem_info(part, logi); -+ else showDebug("%s", "actionlist::scan_partitions, get_partfilesystem_info ko\n"); -+ -+ /*---get the label of this logical partition---*/ -+ if (part) get_partfilesystem_label(part, logi); -+ else showDebug("%s", "actionlist::scan_partitions, get_partfilesystem_label ko\n"); -+ } -+ } -+ } -+ } -+ -+ _libparted->emitSigTimer(100, _libparted->message(), QString::null); - } - - bool QP_ActionList::get_partfilesystem_info(PedPartition *part, QP_PartInfo *partinfo) { -- showDebug("%s", "actionlist::get_partfilesystem_info\n"); -+ showDebug("%s", "actionlist::get_partfilesystem_info\n"); -+ -+ /*---if the partition is virtual (ie change not committed) we cannot determinate -+ * how much the filesystem is fill---*/ -+ if (partinfo->_virtual) { -+ partinfo->min_size = -1; -+ return true; -+ } - -- /*---if the partition is virtual (ie change not committed) we cannot determinate -- * how much the filesystem is fill---*/ -- if (partinfo->_virtual) { -- partinfo->min_size = -1; -- return true; -- } -- -- /*---is the filesystem supported by parted?---*/ -- PedFileSystem *fs = ped_file_system_open(&part->geom); -- if (!fs) { -- /*---exist a wrapper for min_size?---*/ -- if (partinfo->fswrap() && partinfo->fsspec->fswrap()->wrap_min_size) { -- /*---get the min_size from the wrapper---*/ -- partinfo->min_size = partinfo->fsspec->fswrap()->min_size(partinfo->partname()); -- if (partinfo->min_size > (partinfo->end-partinfo->start)) partinfo->min_size=partinfo->end-partinfo->start; -- } -- else -- /*---get the min_size from space_stats (that is a "df" wrapper)---*/ -- partinfo->min_size = space_stats(partinfo); -- -- return true; -- } -- -- /*---get the minimum filesystem size---*/ -- PedConstraint *resize_constraint = ped_file_system_get_resize_constraint(fs); -- if (resize_constraint) { -- partinfo->min_size = resize_constraint->min_size; -- ped_constraint_destroy (resize_constraint); -- } -+ /*---is the filesystem supported by parted?---*/ -+ PedFileSystem *fs = ped_file_system_open(&part->geom); -+ if (!fs) { -+ /*---exist a wrapper for min_size?---*/ -+ if (partinfo->fswrap() && partinfo->fsspec->fswrap()->wrap_min_size) { -+ /*---get the min_size from the wrapper---*/ -+ partinfo->min_size = partinfo->fsspec->fswrap()->min_size(partinfo->partname()); -+ if (partinfo->min_size > (partinfo->end-partinfo->start)) partinfo->min_size=partinfo->end-partinfo->start; -+ } -+ else -+ /*---get the min_size from space_stats (that is a "df" wrapper)---*/ -+ partinfo->min_size = space_stats(partinfo); - -- ped_file_system_close(fs); -+ return true; -+ } -+ -+ /*---get the minimum filesystem size---*/ -+ PedConstraint *resize_constraint = ped_file_system_get_resize_constraint(fs); -+ if (resize_constraint) { -+ partinfo->min_size = resize_constraint->min_size; -+ ped_constraint_destroy (resize_constraint); -+ } - -- return true; -+ ped_file_system_close(fs); -+ -+ return true; - } - - bool QP_ActionList::get_partfilesystem_label(PedPartition *part, QP_PartInfo *partinfo) { -- if (partinfo->_virtual) -- return true; -+ if (partinfo->_virtual) -+ return true; - -- partinfo->_label = QP_FSWrap::get_label(part, partinfo->fsspec->name()); -+ partinfo->_label = QP_FSWrap::get_label(part, partinfo->fsspec->name()); - -- return true; -+ return true; - } - - void QP_ActionList::ins_resize(int num, -- PedSector start, -- PedSector end, -- PedGeometry geom, -- PedPartitionType part_type) { -- showDebug("%s", "actionlist::ins_resize\n"); -- -- QP_ActListItem *actlistitem = new QP_ActListItem(QTParted::resize, num, start, end, -- geom, part_type); -- actlist.append(actlistitem); -+ PedSector start, -+ PedSector end, -+ PedGeometry geom, -+ PedPartitionType part_type) { -+ showDebug("%s", "actionlist::ins_resize\n"); -+ -+ QP_ActListItem *actlistitem = new QP_ActListItem(QTParted::resize, num, start, end, -+ geom, part_type); -+ actlist.append(actlistitem); - -- ins_newdisk(); -+ ins_newdisk(); - } - - void QP_ActionList::ins_move(int num, -- PedSector start, -- PedSector end, -- PedGeometry geom, -- PedPartitionType part_type) { -- showDebug("%s", "actionlist::ins_move\n"); -- -- QP_ActListItem *actlistitem = new QP_ActListItem(QTParted::move, num, start, end, -- geom, part_type); -- actlist.append(actlistitem); -+ PedSector start, -+ PedSector end, -+ PedGeometry geom, -+ PedPartitionType part_type) { -+ showDebug("%s", "actionlist::ins_move\n"); -+ -+ QP_ActListItem *actlistitem = new QP_ActListItem(QTParted::move, num, start, end, -+ geom, part_type); -+ actlist.append(actlistitem); - -- ins_newdisk(); -+ ins_newdisk(); - } - - void QP_ActionList::ins_rm(int num) { -- showDebug("%s", "actionlist::ins_rm\n"); -+ showDebug("%s", "actionlist::ins_rm\n"); - -- QP_ActListItem *actlistitem = new QP_ActListItem(QTParted::rm, num); -- actlist.append(actlistitem); -+ QP_ActListItem *actlistitem = new QP_ActListItem(QTParted::rm, num); -+ actlist.append(actlistitem); - -- ins_newdisk(); -+ ins_newdisk(); - } - - void QP_ActionList::ins_mkfs(QP_FileSystemSpec *fsspec, int num, QString label, PedGeometry geom, PedPartitionType part_type) { -- showDebug("%s", "actionlist::ins_mkfs\n"); -+ showDebug("%s", "actionlist::ins_mkfs\n"); - -- QP_ActListItem *actlistitem = new QP_ActListItem(QTParted::format, num, fsspec, label, geom, part_type); -- actlist.append(actlistitem); -+ QP_ActListItem *actlistitem = new QP_ActListItem(QTParted::format, num, fsspec, label, geom, part_type); -+ actlist.append(actlistitem); - -- ins_newdisk(); -+ ins_newdisk(); - } - - void QP_ActionList::ins_mkpart(QTParted::partType type, -- PedSector start, -- PedSector end, -- QP_FileSystemSpec *fsspec, -- QString label, -- PedGeometry geom, -- PedPartitionType part_type) { -- showDebug("%s", "actionlist::ins_mkpart\n"); -- -- QP_ActListItem *actlistitem = new QP_ActListItem(QTParted::create, type, -- start, end, fsspec, label, geom, part_type); -- actlist.append(actlistitem); -+ PedSector start, -+ PedSector end, -+ QP_FileSystemSpec *fsspec, -+ QString label, -+ PedGeometry geom, -+ PedPartitionType part_type) { -+ showDebug("%s", "actionlist::ins_mkpart\n"); -+ -+ QP_ActListItem *actlistitem = new QP_ActListItem(QTParted::create, type, -+ start, end, fsspec, label, geom, part_type); -+ actlist.append(actlistitem); - -- ins_newdisk(); -+ ins_newdisk(); - } - - void QP_ActionList::ins_active(int num, bool active) { -- showDebug("%s", "actionlist::ins_active\n"); -- -- QP_ActListItem *actlistitem = new QP_ActListItem(QTParted::active, num, active); -- actlist.append(actlistitem); -+ showDebug("%s", "actionlist::ins_active\n"); -+ -+ QP_ActListItem *actlistitem = new QP_ActListItem(QTParted::active, num, active); -+ actlist.append(actlistitem); - -- ins_newdisk(); -+ ins_newdisk(); - } - - void QP_ActionList::ins_hidden(int num, bool hidden) { -- showDebug("%s", "actionlist::ins_hidden\n"); -- -- QP_ActListItem *actlistitem = new QP_ActListItem(QTParted::hidden, num, hidden); -- actlist.append(actlistitem); -+ showDebug("%s", "actionlist::ins_hidden\n"); -+ -+ QP_ActListItem *actlistitem = new QP_ActListItem(QTParted::hidden, num, hidden); -+ actlist.append(actlistitem); - -- ins_newdisk(); -+ ins_newdisk(); - } - - void QP_ActionList::get_partinfo(QP_PartInfo *partinfo, PedPartition *part) { -- showDebug("%s", "actionlist::get_partinfo\n"); -+ showDebug("%s", "actionlist::get_partinfo\n"); - -- /*---loop for every action saved---*/ -- QP_ActListItem *pl; -- for (pl = (QP_ActListItem *)actlist.first(); pl; pl = (QP_ActListItem *)actlist.next()) { -- /*---if you saved a mkpart (Create) and the geometry match... man: we have a virtual!---*/ -- if ((pl->_action == QTParted::create) -- || (pl->_action == QTParted::resize) -- || (pl->_action == QTParted::move) -- || (pl->_action == QTParted::format)) { -- if ((part->geom.start == pl->_geom.start) -- && (part->geom.end == pl->_geom.end) -- && (part->geom.length == pl->_geom.length) -- && (part->type == pl->_part_type)) { -- partinfo->_virtual = true; -- -- if (pl->_action == QTParted::create) partinfo->fsspec = pl->_fsspec; -- if (pl->_action == QTParted::format) partinfo->fsspec = pl->_fsspec; -- } -- } -- } -+ /*---loop for every action saved---*/ -+ QP_ActListItem *pl; -+ for (pl = (QP_ActListItem *)actlist.first(); pl; pl = (QP_ActListItem *)actlist.next()) { -+ /*---if you saved a mkpart (Create) and the geometry match... man: we have a virtual!---*/ -+ if ((pl->_action == QTParted::create) -+ || (pl->_action == QTParted::resize) -+ || (pl->_action == QTParted::move) -+ || (pl->_action == QTParted::format)) { -+ if ((part->geom.start == pl->_geom.start) -+ && (part->geom.end == pl->_geom.end) -+ && (part->geom.length == pl->_geom.length) -+ && (part->type == pl->_part_type)) { -+ partinfo->_virtual = true; -+ -+ if (pl->_action == QTParted::create) partinfo->fsspec = pl->_fsspec; -+ if (pl->_action == QTParted::format) partinfo->fsspec = pl->_fsspec; -+ } -+ } -+ } - } - - bool QP_ActionList::canUndo() { -- return (listdisk.first() != listdisk.last()); -+ return (listdisk.first() != listdisk.last()); - } - - void QP_ActionList::undo() { -- showDebug("%s", "actionlist::undo\n"); -+ showDebug("%s", "actionlist::undo\n"); - -- /*---destroy the state of the disk in this moment---*/ -- ped_disk_destroy(_disk); -+ /*---destroy the state of the disk in this moment---*/ -+ ped_disk_destroy(_disk); - -- /*---undo last operation---*/ -- PedDisk *disk = (PedDisk *)listdisk.last(); -- ped_disk_destroy(disk); -- listdisk.removeLast(); -+ /*---undo last operation---*/ -+ PedDisk *disk = (PedDisk *)listdisk.last(); -+ ped_disk_destroy(disk); -+ listdisk.removeLast(); - -- /*---restore last state---*/ -- _disk = ped_disk_duplicate((PedDisk *)listdisk.last()); //FIXME: if !_disk :( -- if (!_disk) showDebug("%s", "actionlist::undo, ped_disk_duplicate ko\n"); -+ /*---restore last state---*/ -+ _disk = ped_disk_duplicate((PedDisk *)listdisk.last()); //FIXME: if !_disk :( -+ if (!_disk) showDebug("%s", "actionlist::undo, ped_disk_duplicate ko\n"); - -- /*---remove last operation---*/ -- actlist.removeLast(); -+ /*---remove last operation---*/ -+ actlist.removeLast(); - -- /*---the state of the disk... is of course changed---*/ -- emit sigDiskChanged(); -+ /*---the state of the disk... is of course changed---*/ -+ emit sigDiskChanged(); - } - - void QP_ActionList::commit() { -- showDebug("%s", "actionlist::commit\n"); -+ showDebug("%s", "actionlist::commit\n"); -+ -+ //messageState, used to keep "error message" returned by libparted -+ QString messageState = QString::null; -+ -+ /*---undo all disk state---*/ -+ while (listdisk.first() != listdisk.last()) { -+ PedDisk *disk = (PedDisk *)listdisk.last(); -+ ped_disk_destroy(disk); -+ listdisk.removeLast(); -+ } -+ _disk = ped_disk_duplicate((PedDisk *)listdisk.first()); -+ if (!_disk) showDebug("%s", "actionlist::commit, ped_disk_duplicate ko\n"); -+ -+ /*---commit the operations in "batch" mode---*/ -+ _libparted->setWrite(true); -+ -+ bool rc = true; -+ -+ //counter of how much operations are done! -+ int i = 0; -+ int iTotAct = actlist.count() + 1; -+ -+ QP_ActListItem *pl; -+ for (pl = (QP_ActListItem *)actlist.first(); pl; pl = (QP_ActListItem *)actlist.next()) { -+ showDebug("%s", "actionlist::commit, loop for commit\n"); -+ -+ //---mkpart commit--- -+ if (pl->_action == QTParted::create) { -+ showDebug("%s", "actionlist::commit, want to commit a create\n"); -+ emit sigOperations(tr("Creating partition."), messageState, i++, iTotAct); -+ if (!_libparted->mkpartfs(pl->_type, pl->_fsspec, pl->_start, pl->_end, pl->_label)) { -+ messageState = _libparted->message(); -+ rc = false; -+ } -+ } -+ //---rm commit--- -+ else if (pl->_action == QTParted::rm) { -+ showDebug("%s", "actionlist::commit, want to commit a rm\n"); -+ emit sigOperations(tr("Preparation for removing a partition."), messageState, i++, iTotAct); -+ scan_partitions(); -+ _libparted->scan_orig_partitions(); -+ -+ emit sigOperations(tr("Removing a partition."), messageState, i, iTotAct); -+ if (!_libparted->rm(pl->_num)) { -+ messageState = _libparted->message(); -+ rc = false; -+ } -+ } -+ //---resize commit--- -+ else if (pl->_action == QTParted::resize) { -+ showDebug("%s", "actionlist::commit, want to commit a resize\n"); -+ emit sigOperations(tr("Preparation for resizing a partition."), messageState, i++, iTotAct); -+ scan_partitions(); -+ _libparted->scan_orig_partitions(); -+ -+ emit sigOperations(tr("Resizing a partition."), messageState, i, iTotAct); -+ if (!_libparted->resize(pl->_num, pl->_start, pl->_end)) { -+ messageState = _libparted->message(); -+ rc = false; -+ } -+ } -+ //---move commit--- -+ else if (pl->_action == QTParted::move) { -+ showDebug("%s", "actionlist::commit, want to commit a move\n"); -+ emit sigOperations(tr("Preparation for moving a partition."), messageState, i++, iTotAct); -+ scan_partitions(); -+ _libparted->scan_orig_partitions(); -+ -+ emit sigOperations(tr("Moving a partition."), messageState, i, iTotAct); -+ if (!_libparted->move(pl->_num, pl->_start, pl->_end)) { -+ messageState = _libparted->message(); -+ rc = false; -+ } -+ } -+ //---active commit--- -+ else if (pl->_action == QTParted::active) { -+ showDebug("%s", "actionlist::commit, want to commit an active\n"); -+ emit sigOperations(tr("Preparation for activating a partition."), messageState, i++, iTotAct); -+ scan_partitions(); -+ _libparted->scan_orig_partitions(); -+ -+ emit sigOperations(tr("Activating a partition."), messageState, i, iTotAct); -+ if (!_libparted->partition_set_flag_active(pl->_num, pl->_status)) { -+ messageState = _libparted->message(); -+ rc = false; -+ } -+ } -+ //---active commit--- -+ else if (pl->_action == QTParted::hidden) { -+ showDebug("%s", "actionlist::commit, want to commit an hidden\n"); -+ emit sigOperations(tr("Preparation for hiding a partition."), messageState, i++, iTotAct); -+ scan_partitions(); -+ _libparted->scan_orig_partitions(); -+ -+ emit sigOperations(tr("Hiding a partition."), messageState, i, iTotAct); -+ if (!_libparted->partition_set_flag_hidden(pl->_num, pl->_status)) { -+ messageState = _libparted->message(); -+ rc = false; -+ } -+ } -+ //---active commit--- -+ else if (pl->_action == QTParted::format) { -+ showDebug("%s", "actionlist::commit, want to commit a format\n"); -+ emit sigOperations(tr("Preparation for formatting a partition."), messageState, i++, iTotAct); -+ scan_partitions(); -+ _libparted->scan_orig_partitions(); -+ -+ emit sigOperations(tr("Formatting a partition."), messageState, i, iTotAct); -+ if (!_libparted->mkfs(pl->_num, pl->_fsspec, pl->_label)) { -+ messageState = _libparted->message(); -+ rc = false; -+ } -+ } -+ -+ /*---just update GUI---*/ -+ qApp->processEvents(); -+ -+ if (rc == false) { -+ break; -+ } -+ } -+ -+ actlist.clear(); -+ -+ /*---return in test mode---*/ -+ _libparted->setWrite(false); -+ -+ /*---remove the disk used---*/ -+ ped_disk_destroy(_disk); -+ -+ /*---remove also the original disk---*/ -+ ped_disk_destroy((PedDisk *)listdisk.first()); -+ listdisk.clear(); - -- //messageState, used to keep "error message" returned by libparted -- QString messageState = QString::null; -- -- /*---undo all disk state---*/ -- while (listdisk.first() != listdisk.last()) { -- PedDisk *disk = (PedDisk *)listdisk.last(); -- ped_disk_destroy(disk); -- listdisk.removeLast(); -- } -- _disk = ped_disk_duplicate((PedDisk *)listdisk.first()); -- if (!_disk) showDebug("%s", "actionlist::commit, ped_disk_duplicate ko\n"); -- -- /*---commit the operations in "batch" mode---*/ -- _libparted->setWrite(true); -- -- bool rc = true; -- -- //counter of how much operations are done! -- int i = 0; -- int iTotAct = actlist.count() + 1; -- -- QP_ActListItem *pl; -- for (pl = (QP_ActListItem *)actlist.first(); pl; pl = (QP_ActListItem *)actlist.next()) { -- showDebug("%s", "actionlist::commit, loop for commit\n"); -- -- //---mkpart commit--- -- if (pl->_action == QTParted::create) { -- showDebug("%s", "actionlist::commit, want to commit a create\n"); -- emit sigOperations(tr("Creating partition."), messageState, i++, iTotAct); -- if (!_libparted->mkpartfs(pl->_type, pl->_fsspec, pl->_start, pl->_end, pl->_label)) { -- messageState = _libparted->message(); -- rc = false; -- } -- } -- //---rm commit--- -- else if (pl->_action == QTParted::rm) { -- showDebug("%s", "actionlist::commit, want to commit a rm\n"); -- emit sigOperations(tr("Preparation for removing a partition."), messageState, i++, iTotAct); -- scan_partitions(); -- _libparted->scan_orig_partitions(); -- -- emit sigOperations(tr("Removing a partition."), messageState, i, iTotAct); -- if (!_libparted->rm(pl->_num)) { -- messageState = _libparted->message(); -- rc = false; -- } -- } -- //---resize commit--- -- else if (pl->_action == QTParted::resize) { -- showDebug("%s", "actionlist::commit, want to commit a resize\n"); -- emit sigOperations(tr("Preparation for resizing a partition."), messageState, i++, iTotAct); -- scan_partitions(); -- _libparted->scan_orig_partitions(); -- -- emit sigOperations(tr("Resizing a partition."), messageState, i, iTotAct); -- if (!_libparted->resize(pl->_num, pl->_start, pl->_end)) { -- messageState = _libparted->message(); -- rc = false; -- } -- } -- //---move commit--- -- else if (pl->_action == QTParted::move) { -- showDebug("%s", "actionlist::commit, want to commit a move\n"); -- emit sigOperations(tr("Preparation for moving a partition."), messageState, i++, iTotAct); -- scan_partitions(); -- _libparted->scan_orig_partitions(); -- -- emit sigOperations(tr("Moving a partition."), messageState, i, iTotAct); -- if (!_libparted->move(pl->_num, pl->_start, pl->_end)) { -- messageState = _libparted->message(); -- rc = false; -- } -- } -- //---active commit--- -- else if (pl->_action == QTParted::active) { -- showDebug("%s", "actionlist::commit, want to commit an active\n"); -- emit sigOperations(tr("Preparation for activating a partition."), messageState, i++, iTotAct); -- scan_partitions(); -- _libparted->scan_orig_partitions(); -- -- emit sigOperations(tr("Activating a partition."), messageState, i, iTotAct); -- if (!_libparted->partition_set_flag_active(pl->_num, pl->_status)) { -- messageState = _libparted->message(); -- rc = false; -- } -- } -- //---active commit--- -- else if (pl->_action == QTParted::hidden) { -- showDebug("%s", "actionlist::commit, want to commit an hidden\n"); -- emit sigOperations(tr("Preparation for hiding a partition."), messageState, i++, iTotAct); -- scan_partitions(); -- _libparted->scan_orig_partitions(); -- -- emit sigOperations(tr("Hiding a partition."), messageState, i, iTotAct); -- if (!_libparted->partition_set_flag_hidden(pl->_num, pl->_status)) { -- messageState = _libparted->message(); -- rc = false; -- } -- } -- //---active commit--- -- else if (pl->_action == QTParted::format) { -- showDebug("%s", "actionlist::commit, want to commit a format\n"); -- emit sigOperations(tr("Preparation for formatting a partition."), messageState, i++, iTotAct); -- scan_partitions(); -- _libparted->scan_orig_partitions(); -- -- emit sigOperations(tr("Formatting a partition."), messageState, i, iTotAct); -- if (!_libparted->mkfs(pl->_num, pl->_fsspec, pl->_label)) { -- messageState = _libparted->message(); -- rc = false; -- } -- } -- -- /*---just update GUI---*/ -- qApp->processEvents(); -- -- if (rc == false) { -- break; -- } -- } -- -- actlist.clear(); -- -- /*---return in test mode---*/ -- _libparted->setWrite(false); -- -- /*---remove the disk used---*/ -- ped_disk_destroy(_disk); -- -- /*---remove also the original disk---*/ -- ped_disk_destroy((PedDisk *)listdisk.first()); -- listdisk.clear(); -- -- /*---prepare the list and the _disk---*/ -- PedDisk *disk = ped_disk_new(_libparted->dev); //FIXME !disk -- if (!disk) showDebug("%s", "actionlist::commit, ped_disk_new ko\n"); -- -- listdisk.append(disk); -- _disk = ped_disk_duplicate(disk); //FIXME !_disk -- if (!_disk) showDebug("%s", "actionlist::commit, ped_disk_duplicate ko\n"); -- -- emit sigOperations(tr("Rescan of the disk."), messageState, i, iTotAct); -- -- showDebug("%s", "actionlist::commit, call scan_partitions\n"); -+ /*---prepare the list and the _disk---*/ -+ PedDisk *disk = ped_disk_new(_libparted->dev); //FIXME !disk -+ if (!disk) showDebug("%s", "actionlist::commit, ped_disk_new ko\n"); -+ -+ listdisk.append(disk); -+ _disk = ped_disk_duplicate(disk); //FIXME !_disk -+ if (!_disk) showDebug("%s", "actionlist::commit, ped_disk_duplicate ko\n"); - -- /*---make a new scan of the partitions---*/ -- scan_partitions(); -+ emit sigOperations(tr("Rescan of the disk."), messageState, i, iTotAct); -+ -+ showDebug("%s", "actionlist::commit, call scan_partitions\n"); - -- emit sigOperations(tr("All operations completed."), messageState, iTotAct, iTotAct); -+ /*---make a new scan of the partitions---*/ -+ scan_partitions(); - -- /*---the state of the disk... is of course changed---*/ -- emit sigDiskChanged(); -+ emit sigOperations(tr("All operations completed."), messageState, iTotAct, iTotAct); -+ -+ /*---the state of the disk... is of course changed---*/ -+ emit sigDiskChanged(); - } - - PedDisk * QP_ActionList::disk() { -- return _disk; -+ return _disk; - } - - QP_PartInfo * QP_ActionList::partActive() { -- return _partActive; -+ return _partActive; - } - - /*---this will get if the partition has active flag (ie is bootable)---*/ - void QP_ActionList::partition_get_flags(QP_PartInfo *partinfo, PedPartition *part) { -- if (ped_partition_is_flag_available(part, PED_PARTITION_BOOT)) { -- partinfo->_canBeActive = true; -- bool active = bool(ped_partition_get_flag(part, PED_PARTITION_BOOT)); -- partinfo->_active = active; -- if (active) _partActive = partinfo; -- } -- -- if (ped_partition_is_flag_available(part, PED_PARTITION_HIDDEN)) { -- partinfo->_canBeHidden = true; -- bool hidden = bool(ped_partition_get_flag(part, PED_PARTITION_HIDDEN)); -- partinfo->_hidden = hidden; -- } -+ if (ped_partition_is_flag_available(part, PED_PARTITION_BOOT)) { -+ partinfo->_canBeActive = true; -+ bool active = bool(ped_partition_get_flag(part, PED_PARTITION_BOOT)); -+ partinfo->_active = active; -+ if (active) _partActive = partinfo; -+ } -+ -+ if (ped_partition_is_flag_available(part, PED_PARTITION_HIDDEN)) { -+ partinfo->_canBeHidden = true; -+ bool hidden = bool(ped_partition_get_flag(part, PED_PARTITION_HIDDEN)); -+ partinfo->_hidden = hidden; -+ } - } - - void QP_ActionList::ins_newdisk() { -- showDebug("%s", "actionlist::ins_newdisk\n"); -+ showDebug("%s", "actionlist::ins_newdisk\n"); - -- listdisk.append(_disk); -- _disk = ped_disk_duplicate(_disk); //FIXME !_disk -- if (!_disk) showDebug("%s", "actionlist::ins_newdisk, ped_disk_duplicate ko\n"); -+ listdisk.append(_disk); -+ _disk = ped_disk_duplicate(_disk); //FIXME !_disk -+ if (!_disk) showDebug("%s", "actionlist::ins_newdisk, ped_disk_duplicate ko\n"); - -- emit sigDiskChanged(); -+ emit sigDiskChanged(); - } -diff -Naur qtparted-0.4.5.orig/src/qp_actlist.h qtparted-0.4.5/src/qp_actlist.h ---- qtparted-0.4.5.orig/src/qp_actlist.h 2004-04-12 16:09:07.000000000 +0200 -+++ qtparted-0.4.5/src/qp_actlist.h 2005-10-15 12:35:30.000000000 +0200 -@@ -1,22 +1,22 @@ - /* -- qtparted - a frontend to libparted for manipulating disk partitions -- Copyright (C) 2002-2003 Vanni Brutto -+ qtparted - a frontend to libparted for manipulating disk partitions -+ Copyright (C) 2002-2003 Vanni Brutto - -- Vanni Brutto -+ Vanni Brutto - -- This program is free software; you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation; either version 2 of the License, or -- (at your option) any later version. -- -- This program is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- GNU General Public License for more details. -- -- You should have received a copy of the GNU General Public License -- along with this program; if not, write to the Free Software -- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 2 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program; if not, write to the Free Software -+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - /* About QP_ActList class -@@ -36,89 +36,87 @@ - - /* move, -> num, start, end - * resize, -> num, start, end -- * rm, -> num -+ * rm, -> num - * create -> start, end, tipo_estesa_logica, fsspec, label - * */ - class QP_ActListItem { - public: -- /*---type (move+resize), num, start, end, geometry, parttype---*/ -- QP_ActListItem(QTParted::actType, int, PedSector, PedSector, PedGeometry, PedPartitionType); -+ /*---type (move+resize), num, start, end, geometry, parttype---*/ -+ QP_ActListItem(QTParted::actType, int, PedSector, PedSector, PedGeometry, PedPartitionType); - -- /*---type, num (rm)---*/ -- QP_ActListItem(QTParted::actType, int); -+ /*---type, num (rm)---*/ -+ QP_ActListItem(QTParted::actType, int); - -- /*---type (format), num, fsspec, label, geometry, parttype---*/ -- QP_ActListItem(QTParted::actType, int, QP_FileSystemSpec *, QString, PedGeometry, PedPartitionType); -+ /*---type (format), num, fsspec, label, geometry, parttype---*/ -+ QP_ActListItem(QTParted::actType, int, QP_FileSystemSpec *, QString, PedGeometry, PedPartitionType); - -- /*---type, num, active---*/ -- QP_ActListItem(QTParted::actType, int, bool); -- -- /*---type, logical/extended, start, end, typoFS, label, geometry, parttype---*/ -- QP_ActListItem(QTParted::actType, -- QTParted::partType, -- PedSector, PedSector, -- QP_FileSystemSpec *, -- QString, -- PedGeometry, -- PedPartitionType); -+ /*---type, num, active---*/ -+ QP_ActListItem(QTParted::actType, int, bool); -+ -+ /*---type, logical/extended, start, end, typoFS, label, geometry, parttype---*/ -+ QP_ActListItem(QTParted::actType, -+ QTParted::partType, -+ PedSector, PedSector, -+ QP_FileSystemSpec *, -+ QString, -+ PedGeometry, -+ PedPartitionType); - - //private: -- QTParted::actType _action; -- PedSector _start; -- PedSector _end; -- int _num; -- QTParted::partType _type; -- QP_FileSystemSpec *_fsspec; -- QString _label; -- PedGeometry _geom; -- PedPartitionType _part_type; -- bool _status; //used for boot and hidden flags -+ QTParted::actType _action; -+ PedSector _start; -+ PedSector _end; -+ int _num; -+ QTParted::partType _type; -+ QP_FileSystemSpec *_fsspec; -+ QString _label; -+ PedGeometry _geom; -+ PedPartitionType _part_type; -+ bool _status; //used for boot and hidden flags - }; - - - class QP_ActionList : public QObject { --friend class QP_LibParted; --friend class QP_PartInfo; --Q_OBJECT -+ friend class QP_LibParted; -+ friend class QP_PartInfo; -+ Q_OBJECT - public: -- QP_ActionList(QP_LibParted *); -- ~QP_ActionList(); -- void update_listpartitions(); -- void scan_partitions(); //scan for every partition -- bool get_partfilesystem_info(PedPartition *, QP_PartInfo *); -- bool get_partfilesystem_label(PedPartition *part, QP_PartInfo *partinfo); -- void ins_resize(int, PedSector, PedSector, PedGeometry, PedPartitionType); -- void ins_move(int, PedSector, PedSector, PedGeometry, PedPartitionType); -- void ins_rm(int); -- void ins_mkfs(QP_FileSystemSpec *, int, QString, PedGeometry, PedPartitionType); -- void ins_mkpart(QTParted::partType, PedSector, PedSector, QP_FileSystemSpec *, QString, PedGeometry, PedPartitionType); -- void ins_active(int, bool); -- void ins_hidden(int, bool); -- void get_partinfo(QP_PartInfo *, PedPartition *); -- bool canUndo(); //Does the user can undo/commit? -- void undo(); //undo last operation -- void commit(); //commit all operations -- PedDisk *disk(); //return the actual state of the disk -- QP_PartInfo *partActive(); //return the partinfo that is bootable -- QPtrList partlist; -- QPtrList logilist; -+ QP_ActionList(QP_LibParted *); -+ ~QP_ActionList(); -+ void update_listpartitions(); -+ void scan_partitions(); //scan for every partition -+ bool get_partfilesystem_info(PedPartition *, QP_PartInfo *); -+ bool get_partfilesystem_label(PedPartition *part, QP_PartInfo *partinfo); -+ void ins_resize(int, PedSector, PedSector, PedGeometry, PedPartitionType); -+ void ins_move(int, PedSector, PedSector, PedGeometry, PedPartitionType); -+ void ins_rm(int); -+ void ins_mkfs(QP_FileSystemSpec *, int, QString, PedGeometry, PedPartitionType); -+ void ins_mkpart(QTParted::partType, PedSector, PedSector, QP_FileSystemSpec *, QString, PedGeometry, PedPartitionType); -+ void ins_active(int, bool); -+ void ins_hidden(int, bool); -+ void get_partinfo(QP_PartInfo *, PedPartition *); -+ bool canUndo(); //Does the user can undo/commit? -+ void undo(); //undo last operation -+ void commit(); //commit all operations -+ PedDisk *disk(); //return the actual state of the disk -+ QP_PartInfo *partActive(); //return the partinfo that is bootable -+ QPtrList partlist; -+ QPtrList logilist; - - private: -- void partition_get_flags(QP_PartInfo *, PedPartition *); //will get the active flag -- void ins_newdisk(); -- QPtrList actlist; -- QPtrList listdisk; -- PedDisk *_disk; -- QP_LibParted *_libparted; -- QP_PartInfo *_partActive; //a pointer to the partinfo that is current active (ie bootable) -- QPtrList orig_partlist; -- QPtrList orig_logilist; -+ void partition_get_flags(QP_PartInfo *, PedPartition *); //will get the active flag -+ void ins_newdisk(); -+ QPtrList actlist; -+ QPtrList listdisk; -+ PedDisk *_disk; -+ QP_LibParted *_libparted; -+ QP_PartInfo *_partActive; //a pointer to the partinfo that is current active (ie bootable) -+ QPtrList orig_partlist; -+ QPtrList orig_logilist; - - signals: -- /*---emitted when the state of the disk was changed---*/ -- void sigDiskChanged(); -- void sigOperations(QString, QString, int, int); -+ /*---emitted when the state of the disk was changed---*/ -+ void sigDiskChanged(); -+ void sigOperations(QString, QString, int, int); - }; -- -- - #endif -diff -Naur qtparted-0.4.5.orig/src/qp_combospin.cpp qtparted-0.4.5/src/qp_combospin.cpp ---- qtparted-0.4.5.orig/src/qp_combospin.cpp 2003-08-27 18:13:18.000000000 +0200 -+++ qtparted-0.4.5/src/qp_combospin.cpp 2005-10-15 13:13:01.000000000 +0200 -@@ -24,50 +24,51 @@ - #include "qp_options.h" - - QP_ComboSpin::QP_ComboSpin(QWidget *parent, const char *name) -- :QWidget(parent, name) { -- layout = new QHBoxLayout(this); //, "layout"); -- -- spinbox = new QP_SpinBox(this, "spinbox"); -- spinbox->setSizePolicy(QSizePolicy((QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, spinbox->sizePolicy().hasHeightForWidth())); -- -- layout->addWidget(spinbox); -- connect(spinbox, SIGNAL(valueChanged(PedSector)), -- this, SIGNAL(valueChanged(PedSector))); -- -- combobox = new QComboBox(false, this, "combobox"); -- combobox->setSizePolicy(QSizePolicy( (QSizePolicy::SizeType)1, (QSizePolicy::SizeType)0, 0, 0, combobox->sizePolicy().hasHeightForWidth())); -- connect(combobox, SIGNAL(activated(int)), -- spinbox, SLOT(setFormat(int))); -- layout->addWidget(combobox); -- -- combobox->clear(); -- combobox->insertItem("MB"); -- combobox->insertItem("GB"); -+ :QWidget(parent, name) -+{ -+ layout = new QHBoxLayout(this); //, "layout"); -+ -+ spinbox = new QP_SpinBox(this, "spinbox"); -+ spinbox->setSizePolicy(QSizePolicy((QSizePolicy::SizeType)7, (QSizePolicy::SizeType)0, 0, 0, spinbox->sizePolicy().hasHeightForWidth())); -+ -+ layout->addWidget(spinbox); -+ connect(spinbox, SIGNAL(valueChanged(PedSector)), -+ this, SIGNAL(valueChanged(PedSector))); -+ -+ combobox = new QComboBox(false, this, "combobox"); -+ combobox->setSizePolicy(QSizePolicy( (QSizePolicy::SizeType)1, (QSizePolicy::SizeType)0, 0, 0, combobox->sizePolicy().hasHeightForWidth())); -+ connect(combobox, SIGNAL(activated(int)), -+ spinbox, SLOT(setFormat(int))); -+ layout->addWidget(combobox); -+ -+ combobox->clear(); -+ combobox->insertItem("MB"); -+ combobox->insertItem("GB"); - } - - QP_ComboSpin::~QP_ComboSpin() { - } - - void QP_ComboSpin::setRange(PedSector min, PedSector max) { -- spinbox->setRange(min, max); -+ spinbox->setRange(min, max); - } - - void QP_ComboSpin::setValue(PedSector val) { -- spinbox->setValue(val); -+ spinbox->setValue(val); - } - - void QP_ComboSpin::setMaxValue(PedSector max) { -- spinbox->setMaxValue(max); -+ spinbox->setMaxValue(max); - } - - void QP_ComboSpin::setMinValue(PedSector min) { -- spinbox->setMinValue(min); -+ spinbox->setMinValue(min); - } - - PedSector QP_ComboSpin::value() { -- return spinbox->pedValue(); -+ return spinbox->pedValue(); - } - - PedSector QP_ComboSpin::maxValue() { -- return spinbox->pedMaxValue(); -+ return spinbox->pedMaxValue(); - } -diff -Naur qtparted-0.4.5.orig/src/qp_combospin.h qtparted-0.4.5/src/qp_combospin.h ---- qtparted-0.4.5.orig/src/qp_combospin.h 2003-08-27 18:13:19.000000000 +0200 -+++ qtparted-0.4.5/src/qp_combospin.h 2005-10-15 13:13:01.000000000 +0200 -@@ -33,24 +33,23 @@ - #define QP_COMBOSPIN_H - - class QP_ComboSpin : public QWidget { --Q_OBJECT -+ Q_OBJECT - public: -- QP_ComboSpin(QWidget *parent = 0L, const char *name = 0L); -- ~QP_ComboSpin(); -- void setRange(PedSector, PedSector); -- void setMaxValue(PedSector); -- void setMinValue(PedSector); -- void setValue(PedSector); -- PedSector value(); -- PedSector maxValue(); -+ QP_ComboSpin(QWidget *parent = 0L, const char *name = 0L); -+ ~QP_ComboSpin(); -+ void setRange(PedSector, PedSector); -+ void setMaxValue(PedSector); -+ void setMinValue(PedSector); -+ void setValue(PedSector); -+ PedSector value(); -+ PedSector maxValue(); - - signals: -- void valueChanged(PedSector); -+ void valueChanged(PedSector); - - protected: -- QHBoxLayout *layout; -- QComboBox *combobox; -- QP_SpinBox *spinbox; -+ QHBoxLayout *layout; -+ QComboBox *combobox; -+ QP_SpinBox *spinbox; - }; -- - #endif -diff -Naur qtparted-0.4.5.orig/src/qp_fswrap.cpp qtparted-0.4.5/src/qp_fswrap.cpp ---- qtparted-0.4.5.orig/src/qp_fswrap.cpp 2005-07-06 23:29:54.000000000 +0200 -+++ qtparted-0.4.5/src/qp_fswrap.cpp 2006-04-05 01:45:50.000000000 +0200 -@@ -1,10 +1,9 @@ - /* - qtparted - a frontend to libparted for manipulating disk partitions - Copyright (C) 2002-2003 Vanni Brutto -- - Vanni Brutto - -- Copyright (C) 2005 Bernhard Rosenkraenzer -+ Copyright (C) 2005-2006 Bernhard Rosenkraenzer - bero (-at-) arklinux dot org - - This program is free software; you can redistribute it and/or modify -@@ -43,1108 +42,1161 @@ - - #define my_min(a,b) ((a)<(b) ? (a):(b)) - --bool QP_FSWrap::fs_open(QString cmdline) { -+bool QP_FSWrap::fs_open(QString cmdline, bool localized) -+{ -+ -+ /*---this force stderr to stdout and a parsable language---*/ -+ QString dupcmdline = QString("%1 %2") -+ .arg(cmdline) -+ .arg(QString("2>&1")); -+ -+ if (!localized) -+ dupcmdline = "LC_ALL=POSIX " + dupcmdline; -+ -+ /*---open a pipe from the command line---*/ -+ fp = popen(dupcmdline, "r"); -+ -+ if (fp) -+ return true; -+ else -+ return false; -+} -+ -+char *QP_FSWrap::fs_getline() -+{ -+ bool rc = fgets(line, sizeof line, fp); -+ -+ if (rc) -+ return line; -+ else -+ return NULL; -+} -+ -+int QP_FSWrap::fs_close() -+{ -+ return fclose(fp); -+} -+ -+QP_FSWrap *QP_FSWrap::fswrap(QString name) -+{ -+ QP_FSWrap *fswrap; -+ -+ if (name.compare("ntfs") == 0) -+ fswrap = new QP_FSNtfs(); -+ else if (name.compare("jfs") == 0) -+ fswrap = new QP_FSJfs(); -+ else if (name.compare("ext3") == 0) -+ fswrap = new QP_FSExt3(); -+ else if (name.compare("xfs") == 0) -+ fswrap = new QP_FSXfs(); -+ else -+ fswrap = 0; - -- /*---this force stderr to stdout---*/ -- QString dupcmdline = QString("%1 %2") -- .arg(cmdline) -- .arg(QString("2>&1")); -- -- /*---open a pipe from the command line---*/ -- fp = popen(dupcmdline, "r"); -- -- if (fp) -- return true; -- else -- return false; --} -- --char * QP_FSWrap::fs_getline() { -- bool rc = fgets(line, sizeof line, fp); -- -- if (rc) return line; -- else return NULL; --} -- --int QP_FSWrap::fs_close() { -- return fclose(fp); --} -- --QP_FSWrap * QP_FSWrap::fswrap(QString name) { -- if (name.compare("ntfs") == 0) { -- QP_FSWrap *fswrap = new QP_FSNtfs(); -- return fswrap; -- } else -- if (name.compare("jfs") == 0) { -- QP_FSWrap *fswrap = new QP_FSJfs(); -- return fswrap; -- } else -- if (name.compare("ext3") == 0) { -- QP_FSWrap *fswrap = new QP_FSExt3(); -- return fswrap; -- } else -- if (name.compare("xfs") == 0) { -- QP_FSWrap *fswrap = new QP_FSXfs(); -- return fswrap; -- } -- else -- return NULL; --} -- --QString QP_FSWrap::get_label(PedPartition *part, QString name) { -- if (name.compare("ntfs") == 0) { -- return QP_FSNtfs::_get_label(part); -- } else -- if (name.compare("jfs") == 0) { -- return QP_FSJfs::_get_label(part); -- } else -- if (name.compare("ext3") == 0) { -- return QP_FSExt3::_get_label(part); -- } else -- if (name.compare("xfs") == 0) { -- return QP_FSXfs::_get_label(part); -- } -- if (name.compare("fat16") == 0) { -- return QP_FSFat16::_get_label(part); -- } -- if (name.compare("fat32") == 0) { -- return QP_FSFat32::_get_label(part); -- } -- if (name.compare("ext2") == 0) { -- return QP_FSExt2::_get_label(part); -- } -- if (name.compare("reiserfs") == 0) { -- return QP_FSReiserFS::_get_label(part); -- } -- else -- return QString::null; --} -- --bool QP_FSWrap::read_sector(PedPartition *part, PedSector offset, PedSector count, char *buffer) { -- /*---open a new device, read a sector and close it---*/ -- if (!ped_device_open(part->geom.dev)) -- return false; -- -- if (!ped_geometry_read(&part->geom, buffer, offset, count)) { -- ped_device_close (part->geom.dev); -- return false; -- } -- -- if (!ped_device_close(part->geom.dev)) -- return false; -- -- return true; --} -- --bool QP_FSWrap::qpMount(QString device) { -- char szcmdline[200]; -- bool error = false; -- -- /*---just to be sure! :)---*/ -- qpUMount(device); -- -- /*---mount the partition---*/ -- sprintf(szcmdline, "%s %s", device.latin1(), TMP_MOUNTPOINT); -- QString cmdline = QString("%1 %2") -- .arg(lstExternalTools->getPath(MOUNT)) -- .arg(szcmdline); -- -- if (!fs_open(cmdline)) { -- _message = QString(NOTFOUND); -- return false; -- } -- -- char *cline; -- while ((cline = fs_getline())) { -- QString line = QString(cline); -- -- QRegExp rx; -- rx = QRegExp("^mount: (.*)$"); -- if (rx.search(line) == 0) { -- QString capError = rx.cap(1); -- _message = capError; -- error = true; -- } -- } -- fs_close(); -- -- return !error; --} -- --bool QP_FSWrap::qpUMount(QString device) { -- int ret = umount(device.latin1()); -- if(ret) { -- _message = QString(strerror(errno)); -- return false; -- } -- return true; -+ return fswrap; -+} -+ -+QString QP_FSWrap::get_label(PedPartition * part, QString name) -+{ -+ if (name.compare("ntfs") == 0) -+ return QP_FSNtfs::_get_label(part); -+ else if (name.compare("jfs") == 0) -+ return QP_FSJfs::_get_label(part); -+ else if (name.compare("ext3") == 0) -+ return QP_FSExt3::_get_label(part); -+ else if (name.compare("xfs") == 0) -+ return QP_FSXfs::_get_label(part); -+ else if (name.compare("fat16") == 0) -+ return QP_FSFat16::_get_label(part); -+ else if (name.compare("fat32") == 0) -+ return QP_FSFat32::_get_label(part); -+ else if (name.compare("ext2") == 0) -+ return QP_FSExt2::_get_label(part); -+ else if (name.compare("reiserfs") == 0) -+ return QP_FSReiserFS::_get_label(part); -+ else -+ return QString::null; -+} -+ -+bool QP_FSWrap::read_sector(PedPartition * part, PedSector offset, -+ PedSector count, char *buffer) -+{ -+ /*---open a new device, read a sector and close it---*/ -+ if (!ped_device_open(part->geom.dev)) -+ return false; -+ -+ if (!ped_geometry_read(&part->geom, buffer, offset, count)) { -+ ped_device_close(part->geom.dev); -+ return false; -+ } -+ -+ if (!ped_device_close(part->geom.dev)) -+ return false; -+ -+ return true; -+} -+ -+bool QP_FSWrap::qpMount(QString device) -+{ -+ bool error = false; -+ -+ /*---just to be sure! :)---*/ -+ qpUMount(device); -+ -+ /*---mount the partition---*/ -+ QString cmdline = lstExternalTools->getPath(MOUNT) + " " + device + " " + TMP_MOUNTPOINT; -+ -+ if (!fs_open(cmdline, true)) { -+ _message = QString(NOTFOUND); -+ return false; -+ } -+ -+ char *cline; -+ while ((cline = fs_getline())) { -+ QString line = QString(cline); -+ -+ QRegExp rx = QRegExp("^mount: (.*)$"); -+ if (rx.search(line) == 0) { -+ QString capError = rx.cap(1); -+ _message = capError; -+ error = true; -+ } -+ } -+ fs_close(); -+ -+ return !error; -+} -+ -+bool QP_FSWrap::qpUMount(QString device) -+{ -+ int ret = umount(device.latin1()); -+ if (ret) { -+ _message = QString(strerror(errno)); -+ return false; -+ } -+ return true; - } - - - - /*---NTFS WRAPPER-----------------------------------------------------------------*/ --QP_FSNtfs::QP_FSNtfs() { -- wrap_resize = false; -- wrap_move = false; -- wrap_copy = false; -- wrap_create = false; -- wrap_min_size = false; -- -- /*---check if the wrapper is installed---*/ -- QString cmdline = QString("which %1") -- .arg(lstExternalTools->getPath(MKNTFS)); -- fs_open(cmdline); -- char *cline; -- while ((cline = fs_getline())) -- wrap_create = true; -- fs_close(); -- -- /*---check if the wrapper is installed---*/ -- cmdline = QString("which %1") -- .arg(lstExternalTools->getPath(NTFSRESIZE)); -- fs_open(cmdline); -- -- -- while ((cline = fs_getline())) { -- wrap_resize = RS_SHRINK | RS_ENLARGE; -- wrap_min_size = true; -- } -- fs_close(); --} -- --bool QP_FSNtfs::resize(QP_LibParted *_libparted, bool write, QP_PartInfo *partinfo, PedSector new_start, PedSector new_end) { -- /*---pointer to libparted---*/ -- QP_LibParted *libparted = _libparted; -- -+QP_FSNtfs::QP_FSNtfs() -+{ -+ wrap_resize = false; -+ wrap_move = false; -+ wrap_copy = false; -+ wrap_create = false; -+ wrap_min_size = false; -+ -+ /*---check if the wrapper is installed---*/ -+ QString cmdline = "which " + lstExternalTools->getPath(MKNTFS); -+ fs_open(cmdline); -+ char *cline; -+ while ((cline = fs_getline())) -+ wrap_create = true; -+ fs_close(); -+ -+ /*---check if the wrapper is installed---*/ -+ cmdline = "which " + lstExternalTools->getPath(NTFSRESIZE); -+ fs_open(cmdline); -+ -+ -+ while ((cline = fs_getline())) { -+ wrap_resize = RS_SHRINK | RS_ENLARGE; -+ wrap_min_size = true; -+ } -+ fs_close(); -+} -+ -+bool QP_FSNtfs::resize(QP_LibParted * _libparted, bool write, -+ QP_PartInfo * partinfo, PedSector new_start, -+ PedSector new_end) -+{ -+ /*---pointer to libparted---*/ -+ QP_LibParted *libparted = _libparted; -+ - showDebug("%s", "Resizing a filesystem using a wrapper\n"); - -- /*---the user want to shrink or enlarge the partition?---*/ -- /*---the user want to shrink!---*/ -- if (new_end < partinfo->end) { -- /*---update the filesystem---*/ -- showDebug("%s", "shrinking filesystem...\n"); -- if (!ntfsresize(write, partinfo->partname(), new_end - new_start - 4*MEGABYTE_SECTORS)) { -- showDebug("%s", "shrinking filesystem ko\n"); -- return false; -- } -- -- /*---and now update geometry of the partition---*/ -- showDebug("%s", "update geometry...\n"); -- if (!libparted->set_geometry(partinfo, new_start, new_end)) { -- showDebug("%s", "update geometry ko\n"); -- _message = libparted->message(); -- return false; -- } else { -- /*---if you are NOT committing then add in the undo/commit list---*/ -- if (!write) { -- showDebug("%s", "operation added to undo/commit list\n"); -- PedPartitionType parttype = libparted->type2parttype(partinfo->type); -- PedGeometry geom = libparted->get_geometry(partinfo); -- libparted->actlist->ins_resize(partinfo->num, new_start, new_end, geom, parttype); -- } -- return true; -- } -- /*---the user want to enlarge!---*/ -- } else { -- /*---cannot enlarge if we cannot change disk geometry!---*/ -- if (partinfo->device()->isBusy()) { -- showDebug("%s", "the device is busy, so you cannot enlarge it\n"); -- _message = tr("Cannot enlarge a partition if the disk device is busy"); -- return false; -- } -- -- /*---first se the geometry of the partition---*/ -- showDebug("%s", "update geometry...\n"); -- if (!libparted->set_geometry(partinfo, new_start, new_end)) { -- showDebug("%s", "update geometry ko\n"); -- _message = libparted->message(); -- return false; -- } else { -- /*---if you are NOT committing then add in the undo/commit list---*/ -- if (!write) { -- showDebug("%s", "operation added to undo/commit list\n"); -- PedPartitionType parttype = libparted->type2parttype(partinfo->type); -- PedGeometry geom = libparted->get_geometry(partinfo); -- libparted->actlist->ins_resize(partinfo->num, new_start, new_end, geom, parttype); -- } -- } -- -- if (write) { -- /*---and now update the filesystem!---*/ -- showDebug("%s", "enlarge filesystem...\n"); -- if (!ntfsresize(write, partinfo->partname(), new_end - new_start - 4*MEGABYTE_SECTORS)) { -- showDebug("%s", "enlarge filesystem ko\n"); -- return false; -- } else { -- return true; -- } -- } else { -- return true; -- } -- } --} -- --bool QP_FSNtfs::ntfsresize(bool write, QString dev, PedSector newsize) { -- char szcmdline[200]; -- -- /*---init of the error message---*/ -- _message = QString::null; -- -- /*---calculate size of the partition in bytes---*/ -- PedSector size = (PedSector)((newsize-1)*512); -- -- /*---read-only test---*/ -- sprintf(szcmdline, "-n -ff -s %lld %s", size, dev.latin1()); -- QString cmdline = QString("%1 %2") -- .arg(lstExternalTools->getPath(NTFSRESIZE)) -- .arg(szcmdline); -- -- if (!fs_open(cmdline)) { -- _message = QString(NOTFOUND); -- return false; -- } -- -- bool error = false; -- char *cline; -- while ((cline = fs_getline())) { -- QString line = QString(cline); -- -- QRegExp rx; -- -- if (!error) { -- rx = QRegExp("^ERROR.*: (.*)"); -- if (rx.search(line) == 0) { -- QString captured = rx.cap(1); -- _message = QString(captured); -- error = true; -- } -- } -- -- if (!error) { -- rx = QRegExp("^The volume end is fragmented.*"); -- if (rx.search(line) == 0) { -- _message = QString("The partition is fragmented."); -- error = true; -- } -- } -+ /*---the user want to shrink or enlarge the partition?---*/ -+ /*---the user want to shrink!---*/ -+ if (new_end < partinfo->end) { -+ /*---update the filesystem---*/ -+ showDebug("%s", "shrinking filesystem...\n"); -+ if (!ntfsresize -+ (write, partinfo->partname(), -+ new_end - new_start - 4 * MEGABYTE_SECTORS)) { -+ showDebug("%s", "shrinking filesystem ko\n"); -+ return false; -+ } -+ -+ /*---and now update geometry of the partition---*/ -+ showDebug("%s", "update geometry...\n"); -+ if (!libparted->set_geometry(partinfo, new_start, new_end)) { -+ showDebug("%s", "update geometry ko\n"); -+ _message = libparted->message(); -+ return false; -+ } else { -+ /*---if you are NOT committing then add in the undo/commit list---*/ -+ if (!write) { -+ showDebug("%s", -+ "operation added to undo/commit list\n"); -+ PedPartitionType parttype = -+ libparted->type2parttype(partinfo-> -+ type); -+ PedGeometry geom = -+ libparted->get_geometry(partinfo); -+ libparted->actlist->ins_resize(partinfo-> -+ num, -+ new_start, -+ new_end, -+ geom, -+ parttype); -+ } -+ return true; -+ } -+ /*---the user wants to enlarge!---*/ -+ } else { -+ /*---cannot enlarge if we cannot change disk geometry!---*/ -+ if (partinfo->device()->isBusy()) { -+ showDebug("%s", -+ "the device is busy, so you cannot enlarge it\n"); -+ _message = tr( -+ "Cannot enlarge a partition if the disk device is busy"); -+ return false; -+ } -+ -+ /*---first se the geometry of the partition---*/ -+ showDebug("%s", "update geometry...\n"); -+ if (!libparted->set_geometry(partinfo, new_start, new_end)) { -+ showDebug("%s", "update geometry ko\n"); -+ _message = libparted->message(); -+ return false; -+ } else { -+ /*---if you are NOT committing then add in the undo/commit list---*/ -+ if (!write) { -+ showDebug("%s", -+ "operation added to undo/commit list\n"); -+ PedPartitionType parttype = -+ libparted->type2parttype(partinfo-> -+ type); -+ PedGeometry geom = -+ libparted->get_geometry(partinfo); -+ libparted->actlist->ins_resize(partinfo-> -+ num, -+ new_start, -+ new_end, -+ geom, -+ parttype); -+ } -+ } -+ -+ if (write) { -+ /*---and now update the filesystem!---*/ -+ showDebug("%s", "enlarge filesystem...\n"); -+ if (!ntfsresize -+ (write, partinfo->partname(), -+ new_end - new_start - 4 * MEGABYTE_SECTORS)) { -+ showDebug("%s", "enlarge filesystem ko\n"); -+ return false; -+ } else { -+ return true; -+ } -+ } else { -+ return true; -+ } -+ } -+} -+ -+bool QP_FSNtfs::ntfsresize(bool write, QString dev, PedSector newsize) -+{ -+ /*---init of the error message---*/ -+ _message = QString::null; -+ -+ /*---calculate size of the partition in bytes---*/ -+ PedSector size = (PedSector) ((newsize - 1) * 512); - -- /*---progress bar!---*/ -- QString linesub = line; -+ /*---read-only test---*/ -+ QString cmdline = lstExternalTools->getPath(NTFSRESIZE) + " " + -+ "-n -ff -s " + QString::number(size) + " " + dev; -+ -+ if (!fs_open(cmdline)) { -+ _message = QString(NOTFOUND); -+ return false; -+ } -+ -+ bool error = false; -+ char *cline; -+ while ((cline = fs_getline())) { -+ QString line = QString(cline); -+ -+ QRegExp rx; -+ -+ if (!error) { -+ rx = QRegExp("^ERROR.*: (.*)"); -+ if (rx.search(line) == 0) { -+ QString captured = rx.cap(1); -+ _message = QString(captured); -+ error = true; -+ } -+ } -+ -+ if (!error) { -+ rx = QRegExp("^The volume end is fragmented.*"); -+ if (rx.search(line) == 0) { -+ _message = -+ QString -+ ("The partition is fragmented."); -+ error = true; -+ } -+ } -+ -+ /*---progress bar!---*/ -+ QString linesub = line; - #ifdef QT30COMPATIBILITY -- linesub.replace(QRegExp("\r"), " "); -+ linesub.replace(QRegExp("\r"), " "); - #else -- linesub.replace(QChar('\r'), " "); -+ linesub.replace(QChar('\r'), " "); - #endif -- //example: 34,72 percent completed -- rx = QRegExp("^.* (\\d*),(\\d*) percent completed.*$"); -- if (rx.search(linesub) == 0) { -- QString capIntPercent = rx.cap(1); -- printf("letto: %s\n", capIntPercent.latin1()); -- //QString capFloatPercent = rx.cap(2); -- -- bool rc; -- int iPerc = capIntPercent.toInt(&rc) - 1; -- if (iPerc < 0) iPerc = 0; //the percente completed run many times, but i don't want it reach 100% -- -- emit sigTimer(iPerc, QString(tr("Resizing in progress.")), QString::null); -- } -- -- //BETA: change could with might with ntfsresize 1.9 -- //rx = QRegExp("^Now You could resize at \\d* bytes or (\\d*) .*"); -- rx = QRegExp("^.*You ..... resize at \\d* bytes or (\\d*) .*"); -- if (rx.search(line) == 0) { -- QString captured = rx.cap(1); -- _message = QString("The partition is fragmented. Try to defragment it, or resize to %1MB") -- .arg(captured); -- error = true; -- } -- } -- fs_close(); -- -- if (error) return false; -- -- /*---if the user want to run a readonly test just return true---*/ -- if (!write) return true; -- -- -- /*---ok, the readonly test seems ok... now we resize it!---*/ -- sprintf(szcmdline, "-ff -s %lld %s", size, dev.latin1()); -- cmdline = QString("%1 %2") -- .arg(lstExternalTools->getPath(NTFSRESIZE)) -- .arg(szcmdline); -- if (!fs_open(cmdline)) { -- _message = QString(NOTFOUND); -- return false; -- } -- -- bool success = false; -- while ((cline = fs_getline())) { -- QString line = QString(cline); -- QRegExp rx; -- -- /*---progress bar!---*/ -- QString linesub = line; -+ //example: 34,72 percent completed -+ rx = QRegExp("^.* (\\d*),(\\d*) percent completed.*$"); -+ if (rx.search(linesub) == 0) { -+ QString capIntPercent = rx.cap(1); -+ printf("letto: %s\n", capIntPercent.latin1()); -+ //QString capFloatPercent = rx.cap(2); -+ -+ bool rc; -+ int iPerc = capIntPercent.toInt(&rc) - 1; -+ if (iPerc < 0) -+ iPerc = 0; //the percente completed run many times, but i don't want it reach 100% -+ -+ emit sigTimer(iPerc, -+ QString(tr("Resizing in progress.")), -+ QString::null); -+ } -+ //BETA: change could with might with ntfsresize 1.9 -+ //rx = QRegExp("^Now You could resize at \\d* bytes or (\\d*) .*"); -+ rx = QRegExp("^.*You ..... resize at \\d* bytes or (\\d*) .*"); -+ if (rx.search(line) == 0) { -+ QString captured = rx.cap(1); -+ _message = QString("The partition is fragmented. Try to defragment it, or resize to %1MB") -+ .arg(captured); -+ error = true; -+ } -+ } -+ fs_close(); -+ -+ if (error) -+ return false; -+ -+ /*---if the user want to run a readonly test just return true---*/ -+ if (!write) -+ return true; -+ -+ -+ /*---ok, the readonly test seems ok... now we resize it!---*/ -+ cmdline = lstExternalTools->getPath(NTFSRESIZE) + " -ff -s " + QString::number(size) + " " + dev; -+ if (!fs_open(cmdline)) { -+ _message = QString(NOTFOUND); -+ return false; -+ } -+ -+ bool success = false; -+ while ((cline = fs_getline())) { -+ QString line = QString(cline); -+ QRegExp rx; -+ -+ /*---progress bar!---*/ -+ QString linesub = line; - #ifdef QT30COMPATIBILITY -- linesub.replace(QRegExp("\r"), " "); -+ linesub.replace(QRegExp("\r"), " "); - #else -- linesub.replace(QChar('\r'), " "); -+ linesub.replace(QChar('\r'), " "); - #endif -- //example: 34,72 percent completed -- rx = QRegExp("^.* (\\d*),(\\d*) percent completed.*$"); -- if (rx.search(linesub) == 0) { -- QString capIntPercent = rx.cap(1); -- //QString capFloatPercent = rx.cap(2); -- -- bool rc; -- int iPerc = capIntPercent.toInt(&rc) - 1; -- if (iPerc < 0) iPerc = 0; //the percente completed run many times, but i don't want it reach 100% -- -- emit sigTimer(iPerc, QString(tr("Resizing in progress.")), QString::null); -- } -- -- //rx = QRegExp("^Successfully resized NTFS on device"); -- rx = QRegExp("^.*[Ss]uccessfully.*"); -- if (rx.search(line) == 0) -- success = true; -- rx = QRegExp("^Nothing to do: NTFS volume size is already OK."); -- if (rx.search(line) == 0) -- success = true; -- -- rx = QRegExp("^Syncing device.*"); -- if (rx.search(line) == 0) { -- emit sigTimer(99, QString(tr("Syncing device.")), QString::null); -- } -- -- rx = QRegExp("^ERROR.*: (.*)"); -- if (rx.search(line) == 0) { -- QString captured = rx.cap(1); -- _message = QString(captured); -- } -- } -- fs_close(); -- -- if (success) return true; -- else { -- if (_message.isNull()) _message = QString("An error occured! :("); -- return false; -- } --} -- --bool QP_FSNtfs::mkpartfs(QString dev, QString label) { -- char szcmdline[200]; -- QString cmdline; -- -- /*---init of the error message---*/ -- _message = QString::null; -- -- /*---prepare the command line---*/ -- if (label.isEmpty()) -- sprintf(szcmdline, "-f -s 512 %s", dev.latin1()); -- else -- sprintf(szcmdline, "-f -s 512 -L %s %s", label.latin1(), dev.latin1()); -- cmdline = QString("%1 %2") -- .arg(lstExternalTools->getPath(MKNTFS)) -- .arg(szcmdline); -- -- if (!fs_open(cmdline)) { -- _message = QString(NOTFOUND); -- return false; -- } -- -- -- bool success = false; -- char *cline; -- while ((cline = fs_getline())) { -- QString line = QString(cline); -- -- QRegExp rx; -- rx = QRegExp("^mkntfs completed successfully. Have a nice day."); -- if (rx.search(line) == 0) -- success = true; -- -- rx = QRegExp("^ERROR.*: (.*)"); -- if (rx.search(line) == 0) { -- QString captured = rx.cap(1); -- _message = QString(captured); -- success = false; -- } -- } -- fs_close(); -- -- return success; --} -- --PedSector QP_FSNtfs::min_size(QString dev) { -- char szcmdline[200]; -- QString cmdline; -- PedSector size = -1; -- -- /*---init of the error message---*/ -- _message = QString::null; -- -- /*---prepare the command line---*/ -- sprintf(szcmdline, "-f -i %s", dev.latin1()); -- cmdline = QString("%1 %2") -- .arg(lstExternalTools->getPath(NTFSRESIZE)) -- .arg(szcmdline); -- -- if (!fs_open(cmdline)) { -- _message = QString(NOTFOUND); -- return false; -- } -- -- -- bool success = false; -- char *cline; -- while ((cline = fs_getline())) { -- QString line = QString(cline); -- -- QRegExp rx; -- rx = QRegExp("^.*You ..... resize at (\\d*) bytes or (\\d*) .*"); -- if (rx.search(line) == 0) { -- QString captured = rx.cap(1); -- sscanf(captured.latin1(), "%lld", &size); -- size/=512; -- size+=8*MEGABYTE_SECTORS; -- -- success = true; -- } -- } -- fs_close(); -+ //example: 34,72 percent completed -+ rx = QRegExp("^.* (\\d*),(\\d*) percent completed.*$"); -+ if (rx.search(linesub) == 0) { -+ QString capIntPercent = rx.cap(1); -+ //QString capFloatPercent = rx.cap(2); -+ -+ bool rc; -+ int iPerc = capIntPercent.toInt(&rc) - 1; -+ if (iPerc < 0) -+ iPerc = 0; //the percente completed run many times, but i don't want it reach 100% -+ -+ emit sigTimer(iPerc, -+ QString(tr("Resizing in progress.")), -+ QString::null); -+ } -+ //rx = QRegExp("^Successfully resized NTFS on device"); -+ rx = QRegExp("^.*[Ss]uccessfully.*"); -+ if (rx.search(line) == 0) -+ success = true; -+ rx = QRegExp("^Nothing to do: NTFS volume size is already OK."); -+ if (rx.search(line) == 0) -+ success = true; -+ -+ rx = QRegExp("^Syncing device.*"); -+ if (rx.search(line) == 0) { -+ emit sigTimer(99, QString(tr("Syncing device.")), -+ QString::null); -+ } -+ -+ rx = QRegExp("^ERROR.*: (.*)"); -+ if (rx.search(line) == 0) { -+ QString captured = rx.cap(1); -+ _message = QString(captured); -+ } -+ } -+ fs_close(); - -- return size; -+ if (success) -+ return true; -+ else { -+ if (_message.isNull()) -+ _message = QString("An error occured! :("); -+ return false; -+ } - } - --QString QP_FSNtfs::fsname() { -- return QString("ntfs"); -+bool QP_FSNtfs::mkpartfs(QString dev, QString label) -+{ -+ QString cmdline; -+ -+ /*---init of the error message---*/ -+ _message = QString::null; -+ -+ /*---prepare the command line---*/ -+ if (label.isEmpty()) -+ cmdline = " -f -s 512 " + dev; -+ else -+ cmdline = " -f -s 512 -L " + label + " " + dev; -+ cmdline = lstExternalTools->getPath(MKNTFS) + cmdline; -+ -+ if (!fs_open(cmdline)) { -+ _message = QString(NOTFOUND); -+ return false; -+ } -+ -+ -+ bool success = false; -+ char *cline; -+ while ((cline = fs_getline())) { -+ QString line = QString(cline); -+ -+ QRegExp rx; -+ rx = QRegExp("^mkntfs completed successfully. Have a nice day."); -+ if (rx.search(line) == 0) -+ success = true; -+ -+ rx = QRegExp("^ERROR.*: (.*)"); -+ if (rx.search(line) == 0) { -+ QString captured = rx.cap(1); -+ _message = QString(captured); -+ success = false; -+ } -+ } -+ fs_close(); -+ -+ return success; -+} -+ -+PedSector QP_FSNtfs::min_size(QString dev) -+{ -+ PedSector size = -1; -+ -+ /*---init of the error message---*/ -+ _message = QString::null; -+ -+ /*---prepare the command line---*/ -+ QString cmdline = lstExternalTools->getPath(NTFSRESIZE) + " -f -i " + dev; -+ -+ if (!fs_open(cmdline)) { -+ _message = QString(NOTFOUND); -+ return false; -+ } -+ -+ -+ bool success = false; -+ char *cline; -+ while ((cline = fs_getline())) { -+ QString line = QString(cline); -+ -+ QRegExp rx; -+ rx = QRegExp("^.*You ..... resize at (\\d*) bytes or (\\d*) .*"); -+ if (rx.search(line) == 0) { -+ QString captured = rx.cap(1); -+ sscanf(captured.latin1(), "%lld", &size); -+ size /= 512; -+ size += 8 * MEGABYTE_SECTORS; -+ -+ success = true; -+ } -+ } -+ fs_close(); -+ -+ return size; -+} -+ -+QString QP_FSNtfs::fsname() -+{ -+ return QString("ntfs"); - } - - /*QString QP_FSNtfs::_get_label(PedPartition *) { -- return QString::null; -+ return QString::null; - }*/ - - - - /*---JFS WRAPPER-----------------------------------------------------------------*/ --QP_FSJfs::QP_FSJfs() { -- wrap_resize = RS_ENLARGE; -- wrap_move = false; -- wrap_copy = false; -- wrap_create = false; -- wrap_min_size = false; -- -- /*---check if the wrapper is installed---*/ -- QString cmdline = QString("which %1") -- .arg(lstExternalTools->getPath(MKFS_JFS)); -- fs_open(cmdline); -- -- char *cline; -- while ((cline = fs_getline())) -- wrap_create = true; -- fs_close(); -- --} -- --bool QP_FSJfs::resize(QP_LibParted *_libparted, bool write, QP_PartInfo *partinfo, PedSector new_start, PedSector new_end) { -- /*---pointer to libparted---*/ -- QP_LibParted *libparted = _libparted; -- -- showDebug("%s", "Resizing a filesystem using a wrapper\n"); -- -- /*---the user want to shrink or enlarge the partition?---*/ -- /*---the user want to shrink!---*/ -- if (new_end < partinfo->end) { -- /*---update the filesystem---*/ -- showDebug("%s", "shrinking filesystem not supported with jfs...\n"); -- return false; -- /*---the user want to enlarge!---*/ -- } else { -- /*---cannot enlarge if we cannot change disk geometry!---*/ -- if (partinfo->device()->isBusy()) { -- showDebug("%s", "the device is busy, so you cannot enlarge it\n"); -- _message = tr("Cannot enlarge a partition if the disk device is busy"); -- return false; -- } -- -- /*---first se the geometry of the partition---*/ -- showDebug("%s", "update geometry...\n"); -- if (!libparted->set_geometry(partinfo, new_start, new_end)) { -- showDebug("%s", "update geometry ko\n"); -- _message = libparted->message(); -- return false; -- } else { -- /*---if you are NOT committing then add in the undo/commit list---*/ -- if (!write) { -- showDebug("%s", "operation added to undo/commit list\n"); -- PedPartitionType parttype = libparted->type2parttype(partinfo->type); -- PedGeometry geom = libparted->get_geometry(partinfo); -- libparted->actlist->ins_resize(partinfo->num, new_start, new_end, geom, parttype); -- } -- } -- -- if (write) { -- /*---and now update the filesystem!---*/ -- showDebug("%s", "enlarge filesystem...\n"); -- if (!jfsresize(write, partinfo, new_end - new_start)) { -- showDebug("%s", "enlarge filesystem ko\n"); -- return false; -- } else { -- return true; -- } -- } else { -- return true; -- } -- } --} -- --bool QP_FSJfs::jfsresize(bool write, QP_PartInfo *partinfo, PedSector) { -- char szcmdline[200]; -- QString cmdline; -- -- bool error = false; -- -- if (!write) return true; -- -- /*---init of the error message---*/ -- _message = QString::null; -- -- if (!qpMount(partinfo->partname())) -- return false; -- -- -- /*---do the resize!---*/ -- sprintf(szcmdline, "-o remount,resize= %s", TMP_MOUNTPOINT); -- cmdline = QString("%1 %2") -- .arg(lstExternalTools->getPath(MOUNT)) -- .arg(szcmdline); -- -- if (!fs_open(cmdline)) { -- _message = QString(NOTFOUND); -- return false; -- } -- -- char *cline; -- while ((cline = fs_getline())) { -- QString line = QString(cline); -- -- QRegExp rx; -- rx = QRegExp("^mount: (.*)$"); -- if (rx.search(line) == 0) { -- QString capError = rx.cap(1); -- _message = capError; -- error = true; -- } -- } -- fs_close(); -- -- if (error) return false; -- -- if (!qpUMount(partinfo->partname())) -- return false; -- -- return true; -- /*fino a qui*/ --} -- --bool QP_FSJfs::mkpartfs(QString dev, QString label) { -- char szcmdline[200]; -- QString cmdline; -- -- /*---init of the error message---*/ -- _message = QString::null; -- -- /*---prepare the command line---*/ -- if (label.isEmpty()) -- sprintf(szcmdline, "-q %s", dev.latin1()); -- else -- sprintf(szcmdline, "-q -L %s %s", label.latin1(), dev.latin1()); -- cmdline = QString("%1 %2") -- .arg(lstExternalTools->getPath(MKFS_JFS)) -- .arg(szcmdline); -- -- if (!fs_open(cmdline)) { -- _message = QString(NOTFOUND); -- return false; -- } -- -- -- bool success = false; -- char *cline; -- while ((cline = fs_getline())) { -- QString line = QString(cline); -- -- QRegExp rx; -- rx = QRegExp("^Format completed successfully."); -- if (rx.search(line) == 0) -- success = true; -- } -- fs_close(); -- -- return success; --} -- --QString QP_FSJfs::fsname() { -- return QString("jfs"); --} -- --QString QP_FSJfs::_get_label(PedPartition *part) --{ -- char bootsect[2048]; -- char label[12]; -- -- if (!QP_FSWrap::read_sector(part, 64, 4, bootsect)) -- return QString::null; -- -- memset(label, 0, sizeof(label)); -- strncpy(label, bootsect+101, 11); -- -- return QString(label); -+QP_FSJfs::QP_FSJfs() -+{ -+ wrap_resize = RS_ENLARGE; -+ wrap_move = false; -+ wrap_copy = false; -+ wrap_create = false; -+ wrap_min_size = false; -+ -+ /*---check if the wrapper is installed---*/ -+ QString cmdline = "which " + lstExternalTools->getPath(MKFS_JFS); -+ fs_open(cmdline); -+ -+ char *cline; -+ while ((cline = fs_getline())) -+ wrap_create = true; -+ fs_close(); -+ -+} -+ -+bool QP_FSJfs::resize(QP_LibParted * _libparted, bool write, -+ QP_PartInfo * partinfo, PedSector new_start, -+ PedSector new_end) -+{ -+ /*---pointer to libparted---*/ -+ QP_LibParted *libparted = _libparted; -+ -+ showDebug("%s", "Resizing a filesystem using a wrapper\n"); -+ -+ /*---the user wants to shrink or enlarge the partition?---*/ -+ /*---the user wants to shrink!---*/ -+ if (new_end < partinfo->end) { -+ /*---update the filesystem---*/ -+ showDebug("%s", -+ "shrinking filesystem not supported with jfs...\n"); -+ return false; -+ /*---the user want to enlarge!---*/ -+ } else { -+ /*---cannot enlarge if we cannot change disk geometry!---*/ -+ if (partinfo->device()->isBusy()) { -+ showDebug("%s", -+ "the device is busy, so you cannot enlarge it\n"); -+ _message = tr("Cannot enlarge a partition if the disk device is busy"); -+ return false; -+ } -+ -+ /*---first se the geometry of the partition---*/ -+ showDebug("%s", "update geometry...\n"); -+ if (!libparted->set_geometry(partinfo, new_start, new_end)) { -+ showDebug("%s", "update geometry ko\n"); -+ _message = libparted->message(); -+ return false; -+ } else { -+ /*---if you are NOT committing then add in the undo/commit list---*/ -+ if (!write) { -+ showDebug("%s", -+ "operation added to undo/commit list\n"); -+ PedPartitionType parttype = -+ libparted->type2parttype(partinfo-> -+ type); -+ PedGeometry geom = -+ libparted->get_geometry(partinfo); -+ libparted->actlist->ins_resize(partinfo-> -+ num, -+ new_start, -+ new_end, -+ geom, -+ parttype); -+ } -+ } -+ -+ if (write) { -+ /*---and now update the filesystem!---*/ -+ showDebug("%s", "enlarge filesystem...\n"); -+ if (!jfsresize -+ (write, partinfo, new_end - new_start)) { -+ showDebug("%s", "enlarge filesystem ko\n"); -+ return false; -+ } else { -+ return true; -+ } -+ } else { -+ return true; -+ } -+ } -+} -+ -+bool QP_FSJfs::jfsresize(bool write, QP_PartInfo * partinfo, PedSector) -+{ -+ QString cmdline; -+ -+ bool error = false; -+ -+ if (!write) -+ return true; -+ -+ /*---init of the error message---*/ -+ _message = QString::null; -+ -+ if (!qpMount(partinfo->partname())) -+ return false; -+ -+ -+ /*---do the resize!---*/ -+ cmdline = lstExternalTools->getPath(MOUNT) + " -o remount,resize= " + TMP_MOUNTPOINT; -+ -+ if (!fs_open(cmdline)) { -+ _message = QString(NOTFOUND); -+ return false; -+ } -+ -+ char *cline; -+ while ((cline = fs_getline())) { -+ QString line = QString(cline); -+ -+ QRegExp rx; -+ rx = QRegExp("^mount: (.*)$"); -+ if (rx.search(line) == 0) { -+ QString capError = rx.cap(1); -+ _message = capError; -+ error = true; -+ } -+ } -+ fs_close(); -+ -+ if (error) -+ return false; -+ -+ if (!qpUMount(partinfo->partname())) -+ return false; -+ -+ return true; -+ /*fino a qui */ -+} -+ -+bool QP_FSJfs::mkpartfs(QString dev, QString label) -+{ -+ QString cmdline; -+ -+ /*---init of the error message---*/ -+ _message = QString::null; -+ -+ /*---prepare the command line---*/ -+ if (label.isEmpty()) -+ cmdline = " -q " + dev; -+ else -+ cmdline = " -q -L " + label + " " + dev; -+ cmdline = lstExternalTools->getPath(MKFS_JFS) + cmdline; -+ -+ if (!fs_open(cmdline)) { -+ _message = QString(NOTFOUND); -+ return false; -+ } -+ -+ -+ bool success = false; -+ char *cline; -+ while ((cline = fs_getline())) { -+ QString line = QString(cline); -+ -+ QRegExp rx; -+ rx = QRegExp("^Format completed successfully."); -+ if (rx.search(line) == 0) -+ success = true; -+ } -+ fs_close(); -+ -+ return success; -+} -+ -+QString QP_FSJfs::fsname() -+{ -+ return QString("jfs"); -+} -+ -+QString QP_FSJfs::_get_label(PedPartition * part) -+{ -+ char bootsect[2048]; -+ char label[12]; -+ -+ if (!QP_FSWrap::read_sector(part, 64, 4, bootsect)) -+ return QString::null; -+ -+ memset(label, 0, sizeof(label)); -+ strncpy(label, bootsect + 101, 11); -+ -+ return QString(label); - } - - /*---EXT3 WRAPPER----------------------------------------------------------------*/ --QP_FSExt3::QP_FSExt3() { -- wrap_min_size = false; -- wrap_resize = false; -- wrap_move = false; -- wrap_copy = false; -- wrap_create = false; -- -- /*---check if the wrapper is installed---*/ -- QString cmdline = QString("which %1") -- .arg(lstExternalTools->getPath(MKFS_EXT3)); -- fs_open(cmdline); -- -- char *cline; -- while ((cline = fs_getline())) -- wrap_create = true; -- fs_close(); -- --} -- --bool QP_FSExt3::mkpartfs(QString dev, QString label) { -- char szcmdline[200]; -- QString cmdline; -- -- /*---init of the error message---*/ -- _message = QString::null; -- -- /*---prepare the command line---*/ -- if (label.isEmpty()) -- sprintf(szcmdline, "%s", dev.latin1()); -- else -- sprintf(szcmdline, "-L %s %s", label.latin1(), dev.latin1()); -- cmdline = QString("%1 %2") -- .arg(lstExternalTools->getPath(MKFS_EXT3)) -- .arg(szcmdline); -- -- if (!fs_open(cmdline)) { -- _message = QString(NOTFOUND); -- return false; -- } -- -- -- bool writenode = false; -- bool success = false; -- char *cline; -- while ((cline = fs_getline())) { -- QString line = QString(cline); -- -- QRegExp rx; -- rx = QRegExp("^Writing inode tables"); -- if (rx.search(line) == 0) { -- writenode = true; -- } -- -- rx = QRegExp("^Creating journal"); -- if (rx.search(line) == 0) { -- writenode = false; -- emit sigTimer(90, QString(tr("Writing superblocks and filesystem.")), QString::null); -- } -+QP_FSExt3::QP_FSExt3() -+{ -+ wrap_min_size = false; -+ wrap_resize = false; -+ wrap_move = false; -+ wrap_copy = false; -+ wrap_create = false; -+ -+ /*---check if the wrapper is installed---*/ -+ QString cmdline = "which " + lstExternalTools->getPath(MKFS_EXT3); -+ fs_open(cmdline); -+ -+ char *cline; -+ while ((cline = fs_getline())) -+ wrap_create = true; -+ fs_close(); -+ -+} -+ -+bool QP_FSExt3::mkpartfs(QString dev, QString label) -+{ -+ QString cmdline; -+ -+ /*---init of the error message---*/ -+ _message = QString::null; -+ -+ /*---prepare the command line---*/ -+ if (!label.isEmpty()) -+ cmdline = " -L " + label; -+ cmdline = lstExternalTools->getPath(MKFS_EXT3) + cmdline + " " + dev; -+ -+ if (!fs_open(cmdline)) { -+ _message = QString(NOTFOUND); -+ return false; -+ } - -- if (writenode) { -- QString linesub = line; -+ -+ bool writenode = false; -+ bool success = false; -+ char *cline; -+ while ((cline = fs_getline())) { -+ QString line = QString(cline); -+ -+ QRegExp rx; -+ rx = QRegExp("^Writing inode tables"); -+ if (rx.search(line) == 0) { -+ writenode = true; -+ } -+ -+ rx = QRegExp("^Creating journal"); -+ if (rx.search(line) == 0) { -+ writenode = false; -+ emit sigTimer(90, -+ QString(tr -+ ("Writing superblocks and filesystem.")), -+ QString::null); -+ } -+ -+ if (writenode) { -+ QString linesub = line; - - #ifdef QT30COMPATIBILITY -- linesub.replace(QRegExp("\b"), " "); -+ linesub.replace(QRegExp("\b"), " "); - #else -- linesub.replace(QChar('\b'), " "); -+ linesub.replace(QChar('\b'), " "); - #endif -- rx = QRegExp("^.* (\\d*)/(\\d*) .*$"); -- if (rx.search(linesub) == 0) { -- QString capActual = rx.cap(1); -- QString capTotal = rx.cap(2); -- -- bool rc; -- int iActual = capActual.toInt(&rc); -- int iTotal = capTotal.toInt(&rc); -+ rx = QRegExp("^.* (\\d*)/(\\d*) .*$"); -+ if (rx.search(linesub) == 0) { -+ QString capActual = rx.cap(1); -+ QString capTotal = rx.cap(2); -+ -+ bool rc; -+ int iActual = capActual.toInt(&rc); -+ int iTotal = capTotal.toInt(&rc); -+ -+ int iPerc = iActual * 80 / iTotal; //The percentual is calculated in 80% ;) -+ emit sigTimer(iPerc, -+ QString(tr -+ ("Writing inode tables.")), -+ QString::null); -+ } -+ } -+ -+ rx = QRegExp("^Writing superblocks and filesystem accounting information: done"); -+ if (rx.search(line) == 0) -+ success = true; -+ } -+ fs_close(); - -- int iPerc = iActual*80/iTotal; //The percentual is calculated in 80% ;) -- emit sigTimer(iPerc, QString(tr("Writing inode tables.")), QString::null); -- } -- } -+ if (!success) -+ _message = QString(tr("There was a problem with mkfs.ext3.")); - -- rx = QRegExp("^Writing superblocks and filesystem accounting information: done"); -- if (rx.search(line) == 0) -- success = true; -- } -- fs_close(); -+ return success; -+} - -- if (!success) _message = QString(tr("There was a problem with mkfs.ext3.")); -+QString QP_FSExt3::fsname() -+{ -+ return QString("ext3"); -+} - -- return success; -+QString QP_FSExt3::_get_label(PedPartition * p) -+{ -+ return QP_FSExt2::_get_label(p); -+ //return QString::null; - } - --QString QP_FSExt3::fsname() { -- return QString("ext3"); -+/*---XFS WRAPPER-----------------------------------------------------------------*/ -+QP_FSXfs::QP_FSXfs() -+{ -+ wrap_min_size = false; -+ wrap_resize = false; -+ wrap_move = false; -+ wrap_copy = false; -+ wrap_create = false; -+ -+ /*---check if the wrapper is installed---*/ -+ QString cmdline = "which " + lstExternalTools->getPath(MKFS_XFS); -+ fs_open(cmdline); -+ -+ char *cline; -+ while ((cline = fs_getline())) -+ wrap_create = true; -+ fs_close(); -+ -+ -+ /*---check if the wrapper is installed---*/ -+ cmdline = "which " + lstExternalTools->getPath(XFS_GROWFS); -+ fs_open(cmdline); -+ -+ while ((cline = fs_getline())) -+ wrap_resize = RS_ENLARGE; -+ fs_close(); - } - --QString QP_FSExt3::_get_label(PedPartition *p) -+bool QP_FSXfs::mkpartfs(QString dev, QString label) - { -- return QP_FSExt2::_get_label(p); -- //return QString::null; -+ QString cmdline; -+ -+ /*---init of the error message---*/ -+ _message = QString::null; -+ -+ /*---prepare the command line---*/ -+ if (label.isEmpty()) -+ cmdline = " -f " + dev; -+ else -+ cmdline = " -f -L " + label + " " + dev; -+ cmdline = lstExternalTools->getPath(MKFS_XFS) + cmdline; -+ -+ if (!fs_open(cmdline)) { -+ _message = QString(NOTFOUND); -+ return false; -+ } -+ -+ bool success = false; -+ char *cline; -+ while ((cline = fs_getline())) { -+ QString line = QString(cline); -+ -+ QRegExp rx; -+ rx = QRegExp("^realtime =.*"); -+ if (rx.search(line) == 0) -+ success = true; -+ } -+ fs_close(); -+ -+ if (!success) -+ _message = QString(tr("There was a problem with mkfs.xfs.")); -+ return success; - } - --/*---XFS WRAPPER-----------------------------------------------------------------*/ --QP_FSXfs::QP_FSXfs() { -- wrap_min_size = false; -- wrap_resize = false; -- wrap_move = false; -- wrap_copy = false; -- wrap_create = false; -- -- /*---check if the wrapper is installed---*/ -- QString cmdline = QString("which %1") -- .arg(lstExternalTools->getPath(MKFS_XFS)); -- fs_open(cmdline); -- -- char *cline; -- while ((cline = fs_getline())) -- wrap_create = true; -- fs_close(); -- -- -- /*---check if the wrapper is installed---*/ -- cmdline = QString("which %1") -- .arg(lstExternalTools->getPath(XFS_GROWFS)); -- fs_open(cmdline); -- -- while ((cline = fs_getline())) -- wrap_resize = RS_ENLARGE; -- fs_close(); --} -- --bool QP_FSXfs::mkpartfs(QString dev, QString label) { -- char szcmdline[200]; -- QString cmdline; -- -- /*---init of the error message---*/ -- _message = QString::null; -- -- /*---prepare the command line---*/ -- if (label.isEmpty()) -- sprintf(szcmdline, "-f %s", dev.latin1()); -- else -- sprintf(szcmdline, "-f -L %s %s", label.latin1(), dev.latin1()); -- cmdline = QString("%1 %2") -- .arg(lstExternalTools->getPath(MKFS_XFS)) -- .arg(szcmdline); -- -- if (!fs_open(cmdline)) { -- _message = QString(NOTFOUND); -- return false; -- } -- -- bool success = false; -- char *cline; -- while ((cline = fs_getline())) { -- QString line = QString(cline); -- -- QRegExp rx; -- rx = QRegExp("^realtime =.*"); -- if (rx.search(line) == 0) -- success = true; -- } -- fs_close(); -- -- if (!success) _message = QString(tr("There was a problem with mkfs.xfs.")); -- return success; --} -- --bool QP_FSXfs::resize(QP_LibParted *_libparted, bool write, QP_PartInfo *partinfo, PedSector new_start, PedSector new_end) { -- /*---pointer to libparted---*/ -- QP_LibParted *libparted = _libparted; -- -+bool QP_FSXfs::resize(QP_LibParted * _libparted, bool write, -+ QP_PartInfo * partinfo, PedSector new_start, -+ PedSector new_end) -+{ -+ /*---pointer to libparted---*/ -+ QP_LibParted *libparted = _libparted; -+ - showDebug("%s", "Resizing a filesystem using a wrapper\n"); - -- /*---the user want to shrink or enlarge the partition?---*/ -- /*---the user want to shrink!---*/ -- if (new_end < partinfo->end) { -- /*---update the filesystem---*/ -- showDebug("%s", "shrinking filesystem not supported with xfs...\n"); -- return false; -- /*---the user want to enlarge!---*/ -- } else { -- /*---cannot enlarge if we cannot change disk geometry!---*/ -- if (partinfo->device()->isBusy()) { -- showDebug("%s", "the device is busy, so you cannot enlarge it\n"); -- _message = tr("Cannot enlarge a partition if the disk device is busy"); -- return false; -- } -- -- /*---first se the geometry of the partition---*/ -- showDebug("%s", "update geometry...\n"); -- if (!libparted->set_geometry(partinfo, new_start, new_end)) { -- showDebug("%s", "update geometry ko\n"); -- _message = libparted->message(); -- return false; -- } else { -- /*---if you are NOT committing then add in the undo/commit list---*/ -- if (!write) { -- showDebug("%s", "operation added to undo/commit list\n"); -- PedPartitionType parttype = libparted->type2parttype(partinfo->type); -- PedGeometry geom = libparted->get_geometry(partinfo); -- libparted->actlist->ins_resize(partinfo->num, new_start, new_end, geom, parttype); -- } -- } -- -- if (write) { -- /*---and now update the filesystem!---*/ -- showDebug("%s", "enlarge filesystem...\n"); -- if (!xfsresize(write, partinfo, new_end - new_start)) { -- showDebug("%s", "enlarge filesystem ko\n"); -- return false; -- } else { -- return true; -- } -- } else { -- return true; -- } -- } --} -- --bool QP_FSXfs::xfsresize(bool write, QP_PartInfo *partinfo, PedSector) { -- char szcmdline[200]; -- QString cmdline; -- -- bool error = false; -- -- if (!write) return true; -- -- /*---init of the error message---*/ -- _message = QString::null; -- -- if (!qpMount(partinfo->partname())) -- return false; -- -- /*---do the resize!---*/ -- sprintf(szcmdline, "%s", TMP_MOUNTPOINT); -- cmdline = QString("%1 %2") -- .arg(lstExternalTools->getPath(XFS_GROWFS)) -- .arg(szcmdline); -- -- if (!fs_open(cmdline)) { -- _message = QString(NOTFOUND); -- return false; -- } -- -- error = true; -- char *cline; -- while ((cline = fs_getline())) { -- QString line = QString(cline); -- -- QRegExp rx; -- rx = QRegExp("^realtime =.*"); -- if (rx.search(line) == 0) { -- error = false; -- } -- } -- fs_close(); -- -- if (error) { -- _message = QString(tr("Error during xfs_grow.")); -- return false; -- } -- -- if (!qpUMount(partinfo->partname())) -- return false; -- -- return true; --} -- --QString QP_FSXfs::fsname() --{ -- return QString("xfs"); --} -- --QString QP_FSXfs::_get_label(PedPartition *part) --{ -- char bootsect[2048]; -- char label[13]; -- -- if (!QP_FSWrap::read_sector(part, 0, 4, bootsect)) -- return QString::null; -- -- memset(label, 0, sizeof(label)); -- strncpy(label, bootsect+108, 12); -- -- //printf("returned buffer ntfs: [%s]\n", label); -+ /*---the user wants to shrink or enlarge the partition?---*/ -+ /*---the user wants to shrink!---*/ -+ if (new_end < partinfo->end) { -+ /*---update the filesystem---*/ -+ showDebug("%s", -+ "shrinking filesystem not supported with xfs...\n"); -+ return false; -+ /*---the user want to enlarge!---*/ -+ } else { -+ /*---cannot enlarge if we cannot change disk geometry!---*/ -+ if (partinfo->device()->isBusy()) { -+ showDebug("%s", -+ "the device is busy, so you cannot enlarge it\n"); -+ _message = -+ tr -+ ("Cannot enlarge a partition if the disk device is busy"); -+ return false; -+ } -+ -+ /*---first se the geometry of the partition---*/ -+ showDebug("%s", "update geometry...\n"); -+ if (!libparted->set_geometry(partinfo, new_start, new_end)) { -+ showDebug("%s", "update geometry ko\n"); -+ _message = libparted->message(); -+ return false; -+ } else { -+ /*---if you are NOT committing then add in the undo/commit list---*/ -+ if (!write) { -+ showDebug("%s", -+ "operation added to undo/commit list\n"); -+ PedPartitionType parttype = -+ libparted->type2parttype(partinfo-> -+ type); -+ PedGeometry geom = -+ libparted->get_geometry(partinfo); -+ libparted->actlist->ins_resize(partinfo-> -+ num, -+ new_start, -+ new_end, -+ geom, -+ parttype); -+ } -+ } -+ -+ if (write) { -+ /*---and now update the filesystem!---*/ -+ showDebug("%s", "enlarge filesystem...\n"); -+ if (!xfsresize -+ (write, partinfo, new_end - new_start)) { -+ showDebug("%s", "enlarge filesystem ko\n"); -+ return false; -+ } else { -+ return true; -+ } -+ } else { -+ return true; -+ } -+ } -+} -+ -+bool QP_FSXfs::xfsresize(bool write, QP_PartInfo * partinfo, PedSector) -+{ -+ QString cmdline; -+ -+ bool error = false; -+ -+ if (!write) -+ return true; -+ -+ /*---init of the error message---*/ -+ _message = QString::null; -+ -+ if (!qpMount(partinfo->partname())) -+ return false; -+ -+ /*---do the resize!---*/ -+ cmdline = lstExternalTools->getPath(XFS_GROWFS) + " " + TMP_MOUNTPOINT; -+ -+ if (!fs_open(cmdline)) { -+ _message = QString(NOTFOUND); -+ return false; -+ } -+ -+ error = true; -+ char *cline; -+ while ((cline = fs_getline())) { -+ QString line = QString(cline); -+ -+ QRegExp rx; -+ rx = QRegExp("^realtime =.*"); -+ if (rx.search(line) == 0) { -+ error = false; -+ } -+ } -+ fs_close(); -+ -+ if (error) { -+ _message = QString(tr("Error during xfs_grow.")); -+ return false; -+ } - -- return QString(label); -+ if (!qpUMount(partinfo->partname())) -+ return false; -+ -+ return true; -+} -+ -+QString QP_FSXfs::fsname() -+{ -+ return QString("xfs"); -+} -+ -+QString QP_FSXfs::_get_label(PedPartition * part) -+{ -+ char bootsect[2048]; -+ char label[13]; -+ -+ if (!QP_FSWrap::read_sector(part, 0, 4, bootsect)) -+ return QString::null; -+ -+ memset(label, 0, sizeof(label)); -+ strncpy(label, bootsect + 108, 12); -+ -+ //printf("returned buffer ntfs: [%s]\n", label); -+ -+ return QString(label); - } - - /*---FAT16 WRAPPER---------------------------------------------------------------*/ --QString QP_FSFat16::_get_label(PedPartition *) -+QString QP_FSFat16::_get_label(PedPartition *) - { -- return QString::null; -+ return QString::null; - } - - - /*---FAT32 WRAPPER---------------------------------------------------------------*/ --QString QP_FSFat32::_get_label(PedPartition *part) -+QString QP_FSFat32::_get_label(PedPartition * part) - { -- char buffer[PED_SECTOR_SIZE]; -- char label[12]; -- -- if (!QP_FSWrap::read_sector(part, 0, 1, buffer)) -- { -- return QString::null; -- } -- else -- { -- memset(label, 0, sizeof(label)); -- memcpy(label, buffer+0x47, 11); -- //printf("returned fat buffer: %s\n", label); -- return QString(label); -- } -+#ifdef PED_SECTOR_SIZE // PED_SECTOR_SIZE is gone in parted 1.7.x -+ char *buffer=new char[PED_SECTOR_SIZE]; -+#else -+ char *buffer=new char[part->disk->dev->sector_size]; -+#endif -+ char label[12]; -+ -+ if (!QP_FSWrap::read_sector(part, 0, 1, buffer)) { -+ delete[] buffer; -+ return QString::null; -+ } -+ -+ memset(label, 0, sizeof(label)); -+ memcpy(label, buffer + 0x47, 11); -+ //printf("returned fat buffer: %s\n", label); -+ delete[] buffer; -+ return QString(label); - } - - /*---EXT2 WRAPPER----------------------------------------------------------------*/ --QString QP_FSExt2::_get_label(PedPartition *part) -+QString QP_FSExt2::_get_label(PedPartition * part) - { -- char bootsect[2048]; // sector number 2 (offset 1024) -- char label[16]; -+ char bootsect[2048]; // sector number 2 (offset 1024) -+ char label[16]; - -- if (!QP_FSWrap::read_sector(part, 2, 4, bootsect)) -- return QString::null; -- -- memset(label, 0, sizeof(label)); -- strncpy(label, bootsect+120, 16); -- -- //printf("returned buffer ext2/3: [%s]\n", label); -+ if (!QP_FSWrap::read_sector(part, 2, 4, bootsect)) -+ return QString::null; - -- return QString(label); -+ memset(label, 0, sizeof(label)); -+ strncpy(label, bootsect + 120, 16); -+ -+ //printf("returned buffer ext2/3: [%s]\n", label); -+ -+ return QString(label); - } - - - /*---REISERFS WRAPPER------------------------------------------------------------*/ --QString QP_FSReiserFS::_get_label(PedPartition *) -+QString QP_FSReiserFS::_get_label(PedPartition *) - { -- //return QString::null; -- return tr("No label"); -+ //return QString::null; -+ return tr("No label"); - } - - --QString QP_FSNtfs::_get_label(PedPartition *part) -+QString QP_FSNtfs::_get_label(PedPartition * part) - { -- u8 bootsect[16384]; -- char label[32]; -- memset(label, 0, sizeof(label)); -- BYTE cFileRecord[8192+1]; // 1024 should be enough (dwFileRecordSize) -- -- QWORD qwOffset; -- WORD nOffsetSequenceAttribute; -- BYTE *cData; -- DWORD dwAttribType; -- DWORD dwAttribLen; -- bool bAttribResident; -- BYTE *cDataResident; -- WORD nAttrSize; -- u32 dwFileRecordSize; -- QWORD i; -- -- if (!QP_FSWrap::read_sector(part, 0, 32, (char*)bootsect)) -- return QString::null; -- -- // 1. check partition has an ntfs file system -- if (memcmp(bootsect+3, "NTFS", 4) != 0) -- { -- //printf ("NTFS-001: not an NTFS partition\n"); -- return QString::null; -- } -- -- u16 nBytesPerSector = NTFS_GETU16(bootsect+0xB); -- u8 cSectorsPerCluster = NTFS_GETU8(bootsect+0xD); -- u64 qwTotalSectorsCount = NTFS_GETU64(bootsect+0x28); -- u64 qwLCNOfMftDataAttrib = NTFS_GETU64(bootsect+0x30); -- s8 cClustersPerMftRecord = NTFS_GETS8(bootsect+0x40); -- -- // check informations validity -- if (nBytesPerSector % 512 != 0) -- { -- //printf ("NTFS-002: invalid nBytesPerSector value\n"); -- return QString::null; -- } -- -- // Calculate clusters and misc informations -- u32 dwClusterSize = (DWORD)nBytesPerSector * cSectorsPerCluster; -- -- -- if (cClustersPerMftRecord > 0) -- dwFileRecordSize = cClustersPerMftRecord * dwClusterSize; -- else -- dwFileRecordSize = 1 << (-cClustersPerMftRecord); -- -- // 1. read $Volume record -- qwOffset = ((QWORD) qwLCNOfMftDataAttrib * dwClusterSize) + ((QWORD) (3 * dwFileRecordSize)); -- -- u32 dwOffsetToRead = (u32) (qwOffset / ((u64)512)); -- u32 dwSectorCountToRead = (u32) dwFileRecordSize/512; -- -- if (!QP_FSWrap::read_sector(part, dwOffsetToRead, dwSectorCountToRead, (char*)cFileRecord)) -- { -- //printf("readVolumeLabel(): failed in readData()\n"); -- return QString::null; -- } -- -- // -------- decode the MFT File record -- nOffsetSequenceAttribute = NTFS_GETU16(cFileRecord+0x14); -- cData = cFileRecord + nOffsetSequenceAttribute; -- -- do -- { -- // szData points to the beginning of an attribute -- dwAttribType = NTFS_GETU32(cData); -- dwAttribLen = NTFS_GETU32(cData+4); -- bAttribResident = (NTFS_GETU8(cData+8)==0); -- -- if(dwAttribType == 0x60) // "volume_name" -- { -- if (bAttribResident == false) -- { -- //printf("readVolumeLabel(): failed: $volume_name attribute is not resident\n"); -- return QString::null; -- } -- -- nAttrSize = NTFS_GETU16(cData+0x10); -- cDataResident = cData+NTFS_GETU16(cData+0x14); -- -- for (i=0; i < (DWORD)(nAttrSize/2); i++) -- label[i] = cDataResident[2*i]; -- } -- /*if(dwAttribType == 0x70) // "volume_information" -- { -- int nNtfsVersion = 0; -- if (bAttribResident == true) -- { -- nAttrSize = NTFS_GETU16(cData+0x10); -- cDataResident = cData+NTFS_GETU16(cData+0x14); -- nNtfsVersion = (((BYTE) cDataResident[8]) << 8) | ((BYTE) cDataResident[9]); -- printf("readVolumeLabel(): version is %d.%d\n", cDataResident[8], cDataResident[9]); -- } -- }*/ -- -- cData += dwAttribLen; -- } while(dwAttribType != (DWORD)-1); // attribute list ends with type -1 -+ u8 bootsect[16384]; -+ char label[32]; -+ memset(label, 0, sizeof(label)); -+ BYTE cFileRecord[8192 + 1]; // 1024 should be enough (dwFileRecordSize) -+ -+ QWORD qwOffset; -+ WORD nOffsetSequenceAttribute; -+ BYTE *cData; -+ DWORD dwAttribType; -+ DWORD dwAttribLen; -+ bool bAttribResident; -+ BYTE *cDataResident; -+ WORD nAttrSize; -+ u32 dwFileRecordSize; -+ QWORD i; -+ -+ if (!QP_FSWrap::read_sector(part, 0, 32, (char *) bootsect)) -+ return QString::null; -+ -+ // 1. check partition has an ntfs file system -+ if (memcmp(bootsect + 3, "NTFS", 4) != 0) { -+ //printf ("NTFS-001: not an NTFS partition\n"); -+ return QString::null; -+ } -+ -+ u16 nBytesPerSector = NTFS_GETU16(bootsect + 0xB); -+ u8 cSectorsPerCluster = NTFS_GETU8(bootsect + 0xD); -+ u64 qwTotalSectorsCount = NTFS_GETU64(bootsect + 0x28); -+ u64 qwLCNOfMftDataAttrib = NTFS_GETU64(bootsect + 0x30); -+ s8 cClustersPerMftRecord = NTFS_GETS8(bootsect + 0x40); -+ -+ // check informations validity -+ if (nBytesPerSector % 512 != 0) { -+ //printf ("NTFS-002: invalid nBytesPerSector value\n"); -+ return QString::null; -+ } -+ // Calculate clusters and misc informations -+ u32 dwClusterSize = (DWORD) nBytesPerSector * cSectorsPerCluster; -+ -+ -+ if (cClustersPerMftRecord > 0) -+ dwFileRecordSize = cClustersPerMftRecord * dwClusterSize; -+ else -+ dwFileRecordSize = 1 << (-cClustersPerMftRecord); -+ -+ // 1. read $Volume record -+ qwOffset = -+ ((QWORD) qwLCNOfMftDataAttrib * dwClusterSize) + -+ ((QWORD) (3 * dwFileRecordSize)); -+ -+ u32 dwOffsetToRead = (u32) (qwOffset / ((u64) 512)); -+ u32 dwSectorCountToRead = (u32) dwFileRecordSize / 512; -+ -+ if (!QP_FSWrap:: -+ read_sector(part, dwOffsetToRead, dwSectorCountToRead, -+ (char *) cFileRecord)) { -+ //printf("readVolumeLabel(): failed in readData()\n"); -+ return QString::null; -+ } -+ // -------- decode the MFT File record -+ nOffsetSequenceAttribute = NTFS_GETU16(cFileRecord + 0x14); -+ cData = cFileRecord + nOffsetSequenceAttribute; -+ -+ do { -+ // szData points to the beginning of an attribute -+ dwAttribType = NTFS_GETU32(cData); -+ dwAttribLen = NTFS_GETU32(cData + 4); -+ bAttribResident = (NTFS_GETU8(cData + 8) == 0); -+ -+ if (dwAttribType == 0x60) // "volume_name" -+ { -+ if (bAttribResident == false) { -+ //printf("readVolumeLabel(): failed: $volume_name attribute is not resident\n"); -+ return QString::null; -+ } -+ -+ nAttrSize = NTFS_GETU16(cData + 0x10); -+ cDataResident = cData + NTFS_GETU16(cData + 0x14); -+ -+ for (i = 0; i < (DWORD) (nAttrSize / 2); i++) -+ label[i] = cDataResident[2 * i]; -+ } -+ /*if(dwAttribType == 0x70) // "volume_information" -+ { -+ int nNtfsVersion = 0; -+ if (bAttribResident == true) -+ { -+ nAttrSize = NTFS_GETU16(cData+0x10); -+ cDataResident = cData+NTFS_GETU16(cData+0x14); -+ nNtfsVersion = (((BYTE) cDataResident[8]) << 8) | ((BYTE) cDataResident[9]); -+ printf("readVolumeLabel(): version is %d.%d\n", cDataResident[8], cDataResident[9]); -+ } -+ } */ -+ -+ cData += dwAttribLen; -+ } while (dwAttribType != (DWORD) - 1); // attribute list ends with type -1 - -- return QString(label); -+ return QString(label); - } -diff -Naur qtparted-0.4.5.orig/src/qp_fswrap.h qtparted-0.4.5/src/qp_fswrap.h ---- qtparted-0.4.5.orig/src/qp_fswrap.h 2005-07-06 23:29:54.000000000 +0200 -+++ qtparted-0.4.5/src/qp_fswrap.h 2006-01-16 01:43:30.000000000 +0100 -@@ -161,7 +161,7 @@ - protected: - bool qpMount(QString device); - bool qpUMount(QString device); -- bool fs_open(QString cmdline); -+ bool fs_open(QString cmdline, bool localized=false); - char *fs_getline(); - int fs_close(); - QString _message; -diff -Naur qtparted-0.4.5.orig/src/qp_partition.cpp qtparted-0.4.5/src/qp_partition.cpp ---- qtparted-0.4.5.orig/src/qp_partition.cpp 2003-08-27 18:13:22.000000000 +0200 -+++ qtparted-0.4.5/src/qp_partition.cpp 2005-10-15 13:13:01.000000000 +0200 -@@ -22,8 +22,7 @@ - #include "qp_partition.h" - #include "qp_options.h" - --QP_Partition::QP_Partition(QP_PartInfo *pinfo, QWidget *parent, const char *name, WFlags f) -- :QP_PartWidget(pinfo, parent, name, f) { -+QP_Partition::QP_Partition(QP_PartInfo *pinfo, QWidget *parent, const char *name, WFlags f):QP_PartWidget(pinfo, parent, name, f) { - } - - QP_Partition::~QP_Partition() { -diff -Naur qtparted-0.4.5.orig/src/qp_partition.h qtparted-0.4.5/src/qp_partition.h ---- qtparted-0.4.5.orig/src/qp_partition.h 2003-08-27 18:13:19.000000000 +0200 -+++ qtparted-0.4.5/src/qp_partition.h 2005-10-15 13:13:01.000000000 +0200 -@@ -36,8 +36,8 @@ - Q_OBJECT - - public: -- QP_Partition(QP_PartInfo *, QWidget *parent=0, const char *name=0, WFlags f = 0); -- ~QP_Partition(); -+ QP_Partition(QP_PartInfo *, QWidget *parent=0, const char *name=0, WFlags f = 0); -+ ~QP_Partition(); - }; - - #endif -diff -Naur qtparted-0.4.5.orig/src/qp_partlist.cpp qtparted-0.4.5/src/qp_partlist.cpp ---- qtparted-0.4.5.orig/src/qp_partlist.cpp 2003-08-27 18:13:19.000000000 +0200 -+++ qtparted-0.4.5/src/qp_partlist.cpp 2005-10-15 12:58:31.000000000 +0200 -@@ -23,29 +23,29 @@ - #include "qp_options.h" - - QP_PartList::QP_PartList(QWidget *parent, const char *name, WFlags f) -- :QWidget(parent, name, f) { -+ :QWidget(parent, name, f) { - } - - QP_PartList::~QP_PartList() { - } - - QP_PartInfo *QP_PartList::selPartInfo() { -- return _selPartInfo; -+ return _selPartInfo; - } - - void QP_PartList::setselPartInfo(QP_PartInfo *partinfo) { -- _selPartInfo = partinfo; -+ _selPartInfo = partinfo; - } - - void QP_PartList::clear() { - } - - QP_Device *QP_PartList::device() { -- return _device; -+ return _device; - } - - void QP_PartList::setDevice(QP_Device *device) { -- _device = device; -+ _device = device; - } - - void QP_PartList::addPrimary(QP_PartInfo *) { -@@ -58,9 +58,9 @@ - } - - float QP_PartList::mb_hdsize() { -- return _mb_hdsize; -+ return _mb_hdsize; - } - - void QP_PartList::set_mb_hdsize(float mb_hdsize) { -- _mb_hdsize = mb_hdsize; -+ _mb_hdsize = mb_hdsize; - } -diff -Naur qtparted-0.4.5.orig/src/qp_partlist.h qtparted-0.4.5/src/qp_partlist.h ---- qtparted-0.4.5.orig/src/qp_partlist.h 2003-08-27 18:13:22.000000000 +0200 -+++ qtparted-0.4.5/src/qp_partlist.h 2005-10-15 12:58:31.000000000 +0200 -@@ -34,33 +34,32 @@ - #include "qp_libparted.h" - - class QP_PartList : public QWidget { --Q_OBJECT -- -+ Q_OBJECT - public: -- QP_PartList(QWidget *parent=0, const char *name=0, WFlags f = 0); -- ~QP_PartList(); -- QP_PartInfo *selPartInfo(); /*---return selected partition ---*/ -- void setselPartInfo(QP_PartInfo *); /*---change the selected partition ---*/ -- void clear(); /*---clear the chart ---*/ -- QP_Device *device(); /*---return the device ---*/ -- void setDevice(QP_Device *); /*---set the Device ---*/ -- void addPrimary(QP_PartInfo *); /*---add a Primary or Extended partition ---*/ -- void addLogical(QP_PartInfo *); /*---add a Logical partition ---*/ -- void draw(); /*---repaint the widget ---*/ -- float mb_hdsize(); /*---return the size of the hardisk ---*/ -- void set_mb_hdsize(float); /*---set the size of the hardisk ---*/ -+ QP_PartList(QWidget *parent=0, const char *name=0, WFlags f = 0); -+ ~QP_PartList(); -+ QP_PartInfo *selPartInfo(); /*---return selected partition ---*/ -+ void setselPartInfo(QP_PartInfo *); /*---change the selected partition ---*/ -+ void clear(); /*---clear the chart ---*/ -+ QP_Device *device(); /*---return the device ---*/ -+ void setDevice(QP_Device *); /*---set the Device ---*/ -+ void addPrimary(QP_PartInfo *); /*---add a Primary or Extended partition ---*/ -+ void addLogical(QP_PartInfo *); /*---add a Logical partition ---*/ -+ void draw(); /*---repaint the widget ---*/ -+ float mb_hdsize(); /*---return the size of the hardisk ---*/ -+ void set_mb_hdsize(float); /*---set the size of the hardisk ---*/ - - private: -- float _mb_hdsize; /*---size of the harddisk in megabyte ---*/ -- QP_Device *_device; /*---the device ---*/ -+ float _mb_hdsize; /*---size of the harddisk in megabyte ---*/ -+ QP_Device *_device; /*---the device ---*/ - - protected: -- QP_PartInfo *_selPartInfo; /*---partition selected ---*/ -+ QP_PartInfo *_selPartInfo; /*---partition selected ---*/ - - signals: -- void sigSelectPart(QP_PartInfo *); /*---emitted when you change the selection ---*/ -- void sigDevicePopup(QPoint); /*---emitted when you want to popup (device)---*/ -- void sigPopup(QPoint); /*---emitted when you want to pop (partition)--*/ -+ void sigSelectPart(QP_PartInfo *); /*---emitted when you change the selection ---*/ -+ void sigDevicePopup(QPoint); /*---emitted when you want to popup (device)---*/ -+ void sigPopup(QPoint); /*---emitted when you want to pop (partition)--*/ - }; - - #endif -diff -Naur qtparted-0.4.5.orig/src/qp_spinbox.cpp qtparted-0.4.5/src/qp_spinbox.cpp ---- qtparted-0.4.5.orig/src/qp_spinbox.cpp 2003-08-27 18:13:19.000000000 +0200 -+++ qtparted-0.4.5/src/qp_spinbox.cpp 2005-10-15 13:13:01.000000000 +0200 -@@ -25,24 +25,22 @@ - #include "qp_options.h" - - QP_SpinBox::QP_SpinBox(QWidget *parent, const char *name) -- :QSpinBox (parent, name) { -- /*---initialization of the default value---*/ -- _floatminval = 0; -- _floatmaxval = 0; -- _pedminval = 0; -- _pedmaxval = 0; -- _pedvalue = 0; -- step = 1; -- _floatvalue = 0; -- _format = 0; -- _update = true; -- -- /*---format of the displayed string (ie: 999.99)---*/ -- format = "%3.2f"; -- setValue((float)0); -- setSteps(10, 10); -- val = new QDoubleValidator(_floatminval, _floatmaxval, 2, this); -- setValidator (val); -+ :QSpinBox (parent, name) -+ ,_floatminval(0) -+ ,_floatmaxval(0) -+ ,_pedminval(0) -+ ,_pedmaxval(0) -+ ,step(1) -+ ,_floatvalue(0) -+ ,_format(0) -+ ,_update(true) -+{ -+ /*---format of the displayed string (ie: 999.99)---*/ -+ format = "%3.2f"; -+ setValue((float)0); -+ setSteps(10, 10); -+ val = new QDoubleValidator(_floatminval, _floatmaxval, 2, this); -+ setValidator (val); - } - - -@@ -51,189 +49,204 @@ - - - void QP_SpinBox::setFormatString (const char *fmt) { -- format = fmt; -+ format = fmt; - } - - - /*---change between mbyte and gbyte---*/ - void QP_SpinBox::setFormat(int format) { -- _format = format; -- float f_minvalue = 0; -- float f_maxvalue = 0; -- float f_value = 0; -- -- if (_format == 0) { f_minvalue = float(_pedminval * 1.0 / MBYTE_SECTORS); -- f_maxvalue = float(_pedmaxval * 1.0 / MBYTE_SECTORS); -- f_value = float(_pedvalue * 1.0 / MBYTE_SECTORS); } else -- if (_format == 1) { f_minvalue = float(_pedminval * 1.0 / GBYTE_SECTORS); -- f_maxvalue = float(_pedmaxval * 1.0 / GBYTE_SECTORS); -- f_value = float(_pedvalue * 1.0 / GBYTE_SECTORS); } -- -- /*---don't update internal ped values!---*/ -- _update = false; -- setRange(f_minvalue, f_maxvalue); -- setValue(f_value); -- _update = true; -+ _format = format; -+ float f_minvalue = 0; -+ float f_maxvalue = 0; -+ float f_value = 0; -+ -+ if (_format == 0) { -+ f_minvalue = float(_pedminval * 1.0 / MBYTE_SECTORS); -+ f_maxvalue = float(_pedmaxval * 1.0 / MBYTE_SECTORS); -+ f_value = float(_pedvalue * 1.0 / MBYTE_SECTORS); -+ } else if (_format == 1) { -+ f_minvalue = float(_pedminval * 1.0 / GBYTE_SECTORS); -+ f_maxvalue = float(_pedmaxval * 1.0 / GBYTE_SECTORS); -+ f_value = float(_pedvalue * 1.0 / GBYTE_SECTORS); -+ } -+ -+ /*---don't update internal ped values!---*/ -+ _update = false; -+ setRange(f_minvalue, f_maxvalue); -+ setValue(f_value); -+ _update = true; - } - -- - void QP_SpinBox::setValue(float value) { -- char buf[20]; -- if (_floatminval <= value && value <= _floatmaxval) { -- sprintf (buf, (const char *) format, value); -- _floatvalue = value; -- QSpinBox::setValue(int(value * 100.0)); -- } -+ char buf[20]; -+ if (_floatminval <= value && value <= _floatmaxval) { -+ sprintf (buf, (const char *) format, value); -+ _floatvalue = value; -+ QSpinBox::setValue(int(value * 100.0)); -+ } - } - - - void QP_SpinBox::setValue(PedSector value) { -- if (_pedminval <= value && value <= _pedmaxval) { -- float f_value = 0; -- -- if (_format == 0) f_value = float(value * 1.0 / MBYTE_SECTORS); else -- if (_format == 1) f_value = float(value * 1.0 / GBYTE_SECTORS); -- -- _pedvalue = value; -+ if (_pedminval <= value && value <= _pedmaxval) { -+ float f_value = 0; - -- /*---don't update internal ped values!---*/ -- _update = false; -- setValue(f_value); -- _update = true; -- } -+ if (_format == 0) -+ f_value = float(value * 1.0 / MBYTE_SECTORS); else -+ if (_format == 1) -+ f_value = float(value * 1.0 / GBYTE_SECTORS); -+ -+ _pedvalue = value; -+ -+ /*---don't update internal ped values!---*/ -+ _update = false; -+ setValue(f_value); -+ _update = true; -+ } - } - - - void QP_SpinBox::setMaxValue(PedSector maxVal) { -- float f_maxvalue = 0; -+ float f_maxvalue = 0; - -- _pedmaxval = maxVal; -+ _pedmaxval = maxVal; - -- if (_format == 0) {f_maxvalue = float(maxVal * 1.0 / MBYTE_SECTORS);} else -- if (_format == 1) {f_maxvalue = float(maxVal * 1.0 / GBYTE_SECTORS);} -+ if (_format == 0) -+ f_maxvalue = float(maxVal * 1.0 / MBYTE_SECTORS); -+ else if (_format == 1) -+ f_maxvalue = float(maxVal * 1.0 / GBYTE_SECTORS); - -- setMaxValue(f_maxvalue); -+ setMaxValue(f_maxvalue); - } - - - void QP_SpinBox::setMinValue(PedSector minVal) { -- float f_minvalue = 0; -+ float f_minvalue = 0; - -- _pedminval = minVal; -+ _pedminval = minVal; - -- if (_format == 0) {f_minvalue = float(minVal * 1.0 / MBYTE_SECTORS);} else -- if (_format == 1) {f_minvalue = float(minVal * 1.0 / GBYTE_SECTORS);} -+ if (_format == 0) -+ f_minvalue = float(minVal * 1.0 / MBYTE_SECTORS); -+ else if (_format == 1) -+ f_minvalue = float(minVal * 1.0 / GBYTE_SECTORS); - -- setMinValue(f_minvalue); -+ setMinValue(f_minvalue); - } - - - void QP_SpinBox::setStep (float s) { -- step = s; -- setSteps ((int)(step * 10.0), (int)(step * 10.0)); -+ step = s; -+ setSteps ((int)(step * 10.0), (int)(step * 10.0)); - } - -- - float QP_SpinBox::getStep() const { -- return step; -+ return step; - } - -- - void QP_SpinBox::setRange(float minVal, float maxVal) { -- if (minVal <= maxVal) { -- _floatminval = minVal; -- _floatmaxval = maxVal; -- QRangeControl::setRange(int(minVal * 100.0), int(maxVal * 100.0)); -- val->setRange(minVal, maxVal, 2); -- } -+ if (minVal <= maxVal) { -+ _floatminval = minVal; -+ _floatmaxval = maxVal; -+ QRangeControl::setRange(int(minVal * 100.0), int(maxVal * 100.0)); -+ val->setRange(minVal, maxVal, 2); -+ } - } - - - void QP_SpinBox::setRange(PedSector minVal, PedSector maxVal) { -- float f_minvalue = 0; -- float f_maxvalue = 0; -+ float f_minvalue = 0; -+ float f_maxvalue = 0; - -- _pedminval = minVal; -- _pedmaxval = maxVal; -+ _pedminval = minVal; -+ _pedmaxval = maxVal; - -- if (_format == 0) { f_minvalue = float(minVal * 1.0 / MBYTE_SECTORS); -- f_maxvalue = float(maxVal * 1.0 / MBYTE_SECTORS); } else -- if (_format == 1) { f_minvalue = float(minVal * 1.0 / GBYTE_SECTORS); -- f_maxvalue = float(maxVal * 1.0 / GBYTE_SECTORS); } -+ if (_format == 0) { f_minvalue = float(minVal * 1.0 / MBYTE_SECTORS); -+ f_maxvalue = float(maxVal * 1.0 / MBYTE_SECTORS); } else -+ if (_format == 1) { f_minvalue = float(minVal * 1.0 / GBYTE_SECTORS); -+ f_maxvalue = float(maxVal * 1.0 / GBYTE_SECTORS); } - -- setRange(f_minvalue, f_maxvalue); -+ setRange(f_minvalue, f_maxvalue); - } - - - void QP_SpinBox::getRange(float &minVal, float &maxVal) { -- minVal = _floatminval; -- maxVal = _floatmaxval; -+ minVal = _floatminval; -+ maxVal = _floatmaxval; - } - - PedSector QP_SpinBox::pedValue() { -- return _pedvalue; -+ return _pedvalue; - } - - PedSector QP_SpinBox::pedMaxValue() { -- return _pedmaxval; -+ return _pedmaxval; - } - - void QP_SpinBox::stepUp() { -- QSpinBox::stepUp(); -+ QSpinBox::stepUp(); - -- int diff = int(_floatmaxval * 100.0) - int(_floatvalue * 100.0); -- if (diff <= 1) _pedvalue = _pedmaxval; -+ int diff = int(_floatmaxval * 100.0) - int(_floatvalue * 100.0); -+ if (diff <= 1) _pedvalue = _pedmaxval; - } - - void QP_SpinBox::stepDown() { -- QSpinBox::stepDown(); -+ QSpinBox::stepDown(); - -- int diff = int(_floatvalue * 100.0) - int(_floatminval * 100.0); -- if (diff <= 1) _pedvalue = _pedminval; -+ int diff = int(_floatvalue * 100.0) - int(_floatminval * 100.0); -+ if (diff <= 1) _pedvalue = _pedminval; - } - - void QP_SpinBox::setMaxValue(float maxvalue) { -- _floatmaxval = maxvalue; -- QSpinBox::setMaxValue(int(maxvalue * 100.0)); -+ _floatmaxval = maxvalue; -+ QSpinBox::setMaxValue(int(maxvalue * 100.0)); - } - - void QP_SpinBox::setMinValue(float minvalue) { -- _floatminval = minvalue; -- QSpinBox::setMinValue(int(minvalue * 100.0)); -+ _floatminval = minvalue; -+ QSpinBox::setMinValue(int(minvalue * 100.0)); - } - - void QP_SpinBox::valueChange() { -- bool rc; -- updateDisplay(); -- mapTextToValue(&rc); -- -- /*---don't update internal ped values!---*/ -- if (_update) -- if (_floatvalue == _floatminval) _pedvalue = _pedminval; else -- if (_floatvalue == _floatmaxval) _pedvalue = _pedmaxval; else { -- if (_format == 0) _pedvalue = PedSector(_floatvalue * MBYTE_SECTORS); else -- if (_format == 1) _pedvalue = PedSector(_floatvalue * GBYTE_SECTORS); -- } -- -- /*---ped value should be beetween min and max---*/ -- if (_pedvalue < _pedminval) _pedvalue = _pedminval; -- if (_pedvalue > _pedmaxval) _pedvalue = _pedmaxval; -+ bool rc; -+ updateDisplay(); -+ mapTextToValue(&rc); -+ -+ /*---don't update internal ped values!---*/ -+ if (_update) { -+ if (_floatvalue == _floatminval) -+ _pedvalue = _pedminval; -+ else if (_floatvalue == _floatmaxval) -+ _pedvalue = _pedmaxval; -+ else { -+ if (_format == 0) -+ _pedvalue = PedSector(_floatvalue * MBYTE_SECTORS); -+ else if (_format == 1) -+ _pedvalue = PedSector(_floatvalue * GBYTE_SECTORS); -+ } -+ } -+ -+ /*---ped value should be beetween min and max---*/ -+ if (_pedvalue < _pedminval) -+ _pedvalue = _pedminval; -+ -+ if (_pedvalue > _pedmaxval) -+ _pedvalue = _pedmaxval; - -- emit valueChanged(_pedvalue); -+ emit valueChanged(_pedvalue); - } - - - int QP_SpinBox::mapTextToValue(bool *ok) { -- const char *txt = text(); -- _floatvalue = atof(txt); -- *ok = true; -- return int(_floatvalue * 100.0); -+ const char *txt = text(); -+ _floatvalue = atof(txt); -+ *ok = true; -+ return int(_floatvalue * 100.0); - } - - - QString QP_SpinBox::mapValueToText(int v) { -- float f = float(v) / 100.0; -- QString buf; -- buf.sprintf((const char *)format, f); -- return buf; -+ float f = float(v) / 100.0; -+ QString buf; -+ buf.sprintf((const char *)format, f); -+ return buf; - } -diff -Naur qtparted-0.4.5.orig/src/qp_spinbox.h qtparted-0.4.5/src/qp_spinbox.h ---- qtparted-0.4.5.orig/src/qp_spinbox.h 2003-08-27 18:13:18.000000000 +0200 -+++ qtparted-0.4.5/src/qp_spinbox.h 2005-10-15 13:13:01.000000000 +0200 -@@ -42,51 +42,50 @@ - typedef long long PedSector; - - class QP_SpinBox : public QSpinBox { -- Q_OBJECT -+ Q_OBJECT - public: -- QP_SpinBox(QWidget *parent = 0L, const char *name = 0L); -- ~QP_SpinBox(); -+ QP_SpinBox(QWidget *parent = 0L, const char *name = 0L); -+ ~QP_SpinBox(); - -- void setFormatString(const char *fmt); -+ void setFormatString(const char *fmt); - -- void setValue(PedSector); -- void setMaxValue(PedSector); -- void setMinValue(PedSector); -- -- void setStep(float step); -- float getStep() const; -- -- void setRange(PedSector minVal, PedSector maxVal); -- void getRange(float &minVal, float &maxVal); -- PedSector pedValue(); -- PedSector pedMaxValue(); -+ void setValue(PedSector); -+ void setMaxValue(PedSector); -+ void setMinValue(PedSector); -+ -+ void setStep(float step); -+ float getStep() const; -+ -+ void setRange(PedSector minVal, PedSector maxVal); -+ void getRange(float &minVal, float &maxVal); -+ PedSector pedValue(); -+ PedSector pedMaxValue(); - - signals: -- void valueChanged(PedSector); -+ void valueChanged(PedSector); - - public slots: -- virtual void stepUp(); -- virtual void stepDown(); -- void setMaxValue(float); -- void setMinValue(float); -- void setFormat(int); -+ virtual void stepUp(); -+ virtual void stepDown(); -+ void setMaxValue(float); -+ void setMinValue(float); -+ void setFormat(int); - - protected: -- int mapTextToValue(bool *ok); -- QString mapValueToText(int v); -- void valueChange(); -+ int mapTextToValue(bool *ok); -+ QString mapValueToText(int v); -+ void valueChange(); - - private: -- void setRange(float minVal, float maxVal); -- void setValue(float value); -- float step, _floatminval, _floatmaxval, _floatvalue; -- QString format; -- QDoubleValidator *val; -- PedSector _pedminval; -- PedSector _pedmaxval; -- PedSector _pedvalue; -- int _format; -- bool _update; -+ void setRange(float minVal, float maxVal); -+ void setValue(float value); -+ float step, _floatminval, _floatmaxval, _floatvalue; -+ QString format; -+ QDoubleValidator *val; -+ PedSector _pedminval; -+ PedSector _pedmaxval; -+ PedSector _pedvalue; -+ int _format; -+ bool _update; - }; -- - #endif -diff -Naur qtparted-0.4.5.orig/src/qp_window.cpp qtparted-0.4.5/src/qp_window.cpp ---- qtparted-0.4.5.orig/src/qp_window.cpp 2005-08-10 13:05:37.000000000 +0200 -+++ qtparted-0.4.5/src/qp_window.cpp 2005-10-15 12:44:39.000000000 +0200 -@@ -93,14 +93,14 @@ - /*---the window is so designed: - * - * .------------------------------. -- * |QSplitter | | -- * | | | -+ * |QSplitter | | -+ * | | | - * | +----------+ | +-----------+ | - * | |NavView | | |DiskView | | -- * | | | | | | | -- * | | | | | | | -+ * | | | | | | | -+ * | | | | | | | - * | +----------+ | +-----------+ | -- * | | | -+ * | | | - * `------------------------------' - */ - -@@ -115,16 +115,16 @@ - navSplit->setResizeMode(navview, QSplitter::KeepSize); - /*---connect the selected signal (when user, for example, select /dev/hda)---*/ - connect(navview, SIGNAL(sigSelectDevice(QP_Device *)), -- this, SLOT(slotSelectDevice(QP_Device *))); -+ this, SLOT(slotSelectDevice(QP_Device *))); - - /*---add the DiskView widget---*/ - diskview = new QP_DiskView(navSplit); - /*---emitted when you select a partition---*/ - connect(diskview, SIGNAL(sigSelectPart(QP_PartInfo *)), -- this, SLOT(slotSelectPart(QP_PartInfo *))); -+ this, SLOT(slotSelectPart(QP_PartInfo *))); - /*---emit when the user want to popup the context menu---*/ - connect(diskview, SIGNAL(sigPopup(QPoint)), -- this, SLOT(slotPopup(QPoint))); -+ this, SLOT(slotPopup(QPoint))); - connect(diskview, SIGNAL(sigDevicePopup(QPoint)), - this, SLOT(slotDevicePopup(QPoint))); - /*---connect the sigTimer used for dlgprogress during "update progressbar"---*/ -diff -Naur qtparted-0.4.5.orig/src/qp_window.h qtparted-0.4.5/src/qp_window.h ---- qtparted-0.4.5.orig/src/qp_window.h 2004-04-12 12:30:13.000000000 +0200 -+++ qtparted-0.4.5/src/qp_window.h 2005-10-15 12:44:39.000000000 +0200 -@@ -49,89 +49,87 @@ - - - class QP_MainWindow : public QMainWindow { --Q_OBJECT -- -+ Q_OBJECT - public: -- QP_MainWindow(QP_Settings *, QWidget *parent, const char *name); -- ~QP_MainWindow(); -- void init(); /*---init the mainwindow ---*/ -- void refreshDiskView(); -- void setpopupmenu(QPopupMenu *); -- QPopupMenu *popupmenu(); -- QPopupMenu *mnuDisks; -- QPopupMenu *mnuDevice; -- QAction *actUndo; -- QAction *actCommit; -- QAction *actQuit; -- QAction *actProperty; -- QAction *actCreate; -- QAction *actFormat; -- QAction *actResize; -- QAction *actMove; -- QAction *actDelete; -- QAction *actConfig; -- QAction *actWhatThis; -- QAction *actAbout; -- QAction *actAboutQT; -- QAction *actNavProperty; -- QAction *actNavPartTable; -- QP_DiskView *diskview; -- QP_dlgCreate *dlgcreate; /*---the create dialog ---*/ -- QP_dlgFormat *dlgformat; /*---the format dialog ---*/ -- QP_dlgResize *dlgresize; /*---the resize dialog ---*/ -- QP_dlgProgress *dlgprogress; /*---the progress dialog ---*/ -- QP_dlgConfig *dlgconfig; /*---the configuration dialog ---*/ -- QP_dlgDevProperty *dlgdevprop; /*---the device property dialog---*/ -- QP_NavView *navview; /*---the disk navigation widget---*/ -- QP_Settings *settings; -- -+ QP_MainWindow(QP_Settings *, QWidget *parent, const char *name); -+ ~QP_MainWindow(); -+ void init(); /*---init the mainwindow ---*/ -+ void refreshDiskView(); -+ void setpopupmenu(QPopupMenu *); - - protected: -- void createAction(); -- void addMenuBar(); -- void addStatusBar(); -- void addToolBar(); -- void buildDisksMenu(); -- void loadSettings(); -- void ShowMoveResizeDialog(QTParted::actType moveresize); -- void InitMenu(); -- void InitProgressDialog(); -- void DoneProgressDialog(); -+ QPopupMenu *popupmenu(); -+ QPopupMenu *mnuDisks; -+ QPopupMenu *mnuDevice; -+ QAction *actUndo; -+ QAction *actCommit; -+ QAction *actQuit; -+ QAction *actProperty; -+ QAction *actCreate; -+ QAction *actFormat; -+ QAction *actResize; -+ QAction *actMove; -+ QAction *actDelete; -+ QAction *actConfig; -+ QAction *actWhatThis; -+ QAction *actAbout; -+ QAction *actAboutQT; -+ QAction *actNavProperty; -+ QAction *actNavPartTable; -+ QP_DiskView *diskview; -+ QP_dlgCreate *dlgcreate; /*---the create dialog ---*/ -+ QP_dlgFormat *dlgformat; /*---the format dialog ---*/ -+ QP_dlgResize *dlgresize; /*---the resize dialog ---*/ -+ QP_dlgProgress *dlgprogress; /*---the progress dialog ---*/ -+ QP_dlgConfig *dlgconfig; /*---the configuration dialog ---*/ -+ QP_dlgDevProperty *dlgdevprop; /*---the device property dialog---*/ -+ QP_NavView *navview; /*---the disk navigation widget---*/ -+ QP_Settings *settings; - -+protected: -+ void createAction(); -+ void addMenuBar(); -+ void addStatusBar(); -+ void addToolBar(); -+ void buildDisksMenu(); -+ void loadSettings(); -+ void ShowMoveResizeDialog(QTParted::actType moveresize); -+ void InitMenu(); -+ void InitProgressDialog(); -+ void DoneProgressDialog(); - - private: -- QVBox *central; -- QPopupMenu* _popupmenu; -- QPopupMenu* _navpopupmenu; -- QPopupMenu *mnuOperations; -- int mnuSetActiveID; -- int mnuSetHiddenID; -+ QVBox *central; -+ QPopupMenu* _popupmenu; -+ QPopupMenu* _navpopupmenu; -+ QPopupMenu *mnuOperations; -+ int mnuSetActiveID; -+ int mnuSetHiddenID; - - protected slots: -- void slotCreate(); -- void slotFormat(); -- void slotResize(); -- void slotMove(); -- void slotDelete(); -- void slotConfig(); -- void slotProperty(); -- void slotWhatsThis(); -- void slotAbout(); -- void slotAboutQT(); -- void slotNavProperty(); -- void slotNavPartTable(); -- void slotSelectPart(QP_PartInfo *); -- void slotDevicePopup(QPoint pos); -- void slotPopup(QPoint pos); -- void slotSelectDevice(QP_Device *); -- void slotSetActive(); -- void slotSetHidden(); -- void slotUndo(); -- void slotCommit(); -- void slotDiskChanged(); -+ void slotCreate(); -+ void slotFormat(); -+ void slotResize(); -+ void slotMove(); -+ void slotDelete(); -+ void slotConfig(); -+ void slotProperty(); -+ void slotWhatsThis(); -+ void slotAbout(); -+ void slotAboutQT(); -+ void slotNavProperty(); -+ void slotNavPartTable(); -+ void slotSelectPart(QP_PartInfo *); -+ void slotDevicePopup(QPoint pos); -+ void slotPopup(QPoint pos); -+ void slotSelectDevice(QP_Device *); -+ void slotSetActive(); -+ void slotSetHidden(); -+ void slotUndo(); -+ void slotCommit(); -+ void slotDiskChanged(); - - signals: -- void sigSplashInfo(const QString &); -+ void sigSplashInfo(const QString &); - }; -- - #endif -diff -Naur qtparted-0.4.5.orig/src/runprog.cpp qtparted-0.4.5/src/runprog.cpp ---- qtparted-0.4.5.orig/src/runprog.cpp 2003-08-27 18:13:20.000000000 +0200 -+++ qtparted-0.4.5/src/runprog.cpp 1970-01-01 01:00:00.000000000 +0100 -@@ -1,160 +0,0 @@ --/*************************************************************************** -- runprog.cpp - description -- ------------------- -- begin : Wed Sep 4 19:21:54 UTC 2002 -- copyright : (C) 2002 by Francois Dupoux -- email : fdupoux@partimage.org -- ***************************************************************************/ -- --/*************************************************************************** -- * * -- * This program is free software; you can redistribute it and/or modify * -- * it under the terms of the GNU General Public License as published by * -- * the Free Software Foundation; either version 2 of the License, or * -- * (at your option) any later version. * -- * * -- ***************************************************************************/ -- --#include --#include --#include --#include --#include --#include --#include --#include --#include --#include --#include -- --#include "runprog.h" --#include "qp_options.h" -- --//------------------------------------------------ --/*int doesFileExists2(char *szPath) --{ --#ifdef HAVE_FSTAT64 -- struct stat64 fStat; --#else -- struct stat fStat; --#endif -- int nFd; -- int nRes; -- -- errno = 0; --#ifdef HAVE_OPEN64 -- nFd = open64(szPath, O_RDONLY | O_NOFOLLOW | O_LARGEFILE); --#else -- nFd = open(szPath, O_RDONLY | O_NOFOLLOW | O_LARGEFILE); --#endif -- //fStream = fopen(szPath, "rb"); -- //if (!fStream) // error -- if (nFd == -1) -- { -- return (errno != ENOENT); -- } -- else // success -- { --#ifdef HAVE_FSTAT64 -- nRes = fstat64(nFd, &fStat); --#else -- nRes = fstat(nFd, &fStat); --#endif -- -- if (nRes == -1) -- return true; // for large files -- //fclose(fStream); -- ::close(nFd); -- return (S_ISREG(fStat.st_mode)); -- } --} -- --//------------------------------------------------ --int locateProgram(char *szResultPath, int nPathLen, char *szBin) --{ -- long i; -- char *szLocations[] = {"/sbin", "/usr/sbin", "/usr/local/sbin", "/bin", "/usr/bin", "/usr/local/bin", ""}; -- char szTemp[2048]; -- -- for (i=0; *(szLocations[i]); i++) -- { -- snprintf(szTemp, sizeof(szTemp), "%s/%s", szLocations[i], szBin); -- //pi_printf ("--> pgm=%s/%s\n", szLocations[i], szBin); -- if (doesFileExists2(szTemp)) -- { -- snprintf(szResultPath, nPathLen, "%s/%s", szLocations[i], szBin); -- return 0; // okay -- } -- } -- -- return -1; // error --} --*/ -- --//------------------------------------------------ --int execProgram(char *szProgram, char *argv[], char *szOutput, int nMaxOutput) --{ -- int nFd[2]; -- int nRes; -- pid_t pid; -- -- // init -- memset(szOutput, 0, nMaxOutput); -- if (pipe(nFd) < 0) -- return -1; -- -- pid = fork(); -- switch (pid) -- { -- case -1: // error -- perror ("fork() in execProgram"); -- return -1; -- -- case 0: // child -- dup2(nFd[1], STDOUT_FILENO); // stdout --> parent process -- dup2(nFd[1], STDERR_FILENO); // stdout --> parent process -- nRes = execve(szProgram, argv, NULL); -- exit(0); -- break; -- -- default: // parent -- read(nFd[0], szOutput, nMaxOutput); -- //pi_printf ("\n\n\n[[[[[[[%s]]]]]]]\n\n\n", szString); -- waitpid(pid, NULL, 0); -- sleep(1); -- break; -- }; -- -- return 0; --} -- --//------------------------------------------------ --//---------------------- USAGE ------------------- --//------------------------------------------------ --/* -- nRes = locateProgram(szFullPath, sizeof(szFullPath), g_fs[nFs].szCmdMkfsName); -- if (nRes == -1) -- return CResult("Can't find program %s which is required
    to format the partition.
    " -- "Please, install %s.
    You can search on http://www.freshmeat.net.", -- g_fs[nFs].szCmdMkfsName, g_fs[nFs].szFsTools); -- -- if (szLabel && *szLabel) // not empty -- snprintf (szFullLabel, sizeof(szFullLabel), "%s", szLabel); -- else -- snprintf (szFullLabel, sizeof(szFullLabel), "none"); -- -- argv[0] = g_fs[nFs].szCmdMkfsOpts; -- argv[1] = g_fs[nFs].szCmdMkfsLabelOpts; -- argv[2] = szFullLabel; -- argv[3] = g_fs[nFs].szCmdMkfsOpts; -- argv[4] = szDevice; -- argv[5] = NULL; -- -- // pi_printf debug -- pi_printf ("FORMATTING: path=[%s]\n", szFullPath); -- for (int j=0; j < 4; j++) -- pi_printf ("argv[%d]=%s\n", j, argv[j]); -- -- execProgram(szFullPath, argv, szOutput, sizeof(szOutput)); --*/ -- -diff -Naur qtparted-0.4.5.orig/src/runprog.h qtparted-0.4.5/src/runprog.h ---- qtparted-0.4.5.orig/src/runprog.h 2003-08-27 18:13:21.000000000 +0200 -+++ qtparted-0.4.5/src/runprog.h 1970-01-01 01:00:00.000000000 +0100 -@@ -1,20 +0,0 @@ --/*************************************************************************** -- runprog.h - description -- ------------------- -- begin : Wed Sep 4 19:21:54 UTC 2002 -- copyright : (C) 2002 by Francois Dupoux -- email : fdupoux@partimage.org -- ***************************************************************************/ -- --/*************************************************************************** -- * * -- * This program is free software; you can redistribute it and/or modify * -- * it under the terms of the GNU General Public License as published by * -- * the Free Software Foundation; either version 2 of the License, or * -- * (at your option) any later version. * -- * * -- ***************************************************************************/ -- --//int doesFileExists2(char *szPath); --//int locateProgram(char *szResultPath, int nPathLen, char *szBin); --int execProgram(char *szProgram, char *argv[], char *szOutput, int nMaxOutput); -diff -Naur qtparted-0.4.5.orig/src/statistics.cpp qtparted-0.4.5/src/statistics.cpp ---- qtparted-0.4.5.orig/src/statistics.cpp 2005-08-10 13:05:37.000000000 +0200 -+++ qtparted-0.4.5/src/statistics.cpp 2005-10-15 12:35:30.000000000 +0200 -@@ -1,16 +1,16 @@ - /*************************************************************************** -- statistics.cpp - description -- ------------------- -- begin : Wed Sep 4 19:21:54 UTC 2002 -- copyright : (C) 2002 by Francois Dupoux -- email : fdupoux@partimage.org -+ statistics.cpp - description -+ ------------------- -+ begin : Wed Sep 4 19:21:54 UTC 2002 -+ copyright : (C) 2002 by Francois Dupoux -+ email : fdupoux@partimage.org - ***************************************************************************/ - - /*************************************************************************** - * * - * This program is free software; you can redistribute it and/or modify * - * it under the terms of the GNU General Public License as published by * -- * the Free Software Foundation; either version 2 of the License, or * -+ * the Free Software Foundation; either version 2 of the License, or * - * (at your option) any later version. * - * * - ***************************************************************************/ -@@ -45,8 +45,8 @@ - a = getFsUsedKiloBytes(partinfo); - - /*printf ("device(%s)=%lu KB used\n", partinfo->partname().latin1(), a);*/ -- if (a == 0) return -1; -- else return a * KBYTE_SECTORS; -+ if (a == 0) return -1; -+ else return a * KBYTE_SECTORS; - } - - //------------------------------------------------ -@@ -54,117 +54,76 @@ - // security: if already mounted - umount(szMountPoint); - -- int nRes; -+ char type[255]; - -- char type[255]; -- -- if (((partinfo->fsspec->name().compare("fat32") == 0) -- || (partinfo->fsspec->name().compare("fat16") == 0))) { -- strcpy(type, "vfat"); -- } else { -- strcpy(type, partinfo->fsspec->name().latin1()); -- } -- nRes=mount(partinfo->partname().latin1(), -- szMountPoint, type, MS_NOATIME | MS_RDONLY, NULL); -- /*fprintf (stderr, "debug: try mount %s as %s --> %d\n", partinfo->partname().latin1(), -- type, nRes);*/ -- if (nRes == 0) // if success -- return 0; // success -- -- return -1; // failure -+ if (((partinfo->fsspec->name().compare("fat32") == 0) -+ || (partinfo->fsspec->name().compare("fat16") == 0))) { -+ strcpy(type, "vfat"); -+ } else { -+ strcpy(type, partinfo->fsspec->name().latin1()); -+ } -+ return mount(partinfo->partname().latin1(), -+ szMountPoint, type, MS_NOATIME | MS_RDONLY, NULL); - } - --//------------------------------------------------ --int isMounted(QP_PartInfo *partinfo, char *szMountPoint) { -- FILE *f; -- struct mntent *mnt; -- bool bMounted; -- char szBuf1 [MAXPATHLEN+1]; -- char szBuf2 [MAXPATHLEN+1]; -- -- // init -- bMounted = false; -- memset(szBuf1, 0, MAXPATHLEN); -- memset(szBuf2, 0, MAXPATHLEN); -- -- if ((f = setmntent (MOUNTED, "r")) == 0) -- return (-1); -- -- // loop: compare device with each mounted device -- while (((mnt = getmntent (f)) != 0) && (!bMounted)) { -- -- /*---try to see if the shortname match---*/ -- if ((partinfo->shortname().compare(mnt->mnt_fsname) == 0)) { -- bMounted = true; -- strcpy(szMountPoint, mnt->mnt_dir); -- } -- -- /*---if there is devfs try to see if the longname match---*/ -- if (isDevfsEnabled()) { -- if ((partinfo->longname().compare(mnt->mnt_fsname) == 0)) { -- bMounted = true; -- strcpy(szMountPoint, mnt->mnt_dir); -- } -- } -- } -- -- endmntent (f); -- -- return bMounted; -+//--------------------------------------- -+QString mountPoint(QP_PartInfo *partinfo) { -+ FILE *f; -+ struct mntent *mnt; -+ -+ if ((f = setmntent (MOUNTED, "r")) == 0) -+ return QString::null; -+ -+ // loop: compare device with each mounted device -+ while (((mnt = getmntent (f)) != 0)) { -+ if ((partinfo->shortname().compare(mnt->mnt_fsname) == 0) || (isDevfsEnabled() && (partinfo->longname().compare(mnt->mnt_fsname) == 0))) { -+ endmntent(f); -+ return mnt->mnt_dir; -+ } -+ } -+ endmntent(f); -+ return QString::null; - } - - //------------------------------------------------ - unsigned long getFsUsedKiloBytes(QP_PartInfo *partinfo) { -- struct statfs sfs; -- char szMountPoint[MAXPATHLEN+1]; -- unsigned long long a, b, c; -- int bMounted; -- int bToBeUnmounted; -- int nRes; -- unsigned long lResult = 0; // to be returned -- -- // init -- memset(szMountPoint, 0, MAXPATHLEN+1); -- bToBeUnmounted = false; -- -- bMounted = isMounted(partinfo, szMountPoint); -- -- /*---if not mounted -> mount it---*/ -- if (!bMounted) { -- mkdir (TMP_MOUNTPOINT, 755); -- memset(szMountPoint, 0, sizeof(szMountPoint)-1); -- snprintf(szMountPoint, sizeof(szMountPoint)-1, "%s", TMP_MOUNTPOINT); -- nRes = my_mount(partinfo, TMP_MOUNTPOINT); -- /*if (nRes != 0) -- fprintf (stderr, "debug: cannot mount device %s\n", partinfo->partname().latin1());*/ -- bToBeUnmounted = (nRes == 0); -- bMounted =(nRes == 0); -- } -- -- // if the partition is mounted (naturally or not) -- if (bMounted) { -- if (statfs(szMountPoint, &sfs) != -1) { -- a = (sfs.f_blocks - sfs.f_bavail); // used blocks count -- b = a * sfs.f_bsize; // used bytes count -- c = b / 1024LL; // user KiloBytes count -- lResult = c; -- } /*else { -- fprintf (stderr, "debug: statfs error on device %s\n", partinfo->partname().latin1()); -- }*/ -- -- if (bToBeUnmounted) { -- nRes = umount(szMountPoint); -- if (nRes != 0) { -- QString label = QString(QObject::tr("Cannot umount partition device: %1." -- "Please do it by hand first to commit the changes!")) -- .arg(partinfo->partname()); -- QMessageBox::information(NULL, PROG_NAME, label); -- } -- } -- -- return lResult; // success -- } else { -- // error -> partition not mounted -- return 0L; // failure -- } -+ struct statfs sfs; -+ unsigned long long a, b, c; -+ bool bToBeUnmounted; -+ unsigned long lResult = 0; // to be returned -+ QString mnt; -+ -+ // init -+ bToBeUnmounted = false; -+ -+ mnt = mountPoint(partinfo); -+ -+ /*---if not mounted -> mount it---*/ -+ if (mnt.isEmpty()) { -+ mkdir (TMP_MOUNTPOINT, 755); -+ int nRes = my_mount(partinfo, TMP_MOUNTPOINT); -+ if(nRes != 0) // Can't mount --> can't get statistics -+ return 0L; -+ bToBeUnmounted = (nRes == 0); -+ mnt = TMP_MOUNTPOINT; -+ } -+ -+ if (statfs(mnt, &sfs) != -1) { -+ a = (sfs.f_blocks - sfs.f_bavail); // used blocks count -+ b = a * sfs.f_bsize; // used bytes count -+ c = b / 1024LL; // user KiloBytes count -+ lResult = c; -+ } -+ -+ if (bToBeUnmounted) { -+ int nRes = umount(mnt); -+ if (nRes != 0) { -+ QString label = QObject::tr("Cannot umount partition device: %1." -+ "Please do it by hand first to commit the changes!") -+ .arg(partinfo->partname()); -+ QMessageBox::information(NULL, PROG_NAME, label); -+ } -+ } -+ -+ return lResult; // success - } -diff -Naur qtparted-0.4.5.orig/src/statistics.h qtparted-0.4.5/src/statistics.h ---- qtparted-0.4.5.orig/src/statistics.h 2003-08-27 18:13:21.000000000 +0200 -+++ qtparted-0.4.5/src/statistics.h 2005-10-15 12:06:06.000000000 +0200 -@@ -3,7 +3,9 @@ - ------------------- - begin : Wed Sep 4 19:21:54 UTC 2002 - copyright : (C) 2002 by Francois Dupoux -+ (C) 2005 by Bernhard Rosenkraenzer - email : fdupoux@partimage.org -+ bero@arklinux.org - ***************************************************************************/ - - /*************************************************************************** -@@ -17,7 +19,7 @@ - - #include "qp_libparted.h" - --int isMounted(QP_PartIn