All of lore.kernel.org
 help / color / mirror / Atom feed
* [Buildroot] [PATCH v4 0/3] Add libgtk3 and bump webkit to version 2.4.3
@ 2014-08-01  1:33 Hadrien Boutteville
  2014-08-01  1:33 ` [Buildroot] [PATCH v4 1/3] libgtk3: new package Hadrien Boutteville
                   ` (2 more replies)
  0 siblings, 3 replies; 7+ messages in thread
From: Hadrien Boutteville @ 2014-08-01  1:33 UTC (permalink / raw)
  To: buildroot

Hello all,

This series mainly does two things: add libgtk3 and bump webkit.

 - 1: add libgtk3
 - 2: bump webkit
 - 3: bump Midori to test WebKit 2.4.3

For now, only X11 support is done and tested for both libgtk3 and
webkit. Wayland support will be done later.

Tests:

* All is compiled-tested (with GTK+2 and GTK+3 for WebKit and Midori).
* Running tests were done for libgtk3 (with gtk3-demo) and Midori GTK+2
  with WebKit GTK+2 and webkit1 (on Qemu and BeagleBone Black).

For testing you will need GCC 4.8 because WebKit needs at least version
4.8 (see commit message) and X.org needs a version lesser than 4.9 (see
this issue:
http://lists.busybox.net/pipermail/buildroot/2014-June/098679.html).

There is still a weird problem with WebKit: parallel make with Make
3.81 results in a make hang on:
  CXXLD libWebCoreSVG.la
This is reproducible.

Does anyone has already encountered this?

You can find a defconfig for Qemu here:
http://bpaste.net/show/fR3jDhQPmtUHPYpGoiUn/

Changes v1 -> v2:

 - libgtk3: remove atk-bridge support, so we no longer need
   at-spi2-core and at-spi2-atk.
 - libgtk3: change the way we check for introspection to fix autoreconf
   error.
 - libgtk3: remove unnecessary extra definitions 

Changes v2 -> v3:

 - midori: fix the need of librsvg for the host

Changes v3 -> v4:

 - libgtk3: fix typo and formatting and improve .mk

Best regards,

Hadrien

---

Hadrien Boutteville (3):
  libgtk3: new package
  webkit: bump to version 2.4.3
  midori: bump to version 0.5.8

 package/Config.in                                  |    1 +
 package/libgtk3/Config.in                          |   46 +
 package/libgtk3/libgtk3-0001-no-gtk-doc.patch      |   25 +
 .../libgtk3-0002-fix-introspection-check.patch     |   28 +
 .../libgtk3/libgtk3-0003-disable-atk-bridge.patch  |   45 +
 package/libgtk3/libgtk3.mk                         |  136 ++
 package/midori/Config.in                           |   15 +-
 package/midori/blocked.png                         |  Bin 0 -> 522 bytes
 package/midori/disabled.png                        |  Bin 0 -> 510 bytes
 package/midori/enabled.png                         |  Bin 0 -> 639 bytes
 package/midori/logo-shade.png                      |  Bin 0 -> 23862 bytes
 .../midori-0001-remove-libnotify-dependency.patch  |   27 +
 .../midori-0002-do-not-use-rsvg-convert.patch      |   39 +
 package/midori/midori.mk                           |   66 +-
 package/webkit/Config.in                           |   16 +-
 ...ebkit-0001-build-fix-for-32-bit-autotools.patch |   34 -
 .../webkit-0002-build-fix-for-gtklauncher.patch    |   51 -
 .../webkit/webkit-0003-detect-harfbuzz-icu.patch   |   28 -
 package/webkit/webkit-0004-disable-docrebase.patch |   27 -
 package/webkit/webkit-0005-disable-tests.patch     |   80 --
 package/webkit/webkit-0006-execinfo_h.patch        |   20 -
 package/webkit/webkit-0007-mips-dfg.patch          | 1490 --------------------
 package/webkit/webkit-0008-support-bison-3.0.patch |   22 -
 package/webkit/webkit.mk                           |   67 +-
 24 files changed, 433 insertions(+), 1830 deletions(-)
 create mode 100644 package/libgtk3/Config.in
 create mode 100644 package/libgtk3/libgtk3-0001-no-gtk-doc.patch
 create mode 100644 package/libgtk3/libgtk3-0002-fix-introspection-check.patch
 create mode 100644 package/libgtk3/libgtk3-0003-disable-atk-bridge.patch
 create mode 100644 package/libgtk3/libgtk3.mk
 create mode 100644 package/midori/blocked.png
 create mode 100644 package/midori/disabled.png
 create mode 100644 package/midori/enabled.png
 create mode 100644 package/midori/logo-shade.png
 create mode 100644 package/midori/midori-0001-remove-libnotify-dependency.patch
 create mode 100644 package/midori/midori-0002-do-not-use-rsvg-convert.patch
 delete mode 100644 package/webkit/webkit-0001-build-fix-for-32-bit-autotools.patch
 delete mode 100644 package/webkit/webkit-0002-build-fix-for-gtklauncher.patch
 delete mode 100644 package/webkit/webkit-0003-detect-harfbuzz-icu.patch
 delete mode 100644 package/webkit/webkit-0004-disable-docrebase.patch
 delete mode 100644 package/webkit/webkit-0005-disable-tests.patch
 delete mode 100644 package/webkit/webkit-0006-execinfo_h.patch
 delete mode 100644 package/webkit/webkit-0007-mips-dfg.patch
 delete mode 100644 package/webkit/webkit-0008-support-bison-3.0.patch

-- 
2.0.1

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [Buildroot] [PATCH v4 1/3] libgtk3: new package
  2014-08-01  1:33 [Buildroot] [PATCH v4 0/3] Add libgtk3 and bump webkit to version 2.4.3 Hadrien Boutteville
@ 2014-08-01  1:33 ` Hadrien Boutteville
  2014-08-03  9:35   ` Thomas Petazzoni
  2014-08-01  1:33 ` [Buildroot] [PATCH v4 2/3] webkit: bump to version 2.4.3 Hadrien Boutteville
  2014-08-01  1:33 ` [Buildroot] [PATCH v4 3/3] midori: bump to version 0.5.8 Hadrien Boutteville
  2 siblings, 1 reply; 7+ messages in thread
From: Hadrien Boutteville @ 2014-08-01  1:33 UTC (permalink / raw)
  To: buildroot

Signed-off-by: Hadrien Boutteville <hadrien.boutteville@gmail.com>
Signed-off-by: Eric Le Bihan <eric.le.bihan.dev@free.fr>
Cc: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
Cc: "Yann E. MORIN" <yann.morin.1998@free.fr>
---
Changes v1 -> v2:
  - add a patch to remove atk-bridge support, so we no longer need
    at-spi2-core and at-spi2-atk.
  - change the way we check for introspection to fix autoreconf error
    (Eric)
  - remove unnecessary extra definitions

Changes v3 -> v4:
  - fix typo and formatting (Thomas)
  - add missing description + SoB in no-gtk-doc patch (Thomas)
---
 package/Config.in                                  |   1 +
 package/libgtk3/Config.in                          |  46 +++++++
 package/libgtk3/libgtk3-0001-no-gtk-doc.patch      |  25 ++++
 .../libgtk3-0002-fix-introspection-check.patch     |  28 +++++
 .../libgtk3/libgtk3-0003-disable-atk-bridge.patch  |  45 +++++++
 package/libgtk3/libgtk3.mk                         | 136 +++++++++++++++++++++
 6 files changed, 281 insertions(+)
 create mode 100644 package/libgtk3/Config.in
 create mode 100644 package/libgtk3/libgtk3-0001-no-gtk-doc.patch
 create mode 100644 package/libgtk3/libgtk3-0002-fix-introspection-check.patch
 create mode 100644 package/libgtk3/libgtk3-0003-disable-atk-bridge.patch
 create mode 100644 package/libgtk3/libgtk3.mk

diff --git a/package/Config.in b/package/Config.in
index 8e1c391..853851f 100644
--- a/package/Config.in
+++ b/package/Config.in
@@ -610,6 +610,7 @@ menu "Graphics"
 	source "package/libgeotiff/Config.in"
 	source "package/libglade/Config.in"
 	source "package/libgtk2/Config.in"
+	source "package/libgtk3/Config.in"
 	source "package/libpng/Config.in"
 	source "package/libqrencode/Config.in"
 	source "package/libraw/Config.in"
diff --git a/package/libgtk3/Config.in b/package/libgtk3/Config.in
new file mode 100644
index 0000000..47b1ac1
--- /dev/null
+++ b/package/libgtk3/Config.in
@@ -0,0 +1,46 @@
+config BR2_PACKAGE_LIBGTK3
+	bool "libgtk3"
+	select BR2_PACKAGE_ATK
+	select BR2_PACKAGE_CAIRO
+	select BR2_PACKAGE_CAIRO_PS
+	select BR2_PACKAGE_CAIRO_PDF
+	select BR2_PACKAGE_CAIRO_SVG
+	select BR2_PACKAGE_LIBGLIB2
+	select BR2_PACKAGE_PANGO
+	select BR2_PACKAGE_GDK_PIXBUF
+	select BR2_PACKAGE_FONTCONFIG
+	select BR2_PACKAGE_XLIB_LIBX11
+	select BR2_PACKAGE_XLIB_LIBXEXT
+	select BR2_PACKAGE_XLIB_LIBXRENDER
+	select BR2_PACKAGE_XLIB_LIBXI # required for building X11 backend
+	depends on BR2_PACKAGE_XORG7
+	depends on BR2_USE_WCHAR # glib2
+	depends on BR2_TOOLCHAIN_HAS_THREADS # glib2
+	depends on BR2_USE_MMU # glib2
+	depends on BR2_INSTALL_LIBSTDCPP # pango
+	help
+	  The GTK+ version 3 graphical user interface library
+
+	  http://www.gtk.org/
+
+if BR2_PACKAGE_LIBGTK3
+
+config BR2_PACKAGE_LIBGTK3_DEMO
+	bool "Install libgtk3 demo program"
+	help
+	  The GTK+ source base contains demo programs. This
+	  option allows to install this program to the target.
+
+config BR2_PACKAGE_LIBGTK3_TESTS
+	bool "Install libgtk3 tests"
+	help
+	  The GTK+ source base contains tests. This option
+	  allows to install them to the target.
+
+endif
+
+comment "libgtk3 needs a toolchain w/ wchar, threads, C++"
+	depends on BR2_USE_MMU
+	depends on BR2_PACKAGE_XORG7
+	depends on !BR2_USE_WCHAR || !BR2_INSTALL_LIBSTDCPP || \
+		!BR2_TOOLCHAIN_HAS_THREADS
diff --git a/package/libgtk3/libgtk3-0001-no-gtk-doc.patch b/package/libgtk3/libgtk3-0001-no-gtk-doc.patch
new file mode 100644
index 0000000..926a263
--- /dev/null
+++ b/package/libgtk3/libgtk3-0001-no-gtk-doc.patch
@@ -0,0 +1,25 @@
+Same patch as for systemd in commit
+7144f2f04b705538a893e538a6b851f536f433b6:
+
+Fix deactivation of gtk-doc
+
+The tarball contains the Makefile for building documentation with gtk-doc,
+Unfortunately the AM_CONDITIONAL variable is not the correct one, which
+results in an error when running autoreconf.
+
+This patch fixes this issue.
+
+Signed-off-by: Eric Le Bihan <eric.le.bihan.dev@free.fr>
+Signed-off-by: Hadrien Boutteville <hadrien.boutteville@gmail.com>
+
+--- a/gtk-doc.make
++++ b/gtk-doc.make
+@@ -267,7 +267,7 @@
+ #
+ # Require gtk-doc when making dist
+ #
+-if HAVE_GTK_DOC
++if ENABLE_GTK_DOC
+ dist-check-gtkdoc: docs
+ else
+ dist-check-gtkdoc:
diff --git a/package/libgtk3/libgtk3-0002-fix-introspection-check.patch b/package/libgtk3/libgtk3-0002-fix-introspection-check.patch
new file mode 100644
index 0000000..5b56b3a
--- /dev/null
+++ b/package/libgtk3/libgtk3-0002-fix-introspection-check.patch
@@ -0,0 +1,28 @@
+Fix HAVE_INTROSPECTION does not appear in AM_CONDITIONAL
+
+During autoreconf GOBJECT_INTROSPECTION_CHECK could not be resolve because we
+don't have introspection which provides its custom m4 macro. Reconfigure fails
+with:
+
+gdk/Makefile.am:196: error: HAVE_INTROSPECTION does not appear in AM_CONDITIONAL
+gtk/Makefile.am:1347: error: HAVE_INTROSPECTION does not appear in AM_CONDITIONAL
+
+We avoid to add a copy of introspection.m4 in the m4 directory of libgtk3 by
+adding a check, as performed in Systemd.
+
+Signed-off-by: Hadrien Boutteville <hadrien.boutteville@gmail.com>
+
+--- a/configure.ac
++++ b/configure.ac
+@@ -1621,7 +1621,10 @@
+ # GObject introspection
+ ##################################################
+ 
+-GOBJECT_INTROSPECTION_CHECK(introspection_required_version)
++m4_ifdef([GOBJECT_INTROSPECTION_CHECK],
++         [GOBJECT_INTROSPECTION_CHECK(introspection_required_version)],
++         [AM_CONDITIONAL([HAVE_INTROSPECTION], [false])
++          enable_introspection=no])
+ 
+ ##################################################
+ # colord module
diff --git a/package/libgtk3/libgtk3-0003-disable-atk-bridge.patch b/package/libgtk3/libgtk3-0003-disable-atk-bridge.patch
new file mode 100644
index 0000000..30ff92d
--- /dev/null
+++ b/package/libgtk3/libgtk3-0003-disable-atk-bridge.patch
@@ -0,0 +1,45 @@
+Remove atk-bridge support.
+
+atk-bridge doesn't seem useful for now in Buildroot and requires to
+add two new packages just for it: at-spi2-core and at-spi2-atk.
+
+Signed-off-by: Hadrien Boutteville <hadrien.boutteville@gmail.com>
+
+--- a/configure.ac
++++ b/configure.ac
+@@ -1349,11 +1349,7 @@
+ # Check for Accessibility Toolkit flags
+ ########################################
+ 
+-if test x$enable_x11_backend = xyes; then
+-   ATK_PACKAGES="atk atk-bridge-2.0"
+-else
+-   ATK_PACKAGES="atk"
+-fi
++ATK_PACKAGES="atk"
+ 
+ PKG_CHECK_MODULES(ATK, $ATK_PACKAGES)
+ 
+--- a/gtk/a11y/gtkaccessibility.c
++++ b/gtk/a11y/gtkaccessibility.c
+@@ -37,10 +37,6 @@
+ #include <gtk/gtkcombobox.h>
+ #include <gtk/gtkaccessible.h>
+ 
+-#ifdef GDK_WINDOWING_X11
+-#include <atk-bridge.h>
+-#endif
+-
+ static gboolean gail_focus_watcher      (GSignalInvocationHint *ihint,
+                                          guint                  n_param_values,
+                                          const GValue          *param_values,
+@@ -987,9 +983,5 @@
+   _gtk_accessibility_override_atk_util ();
+   do_window_event_initialization ();
+ 
+-#ifdef GDK_WINDOWING_X11
+-  atk_bridge_adaptor_init (NULL, NULL);
+-#endif
+-
+   atk_misc_instance = g_object_new (GTK_TYPE_MISC_IMPL, NULL);
+ }
diff --git a/package/libgtk3/libgtk3.mk b/package/libgtk3/libgtk3.mk
new file mode 100644
index 0000000..62aacd5
--- /dev/null
+++ b/package/libgtk3/libgtk3.mk
@@ -0,0 +1,136 @@
+################################################################################
+#
+# libgtk3
+#
+################################################################################
+
+LIBGTK3_VERSION_MAJOR = 3.12
+LIBGTK3_VERSION = $(LIBGTK3_VERSION_MAJOR).2
+LIBGTK3_SOURCE = gtk+-$(LIBGTK3_VERSION).tar.xz
+LIBGTK3_SITE = http://ftp.gnome.org/pub/gnome/sources/gtk+/$(LIBGTK3_VERSION_MAJOR)
+LIBGTK3_LICENSE = LGPLv2+
+LIBGTK3_LICENSE_FILES = COPYING
+LIBGTK3_INSTALL_STAGING = YES
+LIBGTK3_AUTORECONF = YES
+
+LIBGTK3_CONF_ENV = \
+	ac_cv_path_GTK_UPDATE_ICON_CACHE=$(HOST_DIR)/usr/bin/gtk-update-icon-cache \
+	ac_cv_path_GDK_PIXBUF_CSOURCE=$(HOST_DIR)/usr/bin/gdk-pixbuf-csource
+
+LIBGTK3_CONF_OPT = --disable-glibtest \
+	--enable-explicit-deps=no \
+	--enable-gtk2-dependency \
+	--disable-debug \
+	--disable-introspection
+
+LIBGTK3_DEPENDENCIES = host-pkgconf host-libgtk3 libglib2 cairo pango atk \
+	gdk-pixbuf
+
+# Xorg dependencies
+LIBGTK3_CONF_OPT += --with-x \
+	--enable-x11-backend \
+	--x-includes=$(STAGING_DIR)/usr/include/X11 \
+	--x-libraries=$(STAGING_DIR)/usr/lib
+LIBGTK3_DEPENDENCIES += fontconfig xlib_libX11 xlib_libXext xlib_libXrender \
+		xlib_libXi
+
+ifeq ($(BR2_PACKAGE_XLIB_LIBXINERAMA),y)
+LIBGTK3_CONF_OPT += --enable-xinerama
+LIBGTK3_DEPENDENCIES += xlib_libXinerama
+else
+LIBGTK3_CONF_OPT += --disable-xinerama
+endif
+
+ifeq ($(BR2_PACKAGE_XLIB_LIBXRANDR),y)
+LIBGTK3_CONF_OPT += --enable-xrandr
+LIBGTK3_DEPENDENCIES += xlib_libXrandr
+else
+LIBGTK3_CONF_OPT += --disable-xrandr
+endif
+
+ifeq ($(BR2_PACKAGE_XLIB_LIBXCURSOR),y)
+LIBGTK3_DEPENDENCIES += xlib_libXcursor
+endif
+
+ifeq ($(BR2_PACKAGE_XLIB_LIBXFIXES),y)
+LIBGTK3_CONF_OPT += --enable-xfixes
+LIBGTK3_DEPENDENCIES += xlib_libXfixes
+else
+LIBGTK3_CONF_OPT += --disable-xfixes
+endif
+
+ifeq ($(BR2_PACKAGE_XLIB_LIBXCOMPOSITE),y)
+LIBGTK3_CONF_OPT += --enable-xcomposite
+LIBGTK3_DEPENDENCIES += xlib_libXcomposite
+else
+LIBGTK3_CONF_OPT += --disable-xcomposite
+endif
+
+ifeq ($(BR2_PACKAGE_XLIB_LIBXDAMAGE),y)
+LIBGTK3_CONF_OPT += --enable-xdamage
+LIBGTK3_DEPENDENCIES += xlib_libXdamage
+else
+LIBGTK3_CONF_OPT += --disable-xdamage
+endif
+
+ifeq ($(BR2_PACKAGE_XLIB_LIBXKBFILE),y)
+LIBGTK3_CONF_OPT += --enable-xkb
+LIBGTK3_DEPENDENCIES += xlib_libxkbfile
+else
+LIBGTK3_CONF_OPT += --disable-xkb
+endif
+
+ifeq ($(BR2_PACKAGE_CUPS),y)
+LIBGTK3_CONF_OPT += --enable-cups
+LIBGTK3_DEPENDENCIES += cups
+else
+LIBGTK3_CONF_OPT += --disable-cups
+endif
+
+ifeq ($(BR2_PACKAGE_LIBGTK3_DEMO),)
+define LIBGTK3_POST_INSTALL_TWEAKS
+	rm -rf $(TARGET_DIR)/usr/bin/gtk3-demo \
+		$(TARGET_DIR)/usr/bin/gtk3-demo-application
+endef
+
+LIBGTK3_POST_INSTALL_TARGET_HOOKS += LIBGTK3_POST_INSTALL_TWEAKS
+endif
+
+ifeq ($(BR2_PACKAGE_LIBGTK3_TESTS),y)
+LIBGTK3_CONF_OPT += --enable-installed-tests
+else
+LIBGTK3_CONF_OPT += --disable-installed-tests
+endif
+
+# We do not build a full version of libgtk3 for the host, because that
+# requires compiling Cairo, Pango, ATK and X.org for the host.
+# Therefore, we hack the build to only build gdk-pixbuf-from-source and
+# gtk-update-icon-cache, which are the host tools needed to build Gtk
+# for the target.
+
+HOST_LIBGTK3_DEPENDENCIES = host-libglib2 host-libpng host-gdk-pixbuf
+
+HOST_LIBGTK3_CFLAGS = \
+	$(shell $(HOST_CONFIGURE_OPTS) $(PKG_CONFIG_HOST_BINARY) \
+		--cflags --libs gdk-pixbuf-2.0)
+
+define HOST_LIBGTK3_CONFIGURE_CMDS
+	echo "#define GETTEXT_PACKAGE \"gtk30\"" >> $(@D)/gtk/config.h
+	echo "#define HAVE_UNISTD_H 1" >> $(@D)/gtk/config.h
+	echo "#define HAVE_FTW_H 1" >> $(@D)/gtk/config.h
+endef
+
+define HOST_LIBGTK3_BUILD_CMDS
+	$(HOSTCC) $(HOST_CFLAGS) $(HOST_LDFLAGS) \
+		$(@D)/gtk/updateiconcache.c \
+		$(HOST_LIBGTK3_CFLAGS) \
+		-o $(@D)/gtk/gtk-update-icon-cache
+endef
+
+define HOST_LIBGTK3_INSTALL_CMDS
+	$(INSTALL) -D -m 0755 $(@D)/gtk/gtk-update-icon-cache \
+		$(HOST_DIR)/usr/bin/gtk-update-icon-cache
+endef
+
+$(eval $(autotools-package))
+$(eval $(host-autotools-package))
-- 
2.0.1

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [Buildroot] [PATCH v4 2/3] webkit: bump to version 2.4.3
  2014-08-01  1:33 [Buildroot] [PATCH v4 0/3] Add libgtk3 and bump webkit to version 2.4.3 Hadrien Boutteville
  2014-08-01  1:33 ` [Buildroot] [PATCH v4 1/3] libgtk3: new package Hadrien Boutteville
@ 2014-08-01  1:33 ` Hadrien Boutteville
  2014-08-01  1:33 ` [Buildroot] [PATCH v4 3/3] midori: bump to version 0.5.8 Hadrien Boutteville
  2 siblings, 0 replies; 7+ messages in thread
From: Hadrien Boutteville @ 2014-08-01  1:33 UTC (permalink / raw)
  To: buildroot

WebKit needs at least GCC in version 4.8 to build:
https://bugs.webkit.org/show_bug.cgi?id=127103
The package can't depends on a specific GCC version with external
toolchains so add a comment in the help menu.

Remove all patches because they are applied upstream in this version.

Signed-off-by: Hadrien Boutteville <hadrien.boutteville@gmail.com>
Cc: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
Cc: "Yann E. MORIN" <yann.morin.1998@free.fr>
---
There is still a weird problem with WebKit: parallel make with Make
3.81 results in a make hang on:
  CXXLD libWebCoreSVG.la
This is reproducible.
---
 package/webkit/Config.in                           |   16 +-
 ...ebkit-0001-build-fix-for-32-bit-autotools.patch |   34 -
 .../webkit-0002-build-fix-for-gtklauncher.patch    |   51 -
 .../webkit/webkit-0003-detect-harfbuzz-icu.patch   |   28 -
 package/webkit/webkit-0004-disable-docrebase.patch |   27 -
 package/webkit/webkit-0005-disable-tests.patch     |   80 --
 package/webkit/webkit-0006-execinfo_h.patch        |   20 -
 package/webkit/webkit-0007-mips-dfg.patch          | 1490 --------------------
 package/webkit/webkit-0008-support-bison-3.0.patch |   22 -
 package/webkit/webkit.mk                           |   67 +-
 10 files changed, 38 insertions(+), 1797 deletions(-)
 delete mode 100644 package/webkit/webkit-0001-build-fix-for-32-bit-autotools.patch
 delete mode 100644 package/webkit/webkit-0002-build-fix-for-gtklauncher.patch
 delete mode 100644 package/webkit/webkit-0003-detect-harfbuzz-icu.patch
 delete mode 100644 package/webkit/webkit-0004-disable-docrebase.patch
 delete mode 100644 package/webkit/webkit-0005-disable-tests.patch
 delete mode 100644 package/webkit/webkit-0006-execinfo_h.patch
 delete mode 100644 package/webkit/webkit-0007-mips-dfg.patch
 delete mode 100644 package/webkit/webkit-0008-support-bison-3.0.patch

diff --git a/package/webkit/Config.in b/package/webkit/Config.in
index c86eb94..3df760e 100644
--- a/package/webkit/Config.in
+++ b/package/webkit/Config.in
@@ -14,7 +14,7 @@ config BR2_PACKAGE_WEBKIT
 	depends on BR2_INSTALL_LIBSTDCPP
 	depends on BR2_USE_WCHAR # enchant -> libglib2
 	depends on BR2_TOOLCHAIN_HAS_THREADS # enchant -> libglib2; icu
-	depends on BR2_PACKAGE_LIBGTK2
+	depends on BR2_PACKAGE_LIBGTK2 || BR2_PACKAGE_LIBGTK3
 	depends on BR2_PACKAGE_WEBKIT_ARCH_SUPPORTS
 	depends on !BR2_BINFMT_FLAT # icu
 	select BR2_PACKAGE_CAIRO_PNG
@@ -31,8 +31,10 @@ config BR2_PACKAGE_WEBKIT
 	select BR2_PACKAGE_SQLITE
 	select BR2_PACKAGE_WEBP
 	select BR2_PACKAGE_XLIB_LIBXT if BR2_PACKAGE_XORG7
-	select BR2_PACKAGE_XLIB_LIBXCOMPOSITE if BR2_PACKAGE_HAS_LIBGL
-	select BR2_PACKAGE_XLIB_LIBXDAMAGE if BR2_PACKAGE_HAS_LIBGL
+	select BR2_PACKAGE_XLIB_LIBXCOMPOSITE if BR2_PACKAGE_HAS_LIBGL || \
+		(BR2_PACKAGE_HAS_LIBGLES && BR2_PACKAGE_HAS_LIBEGL)
+	select BR2_PACKAGE_XLIB_LIBXDAMAGE if BR2_PACKAGE_HAS_LIBGL || \
+		(BR2_PACKAGE_HAS_LIBGLES && BR2_PACKAGE_HAS_LIBEGL)
 	help
 	  WebKit is an open source, standards compliant web browser engine.
 
@@ -41,7 +43,9 @@ config BR2_PACKAGE_WEBKIT
 
 	  http://webkit.org/
 
-comment "webkit needs libgtk2 and a toolchain w/ C++, wchar, threads"
+	  WebKit needs at least GCC 4.8 to build.
+
+comment "webkit needs libgtk2 or libgtk3 and a toolchain w/ C++, wchar, threads"
 	depends on BR2_PACKAGE_WEBKIT_ARCH_SUPPORTS
-	depends on !BR2_PACKAGE_LIBGTK2 || !BR2_INSTALL_LIBSTDCPP || \
-		!BR2_USE_WCHAR || !BR2_TOOLCHAIN_HAS_THREADS
+	depends on !(BR2_PACKAGE_LIBGTK2 || BR2_PACKAGE_LIBGTK3) || \
+		!BR2_INSTALL_LIBSTDCPP || !BR2_USE_WCHAR || !BR2_TOOLCHAIN_HAS_THREADS
diff --git a/package/webkit/webkit-0001-build-fix-for-32-bit-autotools.patch b/package/webkit/webkit-0001-build-fix-for-32-bit-autotools.patch
deleted file mode 100644
index d7765ea..0000000
--- a/package/webkit/webkit-0001-build-fix-for-32-bit-autotools.patch
+++ /dev/null
@@ -1,34 +0,0 @@
-Add missing symbol for WebCore::TextIterator::getLocationAndLengthFromRange
-
-Signed-off-by: Markos Chandras <markos.chandras@imgtec.com>
-
-From f5bb58f9096061f00c948e668335811d364ba360 Mon Sep 17 00:00:00 2001
-From: "kov at webkit.org" <kov@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
-Date: Thu, 7 Feb 2013 13:48:46 +0000
-Subject: [PATCH] Unreviewed build fix after r141196 for 32 bits autotools.
-
-* Source/autotools/symbols.filter: restore 32 bits version of the
-WebCore::TextIterator::getLocationAndLengthFromRange(WebCore::Node*,
-WebCore::Range const*, unsigned int&, unsigned int&) symbol.
-
-git-svn-id: http://svn.webkit.org/repository/webkit/trunk at 142105 268f45cc-cd09-0410-ab3c-d52691b4dbfc
----
- ChangeLog                       | 8 ++++++++
- Source/autotools/symbols.filter | 1 +
- 2 files changed, 9 insertions(+)
-
-diff --git a/Source/autotools/symbols.filter b/Source/autotools/symbols.filter
-index 9d730b3..2edefaf 100644
---- a/Source/autotools/symbols.filter
-+++ b/Source/autotools/symbols.filter
-@@ -57,6 +57,7 @@ _ZN7WebCore11HistoryItem16setDocumentStateERKN3WTF6VectorINS1_6StringELj0EEE;
- _ZN7WebCore11HistoryItem16setDocumentStateERKN3WTF6VectorINS1_6StringELm0EEE;
- _ZN7WebCore11MemoryCache14resourceForURLERKNS_4KURLE;
- _ZN7WebCore12TextIterator26rangeFromLocationAndLengthEPNS_13ContainerNodeEiib;
-+_ZN7WebCore12TextIterator29getLocationAndLengthFromRangeEPNS_4NodeEPKNS_5RangeERjS6_;
- _ZN7WebCore12TextIterator29getLocationAndLengthFromRangeEPNS_4NodeEPKNS_5RangeERmS6_;
- _ZN7WebCore12PrintContext20pageNumberForElementEPNS_7ElementERKNS_9FloatSizeE;
- _ZN7WebCore13createWrapperEPN3JSC9ExecStateEPNS_17JSDOMGlobalObjectEPNS_4NodeE;
--- 
-1.8.3.2
-
diff --git a/package/webkit/webkit-0002-build-fix-for-gtklauncher.patch b/package/webkit/webkit-0002-build-fix-for-gtklauncher.patch
deleted file mode 100644
index 9a840b6..0000000
--- a/package/webkit/webkit-0002-build-fix-for-gtklauncher.patch
+++ /dev/null
@@ -1,51 +0,0 @@
-Make gstreamer support conditional
-
-Signed-off-by: Markos Chandras <markos.chandras@imgtec.com>
-
-From f1055f61bce46eccf8dc0aa017113a08d3d71944 Mon Sep 17 00:00:00 2001
-From: "commit-queue at webkit.org"
- <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
-Date: Fri, 15 Mar 2013 07:13:51 +0000
-Subject: [PATCH] Build fix for Tools/GtkLauncher/Programs_GtkLauncher-main.o
- if gstreamer is not installed https://bugs.webkit.org/show_bug.cgi?id=112394
-
-Patch by Tobias Mueller <tobiasmue@gnome.org> on 2013-03-15
-Reviewed by Philippe Normand.
-
-* GtkLauncher/main.c:
-(main): Guard using the gstreamer function with #ifdef WTF_USE_GSTREAMER
-
-git-svn-id: http://svn.webkit.org/repository/webkit/trunk at 145881 268f45cc-cd09-0410-ab3c-d52691b4dbfc
----
- Tools/ChangeLog          | 10 ++++++++++
- Tools/GtkLauncher/main.c |  5 ++++-
- 2 files changed, 14 insertions(+), 1 deletion(-)
-
-diff --git a/Tools/GtkLauncher/main.c b/Tools/GtkLauncher/main.c
-index 32baf4a..84c8833 100644
---- a/Tools/GtkLauncher/main.c
-+++ b/Tools/GtkLauncher/main.c
-@@ -28,7 +28,9 @@
- #include "autotoolsconfig.h"
- #include "LauncherInspectorWindow.h"
- #include <errno.h>
-+#ifdef WTF_USE_GSTREAMER
- #include <gst/gst.h>
-+#endif
- #include <gtk/gtk.h>
- #include <stdlib.h>
- #include <string.h>
-@@ -489,8 +491,9 @@ int main(int argc, char* argv[])
-     GOptionContext *context = g_option_context_new(0);
-     g_option_context_add_main_entries(context, commandLineOptions, 0);
-     g_option_context_add_group(context, gtk_get_option_group(TRUE));
-+#ifdef WTF_USE_GSTREAMER
-     g_option_context_add_group(context, gst_init_get_option_group());
--
-+#endif
-     webkitSettings = webkit_web_settings_new();
-     g_object_set(webkitSettings, "enable-developer-extras", TRUE, NULL);
-     if (!addWebSettingsGroupToContext(context, webkitSettings)) {
--- 
-1.8.3.2
-
diff --git a/package/webkit/webkit-0003-detect-harfbuzz-icu.patch b/package/webkit/webkit-0003-detect-harfbuzz-icu.patch
deleted file mode 100644
index dc93c67..0000000
--- a/package/webkit/webkit-0003-detect-harfbuzz-icu.patch
+++ /dev/null
@@ -1,28 +0,0 @@
-harfbuzz-icu detections based on the following upstream commits
-
-- 5f3ae29ffb29c499c1825578ba7f3ffcbf1aa8b9
-- ad2a23ec44b692bde43a13b658990770caa8dfc5
-- 22b4786377142424bfb6562ff029997acd0846d1
-
-Signed-off-by: Markos Chandras <markos.chandras@imgtec.com>
-
-Index: webkit-1.11.5/configure.ac
-===================================================================
---- webkit-1.11.5.orig/configure.ac
-+++ webkit-1.11.5/configure.ac
-@@ -938,6 +938,15 @@ PKG_CHECK_MODULES([FREETYPE],
-                   freetype2 >= $FREETYPE2_REQUIRED_VERSION
-                   harfbuzz])
- fi
-+# HarfBuzz 0.9.18 splits harbuzz-icu into a separate library.
-+# Since we support earlier HarfBuzz versions we keep this conditional for now.
-+m4_define([harfbuzz_required_version], [0.9.7])
-+if $PKG_CONFIG --atleast-version 0.9.18 harfbuzz; then
-+	PKG_CHECK_MODULES([HARFBUZZ_ICU], [harfbuzz-icu >= $harfbuzz_required_version])
-+	FREETYPE_CFLAGS+=" $HARFBUZZ_ICU_CFLAGS"
-+	FREETYPE_LIBS+=" $HARFBUZZ_ICU_LIBS"
-+fi
-+
- AC_SUBST([FREETYPE_CFLAGS])
- AC_SUBST([FREETYPE_LIBS])
- 
diff --git a/package/webkit/webkit-0004-disable-docrebase.patch b/package/webkit/webkit-0004-disable-docrebase.patch
deleted file mode 100644
index 2692d61..0000000
--- a/package/webkit/webkit-0004-disable-docrebase.patch
+++ /dev/null
@@ -1,27 +0,0 @@
-This patch prevents documentation from being rebased or installed. This
-prevents an error when gtk-doc --rebase is called.
-
-Signed-off-by: Spenser Gilliland <spenser@gillilanding.com>
-Signed-off-by: Markos Chandras <markos.chandras@imgtec.com>
-
-Index: webkit-1.11.5/Tools/GNUmakefile.am
-===================================================================
---- webkit-1.11.5.orig/Tools/GNUmakefile.am
-+++ webkit-1.11.5/Tools/GNUmakefile.am
-@@ -308,6 +308,8 @@ EXTRA_DIST += \
- 	Tools/Scripts/webkit-build-directory \
- 	Tools/Scripts/webkitdirs.pm
- 
-+if ENABLE_GTK_DOC
-+
- docs: docs-build.stamp
- .PHONY : docs
- DISTCLEANFILES += docs-build.stamp
-@@ -412,7 +414,6 @@ if ENABLE_WEBKIT2
- 	rm -rf $${installdir}
- endif
- 
--if ENABLE_GTK_DOC
- all: docs-build.stamp
- endif
- 
diff --git a/package/webkit/webkit-0005-disable-tests.patch b/package/webkit/webkit-0005-disable-tests.patch
deleted file mode 100644
index 6fa6daa..0000000
--- a/package/webkit/webkit-0005-disable-tests.patch
+++ /dev/null
@@ -1,80 +0,0 @@
-This prevents the Webkit test suites from being built.
-
-Signed-off-by: Spenser Gilliland <spenser@gillilanding.com>
-----
-Index: webkit-1.9.6/GNUmakefile.am
-===================================================================
---- webkit-1.9.6.orig/GNUmakefile.am	2012-08-06 03:17:24.000000000 -0500
-+++ webkit-1.9.6/GNUmakefile.am	2013-05-28 10:08:53.645129501 -0500
-@@ -282,11 +282,14 @@
- include Tools/DumpRenderTree/gtk/GNUmakefile.ImageDiff.am
- 
- include Source/WebKit2/GNUmakefile.am
--include Source/WebKit2/UIProcess/API/gtk/tests/GNUmakefile.am
- include Tools/MiniBrowser/gtk/GNUmakefile.am
-+
-+if ENABLE_TESTS
-+include Source/WebKit2/UIProcess/API/gtk/tests/GNUmakefile.am
- include Tools/WebKitTestRunner/GNUmakefile.am
- include Source/ThirdParty/gtest/GNUmakefile.am
- include Tools/TestWebKitAPI/GNUmakefile.am
-+endif # ENABLE_TESTS
- # [GTK] Refactor the translations now that we have webkit2
- # https://bugs.webkit.org/show_bug.cgi?id=55153
- 
-Index: webkit-1.9.6/Source/WebKit/gtk/GNUmakefile.am
-===================================================================
---- webkit-1.9.6.orig/Source/WebKit/gtk/GNUmakefile.am	2012-07-19 05:02:29.000000000 -0500
-+++ webkit-1.9.6/Source/WebKit/gtk/GNUmakefile.am	2013-05-28 10:09:49.277130516 -0500
-@@ -413,6 +413,7 @@
- dist_resources_DATA = \
- 	$(shell ls $(srcdir)/Source/WebKit/gtk/resources/*.html)
- 
-+if ENABLE_TESTS
- # Build unit tests
- webkit_tests_cflags = \
- 	-fno-strict-aliasing \
-@@ -613,6 +614,8 @@
- Programs_unittests_testcopyandpaste_LDADD = $(webkit_tests_ldadd)
- Programs_unittests_testcopyandpaste_LDFLAGS = $(webkit_tests_ldflags)
- 
-+endif # ENABLE_TESTS
-+
- # Project-wide clean rules
- # Files that will be cleaned
- CLEANFILES += \
-Index: webkit-1.9.6/configure.ac
-===================================================================
---- webkit-1.9.6.orig/configure.ac	2012-08-06 08:45:10.000000000 -0500
-+++ webkit-1.9.6/configure.ac	2013-05-28 10:07:55.817128445 -0500
-@@ -516,6 +516,14 @@
- AC_SUBST(CAIRO_CFLAGS)
- AC_SUBST(CAIRO_LIBS)
- 
-+# check wheter to build tests
-+AC_MSG_CHECKING([wheter to build tests])
-+AC_ARG_ENABLE(tests,
-+              AC_HELP_STRING([--enable-tests],
-+                             [turn on tests [default=no]]),
-+              [],[enable_debug="no"])
-+AC_MSG_RESULT([$enable_tests])
-+
- # check whether to build with debugging enabled
- AC_MSG_CHECKING([whether to do a debug build])
- AC_ARG_ENABLE(debug,
-@@ -1423,6 +1431,7 @@
- AM_CONDITIONAL([USE_FARSTREAM], [test "$have_farstream" = "yes"])
- 
- # WebKit feature conditionals
-+AM_CONDITIONAL([ENABLE_TESTS],[test "$enable_tests" = "yes"])
- AM_CONDITIONAL([ENABLE_DEBUG],[test "$enable_debug_features" = "yes"])
- AM_CONDITIONAL([ENABLE_UNSTABLE_FEATURES],[test "$enable_unstable_features" = "yes"])
- AM_CONDITIONAL([ENABLE_WEBGL],[test "$enable_webgl" = "yes"])
-@@ -1534,6 +1543,7 @@
- WebKit was configured with the following options:
- 
- Build configuration:
-+ Enable tests (slow)                                      : $enable_tests
-  Enable debugging (slow)                                  : $enable_debug
-  Compile with debug symbols (slow)                        : $enable_debug_symbols
-  Enable debug features (slow)                             : $enable_debug_features
diff --git a/package/webkit/webkit-0006-execinfo_h.patch b/package/webkit/webkit-0006-execinfo_h.patch
deleted file mode 100644
index f5508a1..0000000
--- a/package/webkit/webkit-0006-execinfo_h.patch
+++ /dev/null
@@ -1,20 +0,0 @@
-Fixes uclibc build as uclibc does not include backtrace functionality
-
-Signed-of-by: Spenser Gilliland <spenser@gillilanding.com>
-Signed-of-by: Markos Chandras <markos.chandras@imgtec.com>
-
-Index: webkit-1.11.5/Source/WTF/wtf/Assertions.cpp
-===================================================================
---- webkit-1.11.5.orig/Source/WTF/wtf/Assertions.cpp
-+++ webkit-1.11.5/Source/WTF/wtf/Assertions.cpp
-@@ -61,8 +61,10 @@
- #if (OS(DARWIN) || (OS(LINUX) && !defined(__UCLIBC__))) && !OS(ANDROID)
- #include <cxxabi.h>
- #include <dlfcn.h>
-+#if !defined(__UCLIBC__)
- #include <execinfo.h>
- #endif
-+#endif
- 
- #if OS(ANDROID)
- #include "android/log.h"
diff --git a/package/webkit/webkit-0007-mips-dfg.patch b/package/webkit/webkit-0007-mips-dfg.patch
deleted file mode 100644
index 3925951..0000000
--- a/package/webkit/webkit-0007-mips-dfg.patch
+++ /dev/null
@@ -1,1490 +0,0 @@
-Upstream patch for DFG implementation for MIPS
-
-Signed-off-by: Markos Chandras <markos.chandras@imgtec.com>
-
-From c921d19863ccf66bdd0ffa5d38eaf05efab6b136 Mon Sep 17 00:00:00 2001
-From: "commit-queue at webkit.org"
- <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
-Date: Mon, 18 Feb 2013 19:25:23 +0000
-Subject: [PATCH] MIPS DFG implementation.
- https://bugs.webkit.org/show_bug.cgi?id=101328
-
-Patch by Balazs Kilvady <kilvadyb@homejinni.com> on 2013-02-18
-Reviewed by Oliver Hunt.
-
-DFG implementation for MIPS.
-
-Source/JavaScriptCore:
-
-* assembler/MIPSAssembler.h:
-(JSC::MIPSAssembler::MIPSAssembler):
-(JSC::MIPSAssembler::sllv):
-(JSC::MIPSAssembler::movd):
-(MIPSAssembler):
-(JSC::MIPSAssembler::negd):
-(JSC::MIPSAssembler::labelForWatchpoint):
-(JSC::MIPSAssembler::label):
-(JSC::MIPSAssembler::vmov):
-(JSC::MIPSAssembler::linkDirectJump):
-(JSC::MIPSAssembler::maxJumpReplacementSize):
-(JSC::MIPSAssembler::revertJumpToMove):
-(JSC::MIPSAssembler::replaceWithJump):
-* assembler/MacroAssembler.h:
-(MacroAssembler):
-(JSC::MacroAssembler::poke):
-* assembler/MacroAssemblerMIPS.h:
-(JSC::MacroAssemblerMIPS::add32):
-(MacroAssemblerMIPS):
-(JSC::MacroAssemblerMIPS::and32):
-(JSC::MacroAssemblerMIPS::lshift32):
-(JSC::MacroAssemblerMIPS::mul32):
-(JSC::MacroAssemblerMIPS::or32):
-(JSC::MacroAssemblerMIPS::rshift32):
-(JSC::MacroAssemblerMIPS::urshift32):
-(JSC::MacroAssemblerMIPS::sub32):
-(JSC::MacroAssemblerMIPS::xor32):
-(JSC::MacroAssemblerMIPS::store32):
-(JSC::MacroAssemblerMIPS::jump):
-(JSC::MacroAssemblerMIPS::branchAdd32):
-(JSC::MacroAssemblerMIPS::branchMul32):
-(JSC::MacroAssemblerMIPS::branchSub32):
-(JSC::MacroAssemblerMIPS::branchNeg32):
-(JSC::MacroAssemblerMIPS::call):
-(JSC::MacroAssemblerMIPS::loadDouble):
-(JSC::MacroAssemblerMIPS::moveDouble):
-(JSC::MacroAssemblerMIPS::swapDouble):
-(JSC::MacroAssemblerMIPS::subDouble):
-(JSC::MacroAssemblerMIPS::mulDouble):
-(JSC::MacroAssemblerMIPS::divDouble):
-(JSC::MacroAssemblerMIPS::negateDouble):
-(JSC::MacroAssemblerMIPS::branchEqual):
-(JSC::MacroAssemblerMIPS::branchNotEqual):
-(JSC::MacroAssemblerMIPS::branchTruncateDoubleToInt32):
-(JSC::MacroAssemblerMIPS::branchTruncateDoubleToUint32):
-(JSC::MacroAssemblerMIPS::truncateDoubleToInt32):
-(JSC::MacroAssemblerMIPS::truncateDoubleToUint32):
-(JSC::MacroAssemblerMIPS::branchDoubleNonZero):
-(JSC::MacroAssemblerMIPS::branchDoubleZeroOrNaN):
-(JSC::MacroAssemblerMIPS::invert):
-(JSC::MacroAssemblerMIPS::replaceWithJump):
-(JSC::MacroAssemblerMIPS::maxJumpReplacementSize):
-* dfg/DFGAssemblyHelpers.h:
-(AssemblyHelpers):
-(JSC::DFG::AssemblyHelpers::preserveReturnAddressAfterCall):
-(JSC::DFG::AssemblyHelpers::restoreReturnAddressBeforeReturn):
-(JSC::DFG::AssemblyHelpers::debugCall):
-* dfg/DFGCCallHelpers.h:
-(CCallHelpers):
-(JSC::DFG::CCallHelpers::setupArguments):
-(JSC::DFG::CCallHelpers::setupArgumentsWithExecState):
-* dfg/DFGFPRInfo.h:
-(DFG):
-(FPRInfo):
-(JSC::DFG::FPRInfo::toRegister):
-(JSC::DFG::FPRInfo::toIndex):
-(JSC::DFG::FPRInfo::debugName):
-* dfg/DFGGPRInfo.h:
-(DFG):
-(GPRInfo):
-(JSC::DFG::GPRInfo::toRegister):
-(JSC::DFG::GPRInfo::toIndex):
-(JSC::DFG::GPRInfo::debugName):
-* dfg/DFGSpeculativeJIT.h:
-(SpeculativeJIT):
-* jit/JSInterfaceJIT.h:
-(JSInterfaceJIT):
-* runtime/JSGlobalData.h:
-(JSC::ScratchBuffer::allocationSize):
-(ScratchBuffer):
-
-Source/WTF:
-
-* wtf/Platform.h:
-
-git-svn-id: http://svn.webkit.org/repository/webkit/trunk at 143247 268f45cc-cd09-0410-ab3c-d52691b4dbfc
----
- Source/JavaScriptCore/ChangeLog                    |  90 ++++
- Source/JavaScriptCore/assembler/MIPSAssembler.h    | 109 ++++-
- Source/JavaScriptCore/assembler/MacroAssembler.h   |   7 +
- .../JavaScriptCore/assembler/MacroAssemblerMIPS.h  | 480 +++++++++++++++++++--
- Source/JavaScriptCore/dfg/DFGAssemblyHelpers.h     |  19 +-
- Source/JavaScriptCore/dfg/DFGCCallHelpers.h        |  92 ++--
- Source/JavaScriptCore/dfg/DFGFPRInfo.h             |  68 +++
- Source/JavaScriptCore/dfg/DFGGPRInfo.h             |  67 +++
- Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h      |   4 +-
- Source/JavaScriptCore/jit/JSInterfaceJIT.h         |   4 +
- Source/JavaScriptCore/runtime/JSGlobalData.h       |   6 +-
- Source/WTF/ChangeLog                               |  11 +
- Source/WTF/wtf/Platform.h                          |   4 +
- 13 files changed, 888 insertions(+), 73 deletions(-)
-
-diff --git a/Source/JavaScriptCore/assembler/MIPSAssembler.h b/Source/JavaScriptCore/assembler/MIPSAssembler.h
-index 026f87e..7f553bb 100644
---- a/Source/JavaScriptCore/assembler/MIPSAssembler.h
-+++ b/Source/JavaScriptCore/assembler/MIPSAssembler.h
-@@ -152,6 +152,8 @@ public:
-     typedef SegmentedVector<AssemblerLabel, 64> Jumps;
- 
-     MIPSAssembler()
-+        : m_indexOfLastWatchpoint(INT_MIN)
-+        , m_indexOfTailOfLastWatchpoint(INT_MIN)
-     {
-     }
- 
-@@ -325,7 +327,7 @@ public:
-         emitInst(0x00000000 | (rd << OP_SH_RD) | (rt << OP_SH_RT) | ((shamt & 0x1f) << OP_SH_SHAMT));
-     }
- 
--    void sllv(RegisterID rd, RegisterID rt, int rs)
-+    void sllv(RegisterID rd, RegisterID rt, RegisterID rs)
-     {
-         emitInst(0x00000004 | (rd << OP_SH_RD) | (rt << OP_SH_RT) | (rs << OP_SH_RS));
-     }
-@@ -527,6 +529,16 @@ public:
-         emitInst(0x46200004 | (fd << OP_SH_FD) | (fs << OP_SH_FS));
-     }
- 
-+    void movd(FPRegisterID fd, FPRegisterID fs)
-+    {
-+        emitInst(0x46200006 | (fd << OP_SH_FD) | (fs << OP_SH_FS));
-+    }
-+
-+    void negd(FPRegisterID fd, FPRegisterID fs)
-+    {
-+        emitInst(0x46200007 | (fd << OP_SH_FD) | (fs << OP_SH_FS));
-+    }
-+
-     void truncwd(FPRegisterID fd, FPRegisterID fs)
-     {
-         emitInst(0x4620000d | (fd << OP_SH_FD) | (fs << OP_SH_FS));
-@@ -619,9 +631,24 @@ public:
-         return m_buffer.label();
-     }
- 
-+    AssemblerLabel labelForWatchpoint()
-+    {
-+        AssemblerLabel result = m_buffer.label();
-+        if (static_cast<int>(result.m_offset) != m_indexOfLastWatchpoint)
-+            result = label();
-+        m_indexOfLastWatchpoint = result.m_offset;
-+        m_indexOfTailOfLastWatchpoint = result.m_offset + maxJumpReplacementSize();
-+        return result;
-+    }
-+
-     AssemblerLabel label()
-     {
--        return m_buffer.label();
-+        AssemblerLabel result = m_buffer.label();
-+        while (UNLIKELY(static_cast<int>(result.m_offset) < m_indexOfTailOfLastWatchpoint)) {
-+            nop();
-+            result = m_buffer.label();
-+        }
-+        return result;
-     }
- 
-     AssemblerLabel align(int alignment)
-@@ -664,14 +691,24 @@ public:
-     // Assembly helpers for moving data between fp and registers.
-     void vmov(RegisterID rd1, RegisterID rd2, FPRegisterID rn)
-     {
-+#if WTF_MIPS_ISA_REV(2) && WTF_MIPS_FP64
-+        mfc1(rd1, rn);
-+        mfhc1(rd2, rn);
-+#else
-         mfc1(rd1, rn);
-         mfc1(rd2, FPRegisterID(rn + 1));
-+#endif
-     }
- 
-     void vmov(FPRegisterID rd, RegisterID rn1, RegisterID rn2)
-     {
-+#if WTF_MIPS_ISA_REV(2) && WTF_MIPS_FP64
-+        mtc1(rn1, rd);
-+        mthc1(rn2, rd);
-+#else
-         mtc1(rn1, rd);
-         mtc1(rn2, FPRegisterID(rd + 1));
-+#endif
-     }
- 
-     static unsigned getCallReturnOffset(AssemblerLabel call)
-@@ -688,6 +725,35 @@ public:
-     // writable region of memory; to modify the code in an execute-only execuable
-     // pool the 'repatch' and 'relink' methods should be used.
- 
-+    static size_t linkDirectJump(void* code, void* to)
-+    {
-+        MIPSWord* insn = reinterpret_cast<MIPSWord*>(reinterpret_cast<intptr_t>(code));
-+        size_t ops = 0;
-+        int32_t slotAddr = reinterpret_cast<int>(insn) + 4;
-+        int32_t toAddr = reinterpret_cast<int>(to);
-+
-+        if ((slotAddr & 0xf0000000) != (toAddr & 0xf0000000)) {
-+            // lui
-+            *insn = 0x3c000000 | (MIPSRegisters::t9 << OP_SH_RT) | ((toAddr >> 16) & 0xffff);
-+            ++insn;
-+            // ori
-+            *insn = 0x34000000 | (MIPSRegisters::t9 << OP_SH_RT) | (MIPSRegisters::t9 << OP_SH_RS) | (toAddr & 0xffff);
-+            ++insn;
-+            // jr
-+            *insn = 0x00000008 | (MIPSRegisters::t9 << OP_SH_RS);
-+            ++insn;
-+            ops = 4 * sizeof(MIPSWord);
-+        } else {
-+            // j
-+            *insn = 0x08000000 | ((toAddr & 0x0fffffff) >> 2);
-+            ++insn;
-+            ops = 2 * sizeof(MIPSWord);
-+        }
-+        // nop
-+        *insn = 0x00000000;
-+        return ops;
-+    }
-+
-     void linkJump(AssemblerLabel from, AssemblerLabel to)
-     {
-         ASSERT(to.isSet());
-@@ -825,29 +891,36 @@ public:
- #endif
-     }
- 
--    static void revertJumpToMove(void* instructionStart, RegisterID rt, int imm)
-+    static ptrdiff_t maxJumpReplacementSize()
-     {
--        MIPSWord* insn = static_cast<MIPSWord*>(instructionStart) + 1;
--        ASSERT((*insn & 0xfc000000) == 0x34000000);
--        *insn = (*insn & 0xfc1f0000) | (imm & 0xffff);
--        cacheFlush(insn, sizeof(MIPSWord));
-+        return sizeof(MIPSWord) * 4;
-     }
- 
--    static void replaceWithJump(void* instructionStart, void* to)
-+    static void revertJumpToMove(void* instructionStart, RegisterID rt, int imm)
-     {
--        MIPSWord* instruction = reinterpret_cast<MIPSWord*>(instructionStart);
--        intptr_t jumpTo = reinterpret_cast<intptr_t>(to);
-+        MIPSWord* insn = static_cast<MIPSWord*>(instructionStart);
-+        size_t codeSize = 2 * sizeof(MIPSWord);
- 
-         // lui
--        instruction[0] = 0x3c000000 | (MIPSRegisters::t9 << OP_SH_RT) | ((jumpTo >> 16) & 0xffff);
-+        *insn = 0x3c000000 | (rt << OP_SH_RT) | ((imm >> 16) & 0xffff);
-+        ++insn;
-         // ori
--        instruction[1] = 0x34000000 | (MIPSRegisters::t9 << OP_SH_RT) | (MIPSRegisters::t9 << OP_SH_RS) | (jumpTo & 0xffff);
--        // jr
--        instruction[2] = 0x00000008 | (MIPSRegisters::t9 << OP_SH_RS);
--        // nop
--        instruction[3] = 0x0;
-+        *insn = 0x34000000 | (rt << OP_SH_RS) | (rt << OP_SH_RT) | (imm & 0xffff);
-+        ++insn;
-+        // if jr $t9
-+        if (*insn == 0x03200008) {
-+            *insn = 0x00000000;
-+            codeSize += sizeof(MIPSWord);
-+        }
-+        cacheFlush(insn, codeSize);
-+    }
- 
--        cacheFlush(instruction, sizeof(MIPSWord) * 4);
-+    static void replaceWithJump(void* instructionStart, void* to)
-+    {
-+        ASSERT(!(bitwise_cast<uintptr_t>(instructionStart) & 3));
-+        ASSERT(!(bitwise_cast<uintptr_t>(to) & 3));
-+        size_t ops = linkDirectJump(instructionStart, to);
-+        cacheFlush(instructionStart, ops);
-     }
- 
-     static void replaceWithLoad(void* instructionStart)
-@@ -1023,6 +1096,8 @@ private:
- 
-     AssemblerBuffer m_buffer;
-     Jumps m_jumps;
-+    int m_indexOfLastWatchpoint;
-+    int m_indexOfTailOfLastWatchpoint;
- };
- 
- } // namespace JSC
-diff --git a/Source/JavaScriptCore/assembler/MacroAssembler.h b/Source/JavaScriptCore/assembler/MacroAssembler.h
-index 60a93db..1f0c3de 100644
---- a/Source/JavaScriptCore/assembler/MacroAssembler.h
-+++ b/Source/JavaScriptCore/assembler/MacroAssembler.h
-@@ -200,6 +200,13 @@ public:
-     }
- #endif
-     
-+#if CPU(MIPS)
-+    void poke(FPRegisterID src, int index = 0)
-+    {
-+        ASSERT(!(index & 1));
-+        storeDouble(src, addressForPoke(index));
-+    }
-+#endif
- 
-     // Backwards banches, these are currently all implemented using existing forwards branch mechanisms.
-     void branchPtr(RelationalCondition cond, RegisterID op1, TrustedImmPtr imm, Label target)
-diff --git a/Source/JavaScriptCore/assembler/MacroAssemblerMIPS.h b/Source/JavaScriptCore/assembler/MacroAssemblerMIPS.h
-index 43ad434..4f14960 100644
---- a/Source/JavaScriptCore/assembler/MacroAssemblerMIPS.h
-+++ b/Source/JavaScriptCore/assembler/MacroAssemblerMIPS.h
-@@ -114,6 +114,11 @@ public:
-         m_assembler.addu(dest, dest, src);
-     }
- 
-+    void add32(RegisterID op1, RegisterID op2, RegisterID dest)
-+    {
-+        m_assembler.addu(dest, op1, op2);
-+    }
-+
-     void add32(TrustedImm32 imm, RegisterID dest)
-     {
-         add32(imm, dest, dest);
-@@ -267,6 +272,11 @@ public:
-         m_assembler.andInsn(dest, dest, src);
-     }
- 
-+    void and32(RegisterID op1, RegisterID op2, RegisterID dest)
-+    {
-+        m_assembler.andInsn(dest, op1, op2);
-+    }
-+
-     void and32(TrustedImm32 imm, RegisterID dest)
-     {
-         if (!imm.m_value && !m_fixedWidth)
-@@ -283,9 +293,16 @@ public:
-         }
-     }
- 
--    void lshift32(TrustedImm32 imm, RegisterID dest)
-+    void and32(TrustedImm32 imm, RegisterID src, RegisterID dest)
-     {
--        m_assembler.sll(dest, dest, imm.m_value);
-+        if (!imm.m_value && !m_fixedWidth)
-+            move(MIPSRegisters::zero, dest);
-+        else if (imm.m_value > 0 && imm.m_value < 65535 && !m_fixedWidth)
-+            m_assembler.andi(dest, src, imm.m_value);
-+        else {
-+            move(imm, immTempRegister);
-+            m_assembler.andInsn(dest, src, immTempRegister);
-+        }
-     }
- 
-     void lshift32(RegisterID shiftAmount, RegisterID dest)
-@@ -293,11 +310,33 @@ public:
-         m_assembler.sllv(dest, dest, shiftAmount);
-     }
- 
-+    void lshift32(RegisterID src, RegisterID shiftAmount, RegisterID dest)
-+    {
-+        m_assembler.sllv(dest, src, shiftAmount);
-+    }
-+
-+    void lshift32(TrustedImm32 imm, RegisterID dest)
-+    {
-+        move(imm, immTempRegister);
-+        m_assembler.sllv(dest, dest, immTempRegister);
-+    }
-+
-+    void lshift32(RegisterID src, TrustedImm32 imm, RegisterID dest)
-+    {
-+        move(imm, immTempRegister);
-+        m_assembler.sllv(dest, src, immTempRegister);
-+    }
-+
-     void mul32(RegisterID src, RegisterID dest)
-     {
-         m_assembler.mul(dest, dest, src);
-     }
- 
-+    void mul32(RegisterID op1, RegisterID op2, RegisterID dest)
-+    {
-+        m_assembler.mul(dest, op1, op2);
-+    }
-+
-     void mul32(TrustedImm32 imm, RegisterID src, RegisterID dest)
-     {
-         if (!imm.m_value && !m_fixedWidth)
-@@ -348,6 +387,24 @@ public:
-         m_assembler.orInsn(dest, dest, dataTempRegister);
-     }
- 
-+    void or32(TrustedImm32 imm, RegisterID src, RegisterID dest)
-+    {
-+        if (!imm.m_value && !m_fixedWidth)
-+            return;
-+
-+        if (imm.m_value > 0 && imm.m_value < 65535 && !m_fixedWidth) {
-+            m_assembler.ori(dest, src, imm.m_value);
-+            return;
-+        }
-+
-+        /*
-+            li      dataTemp, imm
-+            or      dest, src, dataTemp
-+        */
-+        move(imm, dataTempRegister);
-+        m_assembler.orInsn(dest, src, dataTempRegister);
-+    }
-+
-     void or32(RegisterID src, AbsoluteAddress dest)
-     {
-         load32(dest.m_ptr, dataTempRegister);
-@@ -360,6 +417,11 @@ public:
-         m_assembler.srav(dest, dest, shiftAmount);
-     }
- 
-+    void rshift32(RegisterID src, RegisterID shiftAmount, RegisterID dest)
-+    {
-+        m_assembler.srav(dest, src, shiftAmount);
-+    }
-+
-     void rshift32(TrustedImm32 imm, RegisterID dest)
-     {
-         m_assembler.sra(dest, dest, imm.m_value);
-@@ -375,16 +437,31 @@ public:
-         m_assembler.srlv(dest, dest, shiftAmount);
-     }
- 
-+    void urshift32(RegisterID src, RegisterID shiftAmount, RegisterID dest)
-+    {
-+        m_assembler.srlv(dest, src, shiftAmount);
-+    }
-+
-     void urshift32(TrustedImm32 imm, RegisterID dest)
-     {
-         m_assembler.srl(dest, dest, imm.m_value);
-     }
- 
-+    void urshift32(RegisterID src, TrustedImm32 imm, RegisterID dest)
-+    {
-+        m_assembler.srl(dest, src, imm.m_value);
-+    }
-+
-     void sub32(RegisterID src, RegisterID dest)
-     {
-         m_assembler.subu(dest, dest, src);
-     }
- 
-+    void sub32(RegisterID op1, RegisterID op2, RegisterID dest)
-+    {
-+        m_assembler.subu(dest, op1, op2);
-+    }
-+
-     void sub32(TrustedImm32 imm, RegisterID dest)
-     {
-         if (imm.m_value >= -32767 && imm.m_value <= 32768
-@@ -495,6 +572,11 @@ public:
-         m_assembler.xorInsn(dest, dest, src);
-     }
- 
-+    void xor32(RegisterID op1, RegisterID op2, RegisterID dest)
-+    {
-+        m_assembler.xorInsn(dest, op1, op2);
-+    }
-+
-     void xor32(TrustedImm32 imm, RegisterID dest)
-     {
-         if (imm.m_value == -1) {
-@@ -510,6 +592,21 @@ public:
-         m_assembler.xorInsn(dest, dest, immTempRegister);
-     }
- 
-+    void xor32(TrustedImm32 imm, RegisterID src, RegisterID dest)
-+    {
-+        if (imm.m_value == -1) {
-+            m_assembler.nor(dest, src, MIPSRegisters::zero);
-+            return;
-+        }
-+
-+        /*
-+            li  immTemp, imm
-+            xor dest, dest, immTemp
-+        */
-+        move(imm, immTempRegister);
-+        m_assembler.xorInsn(dest, src, immTempRegister);
-+    }
-+
-     void sqrtDouble(FPRegisterID src, FPRegisterID dst)
-     {
-         m_assembler.sqrtd(dst, src);
-@@ -989,6 +1086,44 @@ public:
-         }
-     }
- 
-+    void store32(TrustedImm32 imm, BaseIndex address)
-+    {
-+        if (address.offset >= -32768 && address.offset <= 32767 && !m_fixedWidth) {
-+            /*
-+                sll     addrTemp, address.index, address.scale
-+                addu    addrTemp, addrTemp, address.base
-+                sw      src, address.offset(addrTemp)
-+            */
-+            m_assembler.sll(addrTempRegister, address.index, address.scale);
-+            m_assembler.addu(addrTempRegister, addrTempRegister, address.base);
-+            if (!imm.m_value)
-+                m_assembler.sw(MIPSRegisters::zero, addrTempRegister, address.offset);
-+            else {
-+                move(imm, immTempRegister);
-+                m_assembler.sw(immTempRegister, addrTempRegister, address.offset);
-+            }
-+        } else {
-+            /*
-+                sll     addrTemp, address.index, address.scale
-+                addu    addrTemp, addrTemp, address.base
-+                lui     immTemp, (address.offset + 0x8000) >> 16
-+                addu    addrTemp, addrTemp, immTemp
-+                sw      src, (address.offset & 0xffff)(at)
-+            */
-+            m_assembler.sll(addrTempRegister, address.index, address.scale);
-+            m_assembler.addu(addrTempRegister, addrTempRegister, address.base);
-+            m_assembler.lui(immTempRegister, (address.offset + 0x8000) >> 16);
-+            m_assembler.addu(addrTempRegister, addrTempRegister, immTempRegister);
-+            if (!imm.m_value && !m_fixedWidth)
-+                m_assembler.sw(MIPSRegisters::zero, addrTempRegister, address.offset);
-+            else {
-+                move(imm, immTempRegister);
-+                m_assembler.sw(immTempRegister, addrTempRegister, address.offset);
-+            }
-+        }
-+    }
-+
-+
-     void store32(RegisterID src, const void* address)
-     {
-         /*
-@@ -1336,6 +1471,15 @@ public:
-         m_fixedWidth = false;
-     }
- 
-+    void jump(AbsoluteAddress address)
-+    {
-+        m_fixedWidth = true;
-+        load32(address.m_ptr, MIPSRegisters::t9);
-+        m_assembler.jr(MIPSRegisters::t9);
-+        m_assembler.nop();
-+        m_fixedWidth = false;
-+    }
-+
-     void moveDoubleToInts(FPRegisterID src, RegisterID dest1, RegisterID dest2)
-     {
-         m_assembler.vmov(dest1, dest2, src);
-@@ -1404,6 +1548,53 @@ public:
-         return Jump();
-     }
- 
-+    Jump branchAdd32(ResultCondition cond, RegisterID op1, RegisterID op2, RegisterID dest)
-+    {
-+        ASSERT((cond == Overflow) || (cond == Signed) || (cond == Zero) || (cond == NonZero));
-+        if (cond == Overflow) {
-+            /*
-+                move    dataTemp, op1
-+                xor     cmpTemp, dataTemp, op2
-+                bltz    cmpTemp, No_overflow    # diff sign bit -> no overflow
-+                addu    dest, dataTemp, op2
-+                xor     cmpTemp, dest, dataTemp
-+                bgez    cmpTemp, No_overflow    # same sign big -> no overflow
-+                nop
-+                b       Overflow
-+                nop
-+                nop
-+                nop
-+                nop
-+                nop
-+            No_overflow:
-+            */
-+            move(op1, dataTempRegister);
-+            m_assembler.xorInsn(cmpTempRegister, dataTempRegister, op2);
-+            m_assembler.bltz(cmpTempRegister, 10);
-+            m_assembler.addu(dest, dataTempRegister, op2);
-+            m_assembler.xorInsn(cmpTempRegister, dest, dataTempRegister);
-+            m_assembler.bgez(cmpTempRegister, 7);
-+            m_assembler.nop();
-+            return jump();
-+        }
-+        if (cond == Signed) {
-+            add32(op1, op2, dest);
-+            // Check if dest is negative.
-+            m_assembler.slt(cmpTempRegister, dest, MIPSRegisters::zero);
-+            return branchNotEqual(cmpTempRegister, MIPSRegisters::zero);
-+        }
-+        if (cond == Zero) {
-+            add32(op1, op2, dest);
-+            return branchEqual(dest, MIPSRegisters::zero);
-+        }
-+        if (cond == NonZero) {
-+            add32(op1, op2, dest);
-+            return branchNotEqual(dest, MIPSRegisters::zero);
-+        }
-+        ASSERT(0);
-+        return Jump();
-+    }
-+
-     Jump branchAdd32(ResultCondition cond, TrustedImm32 imm, RegisterID dest)
-     {
-         move(imm, immTempRegister);
-@@ -1417,6 +1608,111 @@ public:
-         return branchAdd32(cond, immTempRegister, dest);
-     }
- 
-+    Jump branchAdd32(ResultCondition cond, TrustedImm32 imm, AbsoluteAddress dest)
-+    {
-+        ASSERT((cond == Overflow) || (cond == Signed) || (cond == Zero) || (cond == NonZero));
-+        if (cond == Overflow) {
-+            /*
-+                move    dataTemp, dest
-+                xori    cmpTemp, dataTemp, imm
-+                bltz    cmpTemp, No_overflow    # diff sign bit -> no overflow
-+                addiu   dataTemp, dataTemp, imm
-+                move    dest, dataTemp
-+                xori    cmpTemp, dataTemp, imm
-+                bgez    cmpTemp, No_overflow    # same sign big -> no overflow
-+                nop
-+                b       Overflow
-+                nop
-+                nop
-+                nop
-+                nop
-+                nop
-+            No_overflow:
-+            */
-+            if (imm.m_value >= -32768 && imm.m_value  <= 32767 && !m_fixedWidth) {
-+                load32(dest.m_ptr, dataTempRegister);
-+                m_assembler.xori(cmpTempRegister, dataTempRegister, imm.m_value);
-+                m_assembler.bltz(cmpTempRegister, 10);
-+                m_assembler.addiu(dataTempRegister, dataTempRegister, imm.m_value);
-+                store32(dataTempRegister, dest.m_ptr);
-+                m_assembler.xori(cmpTempRegister, dataTempRegister, imm.m_value);
-+                m_assembler.bgez(cmpTempRegister, 7);
-+                m_assembler.nop();
-+            } else {
-+                load32(dest.m_ptr, dataTempRegister);
-+                move(imm, immTempRegister);
-+                m_assembler.xorInsn(cmpTempRegister, dataTempRegister, immTempRegister);
-+                m_assembler.bltz(cmpTempRegister, 10);
-+                m_assembler.addiu(dataTempRegister, dataTempRegister, immTempRegister);
-+                store32(dataTempRegister, dest.m_ptr);
-+                m_assembler.xori(cmpTempRegister, dataTempRegister, immTempRegister);
-+                m_assembler.bgez(cmpTempRegister, 7);
-+                m_assembler.nop();
-+            }
-+            return jump();
-+        }
-+        move(imm, immTempRegister);
-+        load32(dest.m_ptr, dataTempRegister);
-+        add32(immTempRegister, dataTempRegister);
-+        store32(dataTempRegister, dest.m_ptr);
-+        if (cond == Signed) {
-+            // Check if dest is negative.
-+            m_assembler.slt(cmpTempRegister, dataTempRegister, MIPSRegisters::zero);
-+            return branchNotEqual(cmpTempRegister, MIPSRegisters::zero);
-+        }
-+        if (cond == Zero)
-+            return branchEqual(dataTempRegister, MIPSRegisters::zero);
-+        if (cond == NonZero)
-+            return branchNotEqual(dataTempRegister, MIPSRegisters::zero);
-+        ASSERT(0);
-+        return Jump();
-+    }
-+
-+    Jump branchMul32(ResultCondition cond, RegisterID src1, RegisterID src2, RegisterID dest)
-+    {
-+        ASSERT((cond == Overflow) || (cond == Signed) || (cond == Zero) || (cond == NonZero));
-+        if (cond == Overflow) {
-+            /*
-+                mult    src, dest
-+                mfhi    dataTemp
-+                mflo    dest
-+                sra     addrTemp, dest, 31
-+                beq     dataTemp, addrTemp, No_overflow # all sign bits (bit 63 to bit 31) are the same -> no overflow
-+                nop
-+                b       Overflow
-+                nop
-+                nop
-+                nop
-+                nop
-+                nop
-+            No_overflow:
-+            */
-+            m_assembler.mult(src1, src2);
-+            m_assembler.mfhi(dataTempRegister);
-+            m_assembler.mflo(dest);
-+            m_assembler.sra(addrTempRegister, dest, 31);
-+            m_assembler.beq(dataTempRegister, addrTempRegister, 7);
-+            m_assembler.nop();
-+            return jump();
-+        }
-+        if (cond == Signed) {
-+            mul32(src1, src2, dest);
-+            // Check if dest is negative.
-+            m_assembler.slt(cmpTempRegister, dest, MIPSRegisters::zero);
-+            return branchNotEqual(cmpTempRegister, MIPSRegisters::zero);
-+        }
-+        if (cond == Zero) {
-+            mul32(src1, src2, dest);
-+            return branchEqual(dest, MIPSRegisters::zero);
-+        }
-+        if (cond == NonZero) {
-+            mul32(src1, src2, dest);
-+            return branchNotEqual(dest, MIPSRegisters::zero);
-+        }
-+        ASSERT(0);
-+        return Jump();
-+    }
-+
-     Jump branchMul32(ResultCondition cond, RegisterID src, RegisterID dest)
-     {
-         ASSERT((cond == Overflow) || (cond == Signed) || (cond == Zero) || (cond == NonZero));
-@@ -1465,8 +1761,7 @@ public:
-     Jump branchMul32(ResultCondition cond, TrustedImm32 imm, RegisterID src, RegisterID dest)
-     {
-         move(imm, immTempRegister);
--        move(src, dest);
--        return branchMul32(cond, immTempRegister, dest);
-+        return branchMul32(cond, immTempRegister, src, dest);
-     }
- 
-     Jump branchSub32(ResultCondition cond, RegisterID src, RegisterID dest)
-@@ -1525,8 +1820,60 @@ public:
-     Jump branchSub32(ResultCondition cond, RegisterID src, TrustedImm32 imm, RegisterID dest)
-     {
-         move(imm, immTempRegister);
--        move(src, dest);
--        return branchSub32(cond, immTempRegister, dest);
-+        return branchSub32(cond, src, immTempRegister, dest);
-+    }
-+
-+    Jump branchSub32(ResultCondition cond, RegisterID op1, RegisterID op2, RegisterID dest)
-+    {
-+        ASSERT((cond == Overflow) || (cond == Signed) || (cond == Zero) || (cond == NonZero));
-+        if (cond == Overflow) {
-+            /*
-+                move    dataTemp, op1
-+                xor     cmpTemp, dataTemp, op2
-+                bgez    cmpTemp, No_overflow    # same sign bit -> no overflow
-+                subu    dest, dataTemp, op2
-+                xor     cmpTemp, dest, dataTemp
-+                bgez    cmpTemp, No_overflow    # same sign bit -> no overflow
-+                nop
-+                b       Overflow
-+                nop
-+                nop
-+                nop
-+                nop
-+                nop
-+            No_overflow:
-+            */
-+            move(op1, dataTempRegister);
-+            m_assembler.xorInsn(cmpTempRegister, dataTempRegister, op2);
-+            m_assembler.bgez(cmpTempRegister, 10);
-+            m_assembler.subu(dest, dataTempRegister, op2);
-+            m_assembler.xorInsn(cmpTempRegister, dest, dataTempRegister);
-+            m_assembler.bgez(cmpTempRegister, 7);
-+            m_assembler.nop();
-+            return jump();
-+        }
-+        if (cond == Signed) {
-+            sub32(op1, op2, dest);
-+            // Check if dest is negative.
-+            m_assembler.slt(cmpTempRegister, dest, MIPSRegisters::zero);
-+            return branchNotEqual(cmpTempRegister, MIPSRegisters::zero);
-+        }
-+        if (cond == Zero) {
-+            sub32(op1, op2, dest);
-+            return branchEqual(dest, MIPSRegisters::zero);
-+        }
-+        if (cond == NonZero) {
-+            sub32(op1, op2, dest);
-+            return branchNotEqual(dest, MIPSRegisters::zero);
-+        }
-+        ASSERT(0);
-+        return Jump();
-+    }
-+
-+    Jump branchNeg32(ResultCondition cond, RegisterID srcDest)
-+    {
-+        m_assembler.li(dataTempRegister, -1);
-+        return branchMul32(cond, dataTempRegister, srcDest);
-     }
- 
-     Jump branchOr32(ResultCondition cond, RegisterID src, RegisterID dest)
-@@ -1578,7 +1925,8 @@ public:
- 
-     Call call(RegisterID target)
-     {
--        m_assembler.jalr(target);
-+        move(target, MIPSRegisters::t9);
-+        m_assembler.jalr(MIPSRegisters::t9);
-         m_assembler.nop();
-         return Call(m_assembler.label(), Call::None);
-     }
-@@ -1822,7 +2170,7 @@ public:
-                 lui     immTemp, (address.offset + 0x8000) >> 16
-                 addu    addrTemp, addrTemp, immTemp
-                 lwc1    dest, (address.offset & 0xffff)(at)
--                lwc1    dest+4, (address.offset & 0xffff + 4)(at)
-+                lwc1    dest+1, (address.offset & 0xffff + 4)(at)
-             */
-             m_assembler.sll(addrTempRegister, address.index, address.scale);
-             m_assembler.addu(addrTempRegister, addrTempRegister, address.base);
-@@ -2009,6 +2357,19 @@ public:
- #endif
-     }
- 
-+    void moveDouble(FPRegisterID src, FPRegisterID dest)
-+    {
-+        if (src != dest || m_fixedWidth)
-+            m_assembler.movd(dest, src);
-+    }
-+
-+    void swapDouble(FPRegisterID fr1, FPRegisterID fr2)
-+    {
-+        moveDouble(fr1, fpTempRegister);
-+        moveDouble(fr2, fr1);
-+        moveDouble(fpTempRegister, fr2);
-+    }
-+
-     void addDouble(FPRegisterID src, FPRegisterID dest)
-     {
-         m_assembler.addd(dest, dest, src);
-@@ -2036,6 +2397,11 @@ public:
-         m_assembler.subd(dest, dest, src);
-     }
- 
-+    void subDouble(FPRegisterID op1, FPRegisterID op2, FPRegisterID dest)
-+    {
-+        m_assembler.subd(dest, op1, op2);
-+    }
-+
-     void subDouble(Address src, FPRegisterID dest)
-     {
-         loadDouble(src, fpTempRegister);
-@@ -2053,11 +2419,32 @@ public:
-         m_assembler.muld(dest, dest, fpTempRegister);
-     }
- 
-+    void mulDouble(FPRegisterID op1, FPRegisterID op2, FPRegisterID dest)
-+    {
-+        m_assembler.muld(dest, op1, op2);
-+    }
-+
-     void divDouble(FPRegisterID src, FPRegisterID dest)
-     {
-         m_assembler.divd(dest, dest, src);
-     }
- 
-+    void divDouble(FPRegisterID op1, FPRegisterID op2, FPRegisterID dest)
-+    {
-+        m_assembler.divd(dest, op1, op2);
-+    }
-+
-+    void divDouble(Address src, FPRegisterID dest)
-+    {
-+        loadDouble(src, fpTempRegister);
-+        m_assembler.divd(dest, dest, fpTempRegister);
-+    }
-+
-+    void negateDouble(FPRegisterID src, FPRegisterID dest)
-+    {
-+        m_assembler.negd(dest, src);
-+    }
-+
-     void convertInt32ToDouble(RegisterID src, FPRegisterID dest)
-     {
-         m_assembler.mtc1(src, fpTempRegister);
-@@ -2117,6 +2504,8 @@ public:
- 
-     Jump branchEqual(RegisterID rs, RegisterID rt)
-     {
-+        m_assembler.nop();
-+        m_assembler.nop();
-         m_assembler.appendJump();
-         m_assembler.beq(rs, rt, 0);
-         m_assembler.nop();
-@@ -2126,6 +2515,8 @@ public:
- 
-     Jump branchNotEqual(RegisterID rs, RegisterID rt)
-     {
-+        m_assembler.nop();
-+        m_assembler.nop();
-         m_assembler.appendJump();
-         m_assembler.bne(rs, rt, 0);
-         m_assembler.nop();
-@@ -2192,11 +2583,33 @@ public:
-     // If the result is not representable as a 32 bit value, branch.
-     // May also branch for some values that are representable in 32 bits
-     // (specifically, in this case, INT_MAX 0x7fffffff).
--    Jump branchTruncateDoubleToInt32(FPRegisterID src, RegisterID dest)
-+    enum BranchTruncateType { BranchIfTruncateFailed, BranchIfTruncateSuccessful };
-+    Jump branchTruncateDoubleToInt32(FPRegisterID src, RegisterID dest, BranchTruncateType branchType = BranchIfTruncateFailed)
-+    {
-+        m_assembler.truncwd(fpTempRegister, src);
-+        m_assembler.mfc1(dest, fpTempRegister);
-+        return branch32(branchType == BranchIfTruncateFailed ? Equal : NotEqual, dest, TrustedImm32(0x7fffffff));
-+    }
-+
-+    Jump branchTruncateDoubleToUint32(FPRegisterID src, RegisterID dest, BranchTruncateType branchType = BranchIfTruncateFailed)
-+    {
-+        m_assembler.truncwd(fpTempRegister, src);
-+        m_assembler.mfc1(dest, fpTempRegister);
-+        return branch32(branchType == BranchIfTruncateFailed ? Equal : NotEqual, dest, TrustedImm32(0));
-+    }
-+
-+    // Result is undefined if the value is outside of the integer range.
-+    void truncateDoubleToInt32(FPRegisterID src, RegisterID dest)
-+    {
-+        m_assembler.truncwd(fpTempRegister, src);
-+        m_assembler.mfc1(dest, fpTempRegister);
-+    }
-+
-+    // Result is undefined if src > 2^31
-+    void truncateDoubleToUint32(FPRegisterID src, RegisterID dest)
-     {
-         m_assembler.truncwd(fpTempRegister, src);
-         m_assembler.mfc1(dest, fpTempRegister);
--        return branch32(Equal, dest, TrustedImm32(0x7fffffff));
-     }
- 
-     // Convert 'src' to an integer, and places the resulting 'dest'.
-@@ -2218,28 +2631,43 @@ public:
- 
-     Jump branchDoubleNonZero(FPRegisterID reg, FPRegisterID scratch)
-     {
--#if WTF_MIPS_ISA_REV(2) && WTF_MIPS_FP64
--        m_assembler.mtc1(MIPSRegisters::zero, scratch);
--        m_assembler.mthc1(MIPSRegisters::zero, scratch);
--#else
--        m_assembler.mtc1(MIPSRegisters::zero, scratch);
--        m_assembler.mtc1(MIPSRegisters::zero, FPRegisterID(scratch + 1));
--#endif
-+        m_assembler.vmov(scratch, MIPSRegisters::zero, MIPSRegisters::zero);
-         return branchDouble(DoubleNotEqual, reg, scratch);
-     }
- 
-     Jump branchDoubleZeroOrNaN(FPRegisterID reg, FPRegisterID scratch)
-     {
--#if WTF_MIPS_ISA_REV(2) && WTF_MIPS_FP64
--        m_assembler.mtc1(MIPSRegisters::zero, scratch);
--        m_assembler.mthc1(MIPSRegisters::zero, scratch);
--#else
--        m_assembler.mtc1(MIPSRegisters::zero, scratch);
--        m_assembler.mtc1(MIPSRegisters::zero, FPRegisterID(scratch + 1));
--#endif
-+        m_assembler.vmov(scratch, MIPSRegisters::zero, MIPSRegisters::zero);
-         return branchDouble(DoubleEqualOrUnordered, reg, scratch);
-     }
- 
-+    // Invert a relational condition, e.g. == becomes !=, < becomes >=, etc.
-+    static RelationalCondition invert(RelationalCondition cond)
-+    {
-+        RelationalCondition r;
-+        if (cond == Equal)
-+            r = NotEqual;
-+        else if (cond == NotEqual)
-+            r = Equal;
-+        else if (cond == Above)
-+            r = BelowOrEqual;
-+        else if (cond == AboveOrEqual)
-+            r = Below;
-+        else if (cond == Below)
-+            r = AboveOrEqual;
-+        else if (cond == BelowOrEqual)
-+            r = Above;
-+        else if (cond == GreaterThan)
-+            r = LessThanOrEqual;
-+        else if (cond == GreaterThanOrEqual)
-+            r = LessThan;
-+        else if (cond == LessThan)
-+            r = GreaterThanOrEqual;
-+        else if (cond == LessThanOrEqual)
-+            r = GreaterThan;
-+        return r;
-+    }
-+
-     void nop()
-     {
-         m_assembler.nop();
-@@ -2252,12 +2680,12 @@ public:
- 
-     static void replaceWithJump(CodeLocationLabel instructionStart, CodeLocationLabel destination)
-     {
--        RELEASE_ASSERT_NOT_REACHED();
-+        MIPSAssembler::replaceWithJump(instructionStart.dataLocation(), destination.dataLocation());
-     }
-     
-     static ptrdiff_t maxJumpReplacementSize()
-     {
--        RELEASE_ASSERT_NOT_REACHED();
-+        MIPSAssembler::maxJumpReplacementSize();
-         return 0;
-     }
- 
-diff --git a/Source/JavaScriptCore/dfg/DFGAssemblyHelpers.h b/Source/JavaScriptCore/dfg/DFGAssemblyHelpers.h
-index fa0f5e0..573d8dc 100644
---- a/Source/JavaScriptCore/dfg/DFGAssemblyHelpers.h
-+++ b/Source/JavaScriptCore/dfg/DFGAssemblyHelpers.h
-@@ -93,6 +93,23 @@ public:
-     }
- #endif
- 
-+#if CPU(MIPS)
-+    ALWAYS_INLINE void preserveReturnAddressAfterCall(RegisterID reg)
-+    {
-+        move(returnAddressRegister, reg);
-+    }
-+
-+    ALWAYS_INLINE void restoreReturnAddressBeforeReturn(RegisterID reg)
-+    {
-+        move(reg, returnAddressRegister);
-+    }
-+
-+    ALWAYS_INLINE void restoreReturnAddressBeforeReturn(Address address)
-+    {
-+        loadPtr(address, returnAddressRegister);
-+    }
-+#endif
-+
-     void emitGetFromCallFrameHeaderPtr(JSStack::CallFrameHeaderEntry entry, GPRReg to)
-     {
-         loadPtr(Address(GPRInfo::callFrameRegister, entry * sizeof(Register)), to);
-@@ -193,7 +210,7 @@ public:
-         move(TrustedImmPtr(scratchBuffer->activeLengthPtr()), GPRInfo::regT0);
-         storePtr(TrustedImmPtr(scratchSize), GPRInfo::regT0);
- 
--#if CPU(X86_64) || CPU(ARM)
-+#if CPU(X86_64) || CPU(ARM) || CPU(MIPS)
-         move(TrustedImmPtr(buffer), GPRInfo::argumentGPR2);
-         move(TrustedImmPtr(argument), GPRInfo::argumentGPR1);
-         move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0);
-diff --git a/Source/JavaScriptCore/dfg/DFGCCallHelpers.h b/Source/JavaScriptCore/dfg/DFGCCallHelpers.h
-index 8adde05..3d99f6f 100644
---- a/Source/JavaScriptCore/dfg/DFGCCallHelpers.h
-+++ b/Source/JavaScriptCore/dfg/DFGCCallHelpers.h
-@@ -576,6 +576,39 @@ public:
-         poke(GPRInfo::nonArgGPR0);
-     }
- #endif // CPU(ARM_HARDFP)
-+#elif CPU(MIPS)
-+    ALWAYS_INLINE void setupArguments(FPRReg arg1)
-+    {
-+        moveDouble(arg1, FPRInfo::argumentFPR0);
-+    }
-+
-+    ALWAYS_INLINE void setupArguments(FPRReg arg1, FPRReg arg2)
-+    {
-+        if (arg2 != FPRInfo::argumentFPR0) {
-+            moveDouble(arg1, FPRInfo::argumentFPR0);
-+            moveDouble(arg2, FPRInfo::argumentFPR1);
-+        } else if (arg1 != FPRInfo::argumentFPR1) {
-+            moveDouble(arg2, FPRInfo::argumentFPR1);
-+            moveDouble(arg1, FPRInfo::argumentFPR0);
-+        } else {
-+            // Swap arg1, arg2.
-+            swapDouble(FPRInfo::argumentFPR0, FPRInfo::argumentFPR1);
-+        }
-+    }
-+
-+    ALWAYS_INLINE void setupArgumentsWithExecState(FPRReg arg1, GPRReg arg2)
-+    {
-+        assembler().vmov(GPRInfo::argumentGPR2, GPRInfo::argumentGPR3, arg1);
-+        move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0);
-+        poke(arg2, 4);
-+    }
-+
-+    ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, GPRReg arg2, FPRReg arg3)
-+    {
-+        setupStubArguments(arg1, arg2);
-+        move(GPRInfo::callFrameRegister, GPRInfo::argumentGPR0);
-+        poke(arg3, 4);
-+    }
- #else
- #error "DFG JIT not supported on this platform."
- #endif
-@@ -803,119 +836,126 @@ public:
-     // These methods are suitable for any calling convention that provides for
-     // exactly 4 argument registers, e.g. ARMv7.
- #if NUMBER_OF_ARGUMENT_REGISTERS == 4
-+
-+#if CPU(MIPS)
-+#define POKE_ARGUMENT_OFFSET 4
-+#else
-+#define POKE_ARGUMENT_OFFSET 0
-+#endif
-+
-     ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, GPRReg arg2, GPRReg arg3, GPRReg arg4)
-     {
--        poke(arg4);
-+        poke(arg4, POKE_ARGUMENT_OFFSET);
-         setupArgumentsWithExecState(arg1, arg2, arg3);
-     }
- 
-     ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, GPRReg arg2, GPRReg arg3, TrustedImm32 arg4)
-     {
--        poke(arg4);
-+        poke(arg4, POKE_ARGUMENT_OFFSET);
-         setupArgumentsWithExecState(arg1, arg2, arg3);
-     }
- 
-     ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, TrustedImmPtr arg2, TrustedImm32 arg3, GPRReg arg4)
-     {
--        poke(arg4);
-+        poke(arg4, POKE_ARGUMENT_OFFSET);
-         setupArgumentsWithExecState(arg1, arg2, arg3);
-     }
- 
-     ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, TrustedImmPtr arg2, TrustedImm32 arg3, GPRReg arg4, GPRReg arg5)
-     {
--        poke(arg5, 1);
--        poke(arg4);
-+        poke(arg5, POKE_ARGUMENT_OFFSET + 1);
-+        poke(arg4, POKE_ARGUMENT_OFFSET);
-         setupArgumentsWithExecState(arg1, arg2, arg3);
-     }
- 
-     ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, GPRReg arg2, TrustedImm32 arg3, TrustedImm32 arg4)
-     {
--        poke(arg4);
-+        poke(arg4, POKE_ARGUMENT_OFFSET);
-         setupArgumentsWithExecState(arg1, arg2, arg3);
-     }
- 
-     ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImm32 arg1, TrustedImm32 arg2, GPRReg arg3, GPRReg arg4)
-     {
--        poke(arg4);
-+        poke(arg4, POKE_ARGUMENT_OFFSET);
-         setupArgumentsWithExecState(arg1, arg2, arg3);
-     }
- 
-     ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, GPRReg arg2, GPRReg arg3, TrustedImmPtr arg4)
-     {
--        poke(arg4);
-+        poke(arg4, POKE_ARGUMENT_OFFSET);
-         setupArgumentsWithExecState(arg1, arg2, arg3);
-     }
- 
-     ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, GPRReg arg2, GPRReg arg3, GPRReg arg4, GPRReg arg5)
-     {
--        poke(arg5, 1);
--        poke(arg4);
-+        poke(arg5, POKE_ARGUMENT_OFFSET + 1);
-+        poke(arg4, POKE_ARGUMENT_OFFSET);
-         setupArgumentsWithExecState(arg1, arg2, arg3);
-     }
- 
-     ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImm32 arg1, GPRReg arg2, GPRReg arg3, GPRReg arg4)
-     {
--        poke(arg4);
-+        poke(arg4, POKE_ARGUMENT_OFFSET);
-         setupArgumentsWithExecState(arg1, arg2, arg3);
-     }
- 
-     ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImm32 arg1, GPRReg arg2, GPRReg arg3, TrustedImmPtr arg4)
-     {
--        poke(arg4);
-+        poke(arg4, POKE_ARGUMENT_OFFSET);
-         setupArgumentsWithExecState(arg1, arg2, arg3);
-     }
- 
-     ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImm32 arg1, GPRReg arg2, TrustedImm32 arg3, TrustedImmPtr arg4)
-     {
--        poke(arg4);
-+        poke(arg4, POKE_ARGUMENT_OFFSET);
-         setupArgumentsWithExecState(arg1, arg2, arg3);
-     }
- 
-     ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImm32 arg1, GPRReg arg2, TrustedImm32 arg3, GPRReg arg4)
-     {
--        poke(arg4);
-+        poke(arg4, POKE_ARGUMENT_OFFSET);
-         setupArgumentsWithExecState(arg1, arg2, arg3);
-     }
- 
-     ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, GPRReg arg2, TrustedImm32 arg3, GPRReg arg4, GPRReg arg5)
-     {
--        poke(arg5, 1);
--        poke(arg4);
-+        poke(arg5, POKE_ARGUMENT_OFFSET + 1);
-+        poke(arg4, POKE_ARGUMENT_OFFSET);
-         setupArgumentsWithExecState(arg1, arg2, arg3);
-     }
- 
-     ALWAYS_INLINE void setupArgumentsWithExecState(GPRReg arg1, GPRReg arg2, TrustedImm32 arg3, GPRReg arg4, TrustedImm32 arg5)
-     {
--        poke(arg5, 1);
--        poke(arg4);
-+        poke(arg5, POKE_ARGUMENT_OFFSET + 1);
-+        poke(arg4, POKE_ARGUMENT_OFFSET);
-         setupArgumentsWithExecState(arg1, arg2, arg3);
-     }
- 
-     ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImm32 arg1, GPRReg arg2, GPRReg arg3, GPRReg arg4, TrustedImmPtr arg5)
-     {
--        poke(arg5, 1);
--        poke(arg4);
-+        poke(arg5, POKE_ARGUMENT_OFFSET + 1);
-+        poke(arg4, POKE_ARGUMENT_OFFSET);
-         setupArgumentsWithExecState(arg1, arg2, arg3);
-     }
- 
-     ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImm32 arg1, GPRReg arg2, GPRReg arg3, TrustedImm32 arg4, TrustedImm32 arg5)
-     {
--        poke(arg5, 1);
--        poke(arg4);
-+        poke(arg5, POKE_ARGUMENT_OFFSET + 1);
-+        poke(arg4, POKE_ARGUMENT_OFFSET);
-         setupArgumentsWithExecState(arg1, arg2, arg3);
-     }
- 
-     ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImm32 arg1, TrustedImm32 arg2, TrustedImm32 arg3, GPRReg arg4, GPRReg arg5)
-     {
--        poke(arg5, 1);
--        poke(arg4);
-+        poke(arg5, POKE_ARGUMENT_OFFSET + 1);
-+        poke(arg4, POKE_ARGUMENT_OFFSET);
-         setupArgumentsWithExecState(arg1, arg2, arg3);
-     }
- 
-     ALWAYS_INLINE void setupArgumentsWithExecState(TrustedImm32 arg1, GPRReg arg2, GPRReg arg3, GPRReg arg4, GPRReg arg5)
-     {
--        poke(arg5, 1);
--        poke(arg4);
-+        poke(arg5, POKE_ARGUMENT_OFFSET + 1);
-+        poke(arg4, POKE_ARGUMENT_OFFSET);
-         setupArgumentsWithExecState(arg1, arg2, arg3);
-     }
- 
-diff --git a/Source/JavaScriptCore/dfg/DFGFPRInfo.h b/Source/JavaScriptCore/dfg/DFGFPRInfo.h
-index 17aaa7d..e18ec06 100644
---- a/Source/JavaScriptCore/dfg/DFGFPRInfo.h
-+++ b/Source/JavaScriptCore/dfg/DFGFPRInfo.h
-@@ -164,6 +164,74 @@ public:
- 
- #endif
- 
-+#if CPU(MIPS)
-+
-+class FPRInfo {
-+public:
-+    typedef FPRReg RegisterType;
-+    static const unsigned numberOfRegisters = 6;
-+
-+    // Temporary registers.
-+    static const FPRReg fpRegT0 = MIPSRegisters::f0;
-+    static const FPRReg fpRegT1 = MIPSRegisters::f4;
-+    static const FPRReg fpRegT2 = MIPSRegisters::f6;
-+    static const FPRReg fpRegT3 = MIPSRegisters::f8;
-+    static const FPRReg fpRegT4 = MIPSRegisters::f10;
-+    static const FPRReg fpRegT5 = MIPSRegisters::f18;
-+
-+    static const FPRReg returnValueFPR = MIPSRegisters::f0;
-+
-+    static const FPRReg argumentFPR0 = MIPSRegisters::f12;
-+    static const FPRReg argumentFPR1 = MIPSRegisters::f14;
-+
-+    static FPRReg toRegister(unsigned index)
-+    {
-+        static const FPRReg registerForIndex[numberOfRegisters] = {
-+            fpRegT0, fpRegT1, fpRegT2, fpRegT3, fpRegT4, fpRegT5 };
-+
-+        ASSERT(index < numberOfRegisters);
-+        return registerForIndex[index];
-+    }
-+
-+    static unsigned toIndex(FPRReg reg)
-+    {
-+        ASSERT(reg != InvalidFPRReg);
-+        ASSERT(reg < 20);
-+        static const unsigned indexForRegister[20] = {
-+            0, InvalidIndex, InvalidIndex, InvalidIndex,
-+            1, InvalidIndex, 2, InvalidIndex,
-+            3, InvalidIndex, 4, InvalidIndex,
-+            InvalidIndex, InvalidIndex, InvalidIndex, InvalidIndex,
-+            InvalidIndex, InvalidIndex, 5, InvalidIndex,
-+        };
-+        unsigned result = indexForRegister[reg];
-+        ASSERT(result != InvalidIndex);
-+        return result;
-+    }
-+
-+    static const char* debugName(FPRReg reg)
-+    {
-+        ASSERT(reg != InvalidFPRReg);
-+        ASSERT(reg < 32);
-+        static const char* nameForRegister[32] = {
-+            "f0", "f1", "f2", "f3",
-+            "f4", "f5", "f6", "f7",
-+            "f8", "f9", "f10", "f11",
-+            "f12", "f13", "f14", "f15"
-+            "f16", "f17", "f18", "f19"
-+            "f20", "f21", "f22", "f23"
-+            "f24", "f25", "f26", "f27"
-+            "f28", "f29", "f30", "f31"
-+        };
-+        return nameForRegister[reg];
-+    }
-+private:
-+
-+    static const unsigned InvalidIndex = 0xffffffff;
-+};
-+
-+#endif
-+
- typedef RegisterBank<FPRInfo>::iterator fpr_iterator;
- 
- } } // namespace JSC::DFG
-diff --git a/Source/JavaScriptCore/dfg/DFGGPRInfo.h b/Source/JavaScriptCore/dfg/DFGGPRInfo.h
-index 3d07556..aa634cd 100644
---- a/Source/JavaScriptCore/dfg/DFGGPRInfo.h
-+++ b/Source/JavaScriptCore/dfg/DFGGPRInfo.h
-@@ -461,6 +461,73 @@ private:
- 
- #endif
- 
-+#if CPU(MIPS)
-+#define NUMBER_OF_ARGUMENT_REGISTERS 4
-+
-+class GPRInfo {
-+public:
-+    typedef GPRReg RegisterType;
-+    static const unsigned numberOfRegisters = 6;
-+
-+    // Temporary registers.
-+    static const GPRReg regT0 = MIPSRegisters::v0;
-+    static const GPRReg regT1 = MIPSRegisters::v1;
-+    static const GPRReg regT2 = MIPSRegisters::t4;
-+    static const GPRReg regT3 = MIPSRegisters::t5;
-+    static const GPRReg regT4 = MIPSRegisters::t6;
-+    static const GPRReg regT5 = MIPSRegisters::t7;
-+    // These registers match the baseline JIT.
-+    static const GPRReg cachedResultRegister = regT0;
-+    static const GPRReg cachedResultRegister2 = regT1;
-+    static const GPRReg callFrameRegister = MIPSRegisters::s0;
-+    // These constants provide the names for the general purpose argument & return value registers.
-+    static const GPRReg argumentGPR0 = MIPSRegisters::a0;
-+    static const GPRReg argumentGPR1 = MIPSRegisters::a1;
-+    static const GPRReg argumentGPR2 = MIPSRegisters::a2;
-+    static const GPRReg argumentGPR3 = MIPSRegisters::a3;
-+    static const GPRReg nonArgGPR0 = regT2;
-+    static const GPRReg nonArgGPR1 = regT3;
-+    static const GPRReg nonArgGPR2 = regT4;
-+    static const GPRReg returnValueGPR = regT0;
-+    static const GPRReg returnValueGPR2 = regT1;
-+    static const GPRReg nonPreservedNonReturnGPR = regT5;
-+
-+    static GPRReg toRegister(unsigned index)
-+    {
-+        ASSERT(index < numberOfRegisters);
-+        static const GPRReg registerForIndex[numberOfRegisters] = { regT0, regT1, regT2, regT3, regT4, regT5 };
-+        return registerForIndex[index];
-+    }
-+
-+    static unsigned toIndex(GPRReg reg)
-+    {
-+        ASSERT(reg != InvalidGPRReg);
-+        ASSERT(reg < 16);
-+        static const unsigned indexForRegister[16] = { InvalidIndex, InvalidIndex, 0, 1, InvalidIndex, InvalidIndex, InvalidIndex, InvalidIndex, InvalidIndex, InvalidIndex, InvalidIndex, InvalidIndex, 2, 3, 4, 5 };
-+        unsigned result = indexForRegister[reg];
-+        ASSERT(result != InvalidIndex);
-+        return result;
-+    }
-+
-+    static const char* debugName(GPRReg reg)
-+    {
-+        ASSERT(reg != InvalidGPRReg);
-+        ASSERT(reg < 16);
-+        static const char* nameForRegister[16] = {
-+            "zero", "at", "v0", "v1",
-+            "a0", "a1", "a2", "a3",
-+            "t0", "t1", "t2", "t3",
-+            "t4", "t5", "t6", "t7"
-+        };
-+        return nameForRegister[reg];
-+    }
-+private:
-+
-+    static const unsigned InvalidIndex = 0xffffffff;
-+};
-+
-+#endif
-+
- typedef RegisterBank<GPRInfo>::iterator gpr_iterator;
- 
- } } // namespace JSC::DFG
-diff --git a/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h b/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h
-index ea33f38..247274b 100644
---- a/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h
-+++ b/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h
-@@ -1241,7 +1241,7 @@ public:
- 
- // EncodedJSValue in JSVALUE32_64 is a 64-bit integer. When being compiled in ARM EABI, it must be aligned even-numbered register (r0, r2 or [sp]).
- // To avoid assemblies from using wrong registers, let's occupy r1 or r3 with a dummy argument when necessary.
--#if COMPILER_SUPPORTS(EABI) && CPU(ARM)
-+#if (COMPILER_SUPPORTS(EABI) && CPU(ARM)) || CPU(MIPS)
- #define EABI_32BIT_DUMMY_ARG      TrustedImm32(0),
- #else
- #define EABI_32BIT_DUMMY_ARG
-@@ -1691,7 +1691,7 @@ public:
-     }
- #endif
-     
--#if !defined(NDEBUG) && !CPU(ARM)
-+#if !defined(NDEBUG) && !CPU(ARM) && !CPU(MIPS)
-     void prepareForExternalCall()
-     {
-         // We're about to call out to a "native" helper function. The helper
-diff --git a/Source/JavaScriptCore/jit/JSInterfaceJIT.h b/Source/JavaScriptCore/jit/JSInterfaceJIT.h
-index 7fdeaf0..48ad6b2 100644
---- a/Source/JavaScriptCore/jit/JSInterfaceJIT.h
-+++ b/Source/JavaScriptCore/jit/JSInterfaceJIT.h
-@@ -125,6 +125,10 @@ namespace JSC {
-         static const RegisterID cachedResultRegister = MIPSRegisters::v0;
-         static const RegisterID firstArgumentRegister = MIPSRegisters::a0;
-         
-+#if ENABLE(VALUE_PROFILER)
-+        static const RegisterID bucketCounterRegister = MIPSRegisters::s3;
-+#endif
-+
-         // regT0 must be v0 for returning a 32-bit value.
-         static const RegisterID regT0 = MIPSRegisters::v0;
-         
-diff --git a/Source/JavaScriptCore/runtime/JSGlobalData.h b/Source/JavaScriptCore/runtime/JSGlobalData.h
-index 5d47ab9..c02f336 100644
---- a/Source/JavaScriptCore/runtime/JSGlobalData.h
-+++ b/Source/JavaScriptCore/runtime/JSGlobalData.h
-@@ -141,14 +141,18 @@ namespace JSC {
-             return result;
-         }
- 
--        static size_t allocationSize(size_t bufferSize) { return sizeof(size_t) + bufferSize; }
-+        static size_t allocationSize(size_t bufferSize) { return sizeof(ScratchBuffer) + bufferSize; }
-         void setActiveLength(size_t activeLength) { m_activeLength = activeLength; }
-         size_t activeLength() const { return m_activeLength; };
-         size_t* activeLengthPtr() { return &m_activeLength; };
-         void* dataBuffer() { return m_buffer; }
- 
-         size_t m_activeLength;
-+#if CPU(MIPS) && (defined WTF_MIPS_ARCH_REV && WTF_MIPS_ARCH_REV == 2)
-+        void* m_buffer[0] __attribute__((aligned(8)));
-+#else
-         void* m_buffer[0];
-+#endif
-     };
- #if COMPILER(MSVC)
- #pragma warning(pop)
-diff --git a/Source/WTF/wtf/Platform.h b/Source/WTF/wtf/Platform.h
-index 1698247..2d90359 100644
---- a/Source/WTF/wtf/Platform.h
-+++ b/Source/WTF/wtf/Platform.h
-@@ -818,6 +818,10 @@
- #if CPU(ARM_TRADITIONAL)
- #define ENABLE_DFG_JIT 1
- #endif
-+/* Enable the DFG JIT on MIPS. */
-+#if CPU(MIPS)
-+#define ENABLE_DFG_JIT 1
-+#endif
- #endif
- 
- /* If the jit is not available, enable the LLInt C Loop: */
--- 
-1.8.3.2
-
diff --git a/package/webkit/webkit-0008-support-bison-3.0.patch b/package/webkit/webkit-0008-support-bison-3.0.patch
deleted file mode 100644
index c081b20..0000000
--- a/package/webkit/webkit-0008-support-bison-3.0.patch
+++ /dev/null
@@ -1,22 +0,0 @@
-ANGLE doesn't build with bison 3.0
-
-Author: allan.jensen at digia.com
-?https://bugs.webkit.org/show_bug.cgi?id=119798
-Reviewed by Antti Koivisto.
-Make glslang.y compatible with bison 3.0, by using %lex-param
-to set YYLEX_PARAM and getting rid of useless YYID macro.
-
-From upstream: http://trac.webkit.org/changeset/154109
-[Arnout: adapted to our older webkit version]
-Signed-off-by: Arnout Vandecaeppelle (Essensium/Mind) <arnout@mind.be>
----
-Index: trunk/Source/ThirdParty/ANGLE/src/compiler/glslang.y
-===================================================================
---- trunk/Source/ThirdParty/ANGLE/src/compiler/glslang.y	(revision 154108)
-+++ trunk/Source/ThirdParty/ANGLE/src/compiler/glslang.y	(revision 154109)
-@@ -48,4 +48,5 @@
- %pure-parser
- %parse-param {TParseContext* context}
-+%lex-param {YYLEX_PARAM}
- 
- %union {
diff --git a/package/webkit/webkit.mk b/package/webkit/webkit.mk
index 6b04ccd..c4b794c 100644
--- a/package/webkit/webkit.mk
+++ b/package/webkit/webkit.mk
@@ -4,69 +4,58 @@
 #
 ################################################################################
 
-WEBKIT_VERSION = 1.11.5
+WEBKIT_VERSION = 2.4.3
 WEBKIT_SITE = http://www.webkitgtk.org/releases
 WEBKIT_SOURCE = webkitgtk-$(WEBKIT_VERSION).tar.xz
 WEBKIT_INSTALL_STAGING = YES
-WEBKIT_DEPENDENCIES = host-ruby host-flex host-bison host-gperf enchant harfbuzz \
-	icu jpeg libcurl libgail libsecret libsoup libxml2 libxslt libgtk2 sqlite webp
+WEBKIT_DEPENDENCIES = host-ruby host-flex host-bison host-gperf enchant \
+	harfbuzz icu jpeg libcurl libgail libsecret libsoup libxml2 libxslt \
+	sqlite webp
 
 WEBKIT_DEPENDENCIES += \
 	$(if $(BR_PACKAGE_XLIB_LIBXCOMPOSITE),xlib_libXcomposite) \
 	$(if $(BR_PACKAGE_XLIB_LIBXDAMAGE),xlib_libXdamage)
 
-# webkit-disable-tests.patch changes configure.ac therefore autoreconf required
-WEBKIT_AUTORECONF = YES
-WEBKIT_AUTORECONF_OPT = -I $(@D)/Source/autotools
-
-# parallel make install deadlocks with make 3.81
-WEBKIT_INSTALL_STAGING_OPT = -j1 DESTDIR=$(STAGING_DIR) install
-WEBKIT_INSTALL_TARGET_OPT = -j1 DESTDIR=$(TARGET_DIR) install
-
-# Does not build and it's disabled by default
-# in newer releases
-define DISABLE_INDEXED_DATABASE
-	$(SED) '/ENABLE_INDEXED_DATABASE/s:1:0:' \
-			$(@D)/Source/WebCore/GNUmakefile.features.am
-endef
-
-WEBKIT_PRE_CONFIGURE_HOOKS += DISABLE_INDEXED_DATABASE
-
-# Give explicit path to icu-config, and silence gazillions of warnings
-# with recent gcc versions.
+# Give explicit path to icu-config and prevent ar to make thin archives, fixing
+# error: `x' cannot be used on thin archives
 WEBKIT_CONF_ENV = ac_cv_path_icu_config=$(STAGING_DIR)/usr/bin/icu-config \
-	CFLAGS="$(TARGET_CFLAGS) -Wno-cast-align -Wno-sign-compare" \
-	CXXFLAGS="$(TARGET_CXXFLAGS) -Wno-cast-align -Wno-sign-compare" \
 	AR_FLAGS="cru"
 
 WEBKIT_CONF_OPT += \
-	--with-gtk=2.0 \
 	--disable-geolocation \
-	--disable-webkit2 \
 	--disable-glibtest \
 	--disable-video \
-	--disable-gtk-doc-html \
-	--disable-tests
+	--disable-web-audio \
+	--disable-gtk-doc-html
 
-# Xorg Dependencies
-WEBKIT_CONF_OPT += --with-target=x11
+# X.org dependencies only
+WEBKIT_CONF_OPT += --enable-x11-target
 WEBKIT_DEPENDENCIES += xlib_libXt
 
-ifeq ($(BR2_PACKAGE_HAS_LIBEGL)$(BR2_PACKAGE_HAS_LIBGLES),yy)
-WEBKIT_CONF_OPT += --enable-gles2
-WEBKIT_DEPENDENCIES += libegl libgles
+ifeq ($(BR2_PACKAGE_LIBGTK3),y)
+WEBKIT_CONF_OPT += \
+	--with-gtk=3.0 \
+	--enable-webkit2
+WEBKIT_DEPENDENCIES += libgtk3
 else
-WEBKIT_CONF_OPT += --disable-gles2
+WEBKIT_CONF_OPT += \
+	--with-gtk=2.0 \
+	--disable-webkit2
+WEBKIT_DEPENDENCIES += libgtk2
 endif
 
-# gles/egl support is prefered over opengl by webkit configure
 ifeq ($(BR2_PACKAGE_HAS_LIBGL),y)
-WEBKIT_CONF_OPT += --with-acceleration-backend=opengl
+WEBKIT_CONF_OPT += --enable-glx
 WEBKIT_DEPENDENCIES += libgl
+else ifeq ($(BR2_PACKAGE_HAS_LIBEGL)$(BR2_PACKAGE_HAS_LIBGLES),yy)
+WEBKIT_CONF_OPT += --enable-gles2
+WEBKIT_DEPENDENCIES += libegl libgles
 else
-# OpenGL/glx is auto-detected due to the presence of gl.h/glx.h, which is not
-# enough, so disable glx and the use of the OpenGL acceleration backend here
-WEBKIT_CONF_OPT += --disable-glx --with-acceleration-backend=none
+WEBKIT_CONF_OPT += \
+	--disable-glx \
+	--disable-gles2 \
+	--disable-webgl \
+	--disable-accelerated-compositing
 endif
 
 $(eval $(autotools-package))
-- 
2.0.1

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [Buildroot] [PATCH v4 3/3] midori: bump to version 0.5.8
  2014-08-01  1:33 [Buildroot] [PATCH v4 0/3] Add libgtk3 and bump webkit to version 2.4.3 Hadrien Boutteville
  2014-08-01  1:33 ` [Buildroot] [PATCH v4 1/3] libgtk3: new package Hadrien Boutteville
  2014-08-01  1:33 ` [Buildroot] [PATCH v4 2/3] webkit: bump to version 2.4.3 Hadrien Boutteville
@ 2014-08-01  1:33 ` Hadrien Boutteville
  2 siblings, 0 replies; 7+ messages in thread
From: Hadrien Boutteville @ 2014-08-01  1:33 UTC (permalink / raw)
  To: buildroot

Signed-off-by: Hadrien Boutteville <hadrien.boutteville@gmail.com>
Cc: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
Cc: "Yann E. MORIN" <yann.morin.1998@free.fr>
---
Changes v1 -> v2:
  - fix typo

Changes v2 -> v3:
  - fix the need of librsvg for the host
---
 package/midori/Config.in                           |  15 +++--
 package/midori/blocked.png                         | Bin 0 -> 522 bytes
 package/midori/disabled.png                        | Bin 0 -> 510 bytes
 package/midori/enabled.png                         | Bin 0 -> 639 bytes
 package/midori/logo-shade.png                      | Bin 0 -> 23862 bytes
 .../midori-0001-remove-libnotify-dependency.patch  |  27 +++++++++
 .../midori-0002-do-not-use-rsvg-convert.patch      |  39 ++++++++++++
 package/midori/midori.mk                           |  66 ++++++++++++---------
 8 files changed, 114 insertions(+), 33 deletions(-)
 create mode 100644 package/midori/blocked.png
 create mode 100644 package/midori/disabled.png
 create mode 100644 package/midori/enabled.png
 create mode 100644 package/midori/logo-shade.png
 create mode 100644 package/midori/midori-0001-remove-libnotify-dependency.patch
 create mode 100644 package/midori/midori-0002-do-not-use-rsvg-convert.patch

diff --git a/package/midori/Config.in b/package/midori/Config.in
index c3b5a1b..821b306 100644
--- a/package/midori/Config.in
+++ b/package/midori/Config.in
@@ -1,20 +1,23 @@
 config BR2_PACKAGE_MIDORI
 	bool "midori"
 	select BR2_PACKAGE_WEBKIT
-	select BR2_PACKAGE_LIBSEXY
+	select BR2_PACKAGE_LIBSOUP
+	select BR2_PACKAGE_LIBSOUP_GNOME
+	select BR2_PACKAGE_SQLITE
+	select BR2_PACKAGE_LIBXML2
 	select BR2_PACKAGE_GETTEXT if BR2_NEEDS_GETTEXT_IF_LOCALE
-	select BR2_PACKAGE_LIBICONV if !BR2_ENABLE_LOCALE
-	depends on BR2_PACKAGE_LIBGTK2
+	depends on BR2_PACKAGE_LIBGTK2 || BR2_PACKAGE_LIBGTK3
 	depends on BR2_INSTALL_LIBSTDCPP # webkit
 	depends on BR2_TOOLCHAIN_HAS_THREADS # webkit -> enchant -> libglib2
-	depends on BR2_USE_WCHAR	 # webkit
+	depends on BR2_USE_WCHAR # webkit, libsoup -> libglib2
 	depends on BR2_PACKAGE_WEBKIT_ARCH_SUPPORTS
 	help
 	  Midori is a lightweight web browser based on WebKit
 
 	  http://software.twotoasts.de/?page=midori
 
-comment "midori needs libgtk2 and a toolchain w/ C++, wchar, threads"
+comment "midori needs libgtk2 or libgtk3 and a toolchain w/ C++, wchar, threads"
 	depends on BR2_PACKAGE_WEBKIT_ARCH_SUPPORTS
 	depends on !BR2_INSTALL_LIBSTDCPP || !BR2_USE_WCHAR || \
-		!BR2_TOOLCHAIN_HAS_THREADS || !BR2_PACKAGE_LIBGTK2
+		!BR2_TOOLCHAIN_HAS_THREADS || \
+		!(BR2_PACKAGE_LIBGTK2 || BR2_PACKAGE_LIBGTK3)
diff --git a/package/midori/blocked.png b/package/midori/blocked.png
new file mode 100644
index 0000000000000000000000000000000000000000..c21a154260de039ff862b3a88120f39e14c870f8
GIT binary patch
literal 522
zcmV+l0`>igP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00006VoOIv0RI60
z0RN!9r;`8x0l!H^K~y-6rP4WQR8bVh@!y%52$HyfiV{J~pkNUT!MI=wv3AKwCXgbH
z+G!&QA}Cl0LIf at Bf{_rM;D$CL;#LGfQbtTGVuGL;h#)VMYcVg$WU=x#m-Ei|{qH;X
zyWt-z-LpwaJ7_W%Wj|Ka#R_B97MaU9i#7S@Ke(&O^(gzk0+3!S`KC?Mg$r1ZX}lFS
zO4`waU+9;N*lr>^&DH@!K44!CofYm#u0 at ZZ3*$6-EIHJ0_-OR#DCNa2BwSSRAi8~7
zGFQnt$-%rDK^Jz{Tk{gK=y7w|eXKQWP;v^Ha3(4S(vWQ4TgbIDD5XKo4dx9pPjmB(
za55?eQdJ9zxhDsNPbetqfHY`_%zGS_Oe#1M70*EC074jV{DT+uWA&x`_9`019*is6
zAKgAK&ZRHkUoOU2wN2(T*5Nmrg*TED^GW1sb>bDKg|?`eDnOJ?3RiPrGe(pgTV~#g
z;aqbiDyAAoV8Sgt$*VRsn-|Q(T7~D>iiaw0&-a!*<y6%o^A7F8S94A)O6H896=P}+
zM{hlW6@UduJ^SO!T94H9Hkwxj<dCAwC7f4(q5YcNh_c#h`u|#g0S#l0Q*|oAdH?_b
M07*qoM6N<$f?P`ECjbBd

literal 0
HcmV?d00001

diff --git a/package/midori/disabled.png b/package/midori/disabled.png
new file mode 100644
index 0000000000000000000000000000000000000000..a1c8d45c27e4dcfb267e5587969d99cf46509bba
GIT binary patch
literal 510
zcmV<a0RjGrP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00006VoOIv0RI60
z0RN!9r;`8x0kcU&K~y-6t<pJYRACea;P1T|M?&HPBFGe41{D<(9OAfO3bA&Hc7mz2
zw6Spk1J*Vcc7lz_h(WAG#0?CQmw_OOXrYA&32r1LQIn8o@%{{NCfa$s`*Y6u&%NhH
z{!znhh}jJb)T?~|8!l>nsIzg2OE`;Cc>ax>G1t2IvO?e~#dbO)`XbI_Ev8eRN354Q
z>A+OP^@!RO?|WH{AYmAlAi9`xV>JUi`LR4sfk7Nt{yAl657lDmw`OlHEOEEOr at YMq
z=deGtHJQ_G4M4(NlFivvuV_oCC8P=SBb*8Ng at hT119le0QQC8&>q<Pp3Cu<u@8;H6
zwu?gGGz8uvo~IhfoADBdF%fg9n}_g=ePQ|I4S|$Lq3KWP!Vq>~yujWrlHBt8Lwt`L
zF}`L~%sZ^XoNSb5C5|m85uEkn38ok6>|rv73KO^*1lv(-<4B%dXAABG%#|J{n>L;j
zCk%#-kJc&Y$mN7L3F!#;(%c0%o$?qRKY1a$yw548QqnlfzKr at R4(<vGtPseF+{V!s
zhxbdI&XXG{<ZC-KALzqne8bm>iyt}JO8zhP2jyUZXwB?JD*ylh07*qoM6N<$f|r2i
AJOBUy

literal 0
HcmV?d00001

diff --git a/package/midori/enabled.png b/package/midori/enabled.png
new file mode 100644
index 0000000000000000000000000000000000000000..c46668af8f76b126f6ddd223e3e9cd4dd72424ee
GIT binary patch
literal 639
zcmV-_0)YLAP)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00006VoOIv0RI60
z0RN!9r;`8x0yIfPK~y-6rIJrb6mb;CKW}zs9Cb~hBG{n3NkN6)DiJ$W6evh7LXd|g
z|J9`~oucgEElMb%jZE+ou@$acMs+bIx`e0Npi>Zq5fmC*J2N}`Iy5`1W~Y9aAH3iD
ze12aZPx!~_xxvP=?X&{eMsYE7if`-n$=bq^J8U)s>w>5Z0d`n+L2vq|Kl&ua*S`dv
zBbW^dyG4{F!Z~0Au%gNf5orQ#1>(Rm!ZiuVEH8QQ=SC<Q01XNIrNA46OF$i}V?oJl
z&JB9qGXri%%=4N-7Jx>S5jA+*xYeEqFvA!-09E9?VH)?csb3$fV+OW84B8%M&Y&b!
z*%=AK+s_TSSE|9}RchV1Jp~*Gd=VYY_WP6Fw`{+{8sR7kfO%+&`Up<b=*F#V2p6O*
z$FlwYWOAH15Cbh#33vw>j$5-2petRw%@unA<RHQlW$nxkxj6vOs@V^SLOv3R>Qewz
zQ(bARO(b{)>;m#e$=EwH<iD;YQ#AD_v^<Xle#x2uR)Ag+nFkVz&IKi}eR{a~p#pcO
zodZA;SQe~_NHBY*umo~B+>3gIjML;Feteqm75M0FXFC$y1w>RX&h!_)RL_96&+eGO
zbeOZn{ZY3m`gx)*VFl$!AX@|;WCz^qmA6%^oE#_an)W<GEAR=U+$&{NF)}~`SS&hT
z$Fn{P>k1-?WlsS;s~(hx#ageg8U~217362}cApIH2gR6=um|L)3ZqVwcQ$tdcWwWF
ZpWn~W&Evb)r0M_w002ovPDHLkV1lr|6ubZc

literal 0
HcmV?d00001

diff --git a/package/midori/logo-shade.png b/package/midori/logo-shade.png
new file mode 100644
index 0000000000000000000000000000000000000000..f23bec1ff5609c0138e8592d5558de0975fc5f51
GIT binary patch
literal 23862
zcmXtg2Rxix_x0#q^xlIAqqnF*29Y2UM)YosE_#$`(OZb#OOOnrj2Z-q5*dPsZj=b3
z6D=X+J9FRvckkTtyY8IlJm>7Q_gZVOBmSYjHWfJ=IRpZs(zy$J1cBhmfWNFriNSxN
z*jp_J{~)%zuMLCz!~I#(RrL}A;eqJD)QtiQcDkMx at SB?MUn<e2nL9cfBWkghUHjX<
z@<~C?h_^<M5z{mH*=t|<A|u6<#D$jeKPSGf<-_NTA{A~FiX<Od6Q*o3w9L)?E_0oL
zYIyPDy=U{|J=)O=Z8*~;HnX81?$b%g?cys+-=d_rFG+v<(S;kfG^B))!amDAc%CwB
z*dCU7UD*7+e?$jafy&QjcAhXW*BS88knY)dc}WQAeAOSAK|stQ8CM-`O)-*k|GLGA
zc?k7*XpB;C6b16V7(vKaqux0d1$MC<J;zYOny{aPc#-%KJxoIm-bD6piIvXglGiQF
zziu82LPP~z6PX8QsPAvP7lI*VsN!K|1U>o?^SGb=Ne#>dCKNr}-<@UkCbD*C(HjZ5
z{U0>wNeKhgV9?Ba?t*0_d6n+DjBk||G&{1giTHKWt*DkK5KI&ldOS!wYK~hxt*xz|
zHc9Tq$&Ys-^_)Fr!q#&kbPXm at 4@7DG7-6KK?Z2zbulKEfrJpoHmu`<bE|8UE#-T!=
zuCWk##l*4L4<GPFM+?%(@Q_^NI)18LRBV^j6<8ElOR)Urv^jT~Et~*$+`RwntmDDX
zQn$7Ag%)^I^+IX$jPnUUVJiU-$ZvAmP<LP7<L<NF`Kn(WFw#7=hfb8#)c%;pPKuuU
zkcDf at nh?IpE@838qy|s?-wFIW|Hh}Mvzvp}a6?hufkAV1J?xTp`O32KXNYV<o9i%w
z4<Ns9m}Yg)O;5|O|A>e#AtRK931|MQMx7f%xO$QTck#!pu+`qrDPYF}12eb#?HcGk
z3jcewCN-Dx%-Yc(D=nDhaNG<r#5+?QbJGLwH?vOqmGjvi_I6Dl8E!yE2jd>DF`3;k
zsR6D&UF>5xp>8^VQ%g&vWK4WK*)8}xb=ZS@>BkDiqi2&OT!A)U)1vZlPgv%AV<cRL
z+QLBkAjfz!&xQZ)vDlLmN0G*U#C@VQK5ZPe1s?KgX=xSQ>L(2se}g)2kBEraD7eLQ
zO=FA at pG2qP5v|_DceI!TWzW_<>nMI5 at GYMYjMTB?U%%oHuo%JnGesVI9e&qzkYeqq
z62|{64+*<1C6)eNwAqUe7im<d`%B`xbIseDjnFfCgWHJjHWBx%?%cnR;rz}>9?gRZ
z2x^Gdz{?i59;mpV{Q|SLQ}m0;e#Zx*I=!?MHn-PXfO`|0G$Y~WyAw^ZaY%?7hnjZ9
z7g3DVhZPCFG}5`bxv{A!V$GY~QIf@@s~@5%+I%<Zj3!&~P8et}o6Cg$eTR+Yu#>9O
zlTzLa`Ryf?jZrajmQR<AnVK?&@zFll;01pt#9vS9_Ek(qJB at xnKiT$=x@3h|+a-lo
zc6a~N_NO)?dk*%2;>EoRV-!jevdjy)glJ^m^3>_M7Z##gTyf?k#aeJXjO%foRdi+U
zB7QqfD~o-x2vcI1w1kA$_?HObcp8}qh&1D$j~_qY)`ZpJA9PDhY%jvs&27e!3~6@>
zxvnjpVm3FOaidJXwM09nNe-kq=bb*$G<a`R?NPx6_CpV|Q@N)KsRMCO*Fz^iI>>TI
zh(SY!O;d(VHYqH(_vUoE<S8d4?9cDj)Uf$`0f}aJNb^eG1nx8pGKnNKUhBa~zDzsr
z@Dm%DDe%g)xT}-Sq2RArIIuZU_2g(>Pe~&S at 4!@VLbcgxwCH7ug-IrDq#!boE*^G`
zwkt;R)CF>zf;o8k;__KjYwLBk<g%_VPOCa})#o+uTfwI_Se99S+EA<XR}YTQ&WZzm
zouiUzWYq6S-MTeXEA-hl4#^$<k1V@|d8jez^wi(i*SDmr3+v1DRrpT`*T$E^k87Ch
zUD8=n`<<838Y^|&K|gu5TS&gKf%m4mBbB>DbfCp|?%2lg%_)hOgSx!Bnqqf%*C&`4
zTV?|NKAbDv@;oU{AMf|X`1p9;&U~x*{tn|56Zo><Na>x}th?#QihMzw_B#TQ0<uRV
zA2*Il(P*D9nLkEgX6h3%7M+2#8>7YAr4N@?h7I`6y=2%fr!V%qi!XRio`bi*KKXsH
z@=);QQ(5~Rs+>2pJ|Qy?cxcofKW0``QlgEA2`jWvwR&JbyfLhjP*E8Pj$4Htm(C_!
zmA#xc-UgxfjVM+19GSSZ|8FU&VcHhak=C4GNWfzM^XE at BC#M^Vii*o;9a(>&n4dp|
z^a~ZE!LeSvqddZL5rypt2*V6Nf29SEK}n^8 at 6WNzbp9^do^8D2TTk6|(rJ>lHlUK#
z at IU%#m^H7hZ#OME{FBdUnDIg+=;Ht0LAPbC(L at TqR(SO0+h at Cm-&#89&*J0c6rZ|j
z8jQ`(#=m_l26kd$BC{+VnHO`kF}nKq&rv7)U>)svEP3>YrG0G2v_D0%mKu1v;N6Nx
zwJ6jTez-hA;7yKB`TKlR6BAKjGY1pQcfBsp{R$NQ$Y-I`du6m>3FY!Hk43Bw6PhNb
zjYq*67$wifYh6OPh!5`FVqrcC>iW64sU8p at 4-T*e#g=OxLWgH?V8H8pADOPcw_jzE
zO;YG<6X-J+8=G(?`>{{B5ekfiCsEFG+wnhbA-C7QJ#jSE0$cE|qXTUE3Q9l==3|~R
zTu}8;X!+Y4!?vIk;Zb7&D(T(Ye<ekV)<y)p$jF2=T|sLZ5xZ_uo}E5P0UZtS{h**A
z3+4v83jD|Djd$QnxD5y?s;)edgmg0}_7|-@^+EFz>MaYuF+w$)K(F}hcWj4s|Flrq
zQ-Xt=$Se*fk-eM3=pm`1lDs;YYVYftv9bFA9Nr?8;8Xs>_iwedNb`CasW}y!^t09i
z=*II`9{Tiw^aC|(B28oxMVZ8FHkc67s%JS)Fy&S{gVO{RvuNu<TW-qP?+~<lE?v2a
zQgXhL2T6#-UhWe&!GQ<lHVH`!@1GFW<KttS!|(k_clYMdWCRbN1KRX8ioAQta|oY<
zm9 at 9QelSo_m=Q0e63pDT+=HWz5FCn@r^n;k<^TueLpmv_-N>`~$*@?gNoSyB**LPl
zg_AK+^VNhiL!u_AGG;E9hC&QpzkcXgbOmK at eEX*Z+fNu=9sSj5dO#0m)W*ujX7+{U
z!Vls}H0E&@*lR=6)zt;YdeZ;h4))waELK-AN~1K~M&g$I$FER%kA<GY)xoEcSIqH0
zRSpCHhEK|qGvOA94&8NTtq<GBuV<IT-qSQ#he25=6 at AhKL7DpGAoXd@n}?4O9}hRB
z&*=!XDTk6jC0Lu5pmQi~D9j+^+O+-Bl^Jd%hKsZPY_7oNh-t`gm0K at rYhq+8o!O*v
zDH~^@3H`Z(3<+gC4CJPJ(BQStj0MV1z4vZ0-O`2a)9h6!fjIl=jYD6-!58_EzhdDh
z{weT;<df4=KDzi@J`sYS5NI%)fVSrq@%KeVMYB>e!NEKJX~0#z!$f;&1!cO3MeIKB
zy)T@(WduKQhgf}PF~?i(mepfV8eFyR4z8t<>5UxTs|{i4 at g(@!>;vsyN(H6QZYW)V
z(K&?_f<k>Eo5iwscUg&lSgBu2-o&jK*v1+;3w{7lmjmn at avT}m{ORKR9^m~}40ojH
z{QKZf$koap_9Is`pTR>}aMmBe;Y-!1tvdYWw=ZpyN<p>+dxG?AEfkl~e6vu-u-wgV
znng<<4V|uEJ9^4-`xys#N_~*dZN9SBfz?B9^U!k0U4A-Hrx-JqRxdEB#ryc-w}mdF
z0aAm6_xAQCgDg}mc}h_)$@qrh$NuiFpS#T`>;mVqbzD{!)7z_m@}7%*xLG44e3BY&
zySTbu1ftJwtU4l*NN)R``x5V&tMF>#`|YOjY)fTT-Wa)n)WQupAcibl*;HWfU3aZ{
z4#fbNk`;B8SGjV$Inm~|5;=MQqO{W46AQ|;q4APX4sY7sPFiV?cdVi0_`gLV`%y#k
zq--x>d<|SZByf1Bs9T1WufM<DY@;KiNVu$hawZP_5JzRzxq5rkjo$v(Iazc?4_TaF
zTKZ>7d%STYSNDBvoGQ8N;_APFni8^X^iWP=`tdV}Cqb2~X+mnPNdx{${dGNQ-<z4{
zP=;k|Qq!#Qsi^_Sn^x`KL^t#c>c6RH#TD_F$;*B|K6H_kkvUc!m?=K$e4MrB7#bRy
z{XBY#pF=sY9<zP&{#wsGo);0o2_{WQTH_iMgET%9ktvgSHJ<Q?LJqUS06p9aI(|Lb
z6Gq!pES&JG6p{b-hs=<}uhICQp`H7W;U|ue_fW#x-lu;L2g}<n_Ed6aorW@-GaOm(
zXF+>^tzj&SV~pk!GW4rNGqvxgKli#dJQ-~t62dX6a#k?uKQoBed6Oyevga2Wkq-_r
z2Oad10Bqvf`t-GXcwDJ0H1--dwIh0VX?V at Mn<~6I0dBwmwS32b$r43#7_}y#P<N{)
zz-h=b-wRacYHDtNLZ#deu$O+3vh!L2;j*W6?r^Z??Xciik8WzhC&T#5ti6}LwjsPo
zs=>7D+REkS<=tr`h^1>KFE?1M>X^Z}AHP=Iw_M7~z^viQs0wFib8{x<5)Nk^OyNW;
zD()%T?}%PrUjDQF^E^@sl%p$9(%=I#BFR%y1NF8ai3^kh-qtXVu+T?NA^BepJx)qa
z4o#9AXx1FsII>;)oN3bN5Wju-TRNBW>!!^9Z#l3kEiH0l7|BBY)m*2dhP?j2*C3vo
z`}^G<xF_5SJg_l=PkKrWSRtCSBx6SM<?YAIG~1r6YMH8EFPjXfX^OD{0nKi|vkGHa
zecC;}-JifHQt!L@=y7ySMy+nugmR(9#zCNR9E{ImI%su(s`KCjh4FJ4lI64Wi;LSg
zKTGaN1Aruo`K1mKmopR5p=<HLCV;98kw{o-;ZO~^#ZOq9lDn&YDmnaZ#YC+4 at K1<I
zvkN1WxYZ8o1tU2TNYnRcKYJ5KslWZw40{gB&nnn?<Hb{ZkO3qB_#6h?d*=0Xtkf@^
zpA*0SE3&psXy$$B1*aZmQq7 at -*t95NEwzHza(HWb`Kl%C7!TrZyd;j1$`ZFu0g$YN
z?K)=T$VUUgJir0~_v0)$9Ikw};M3-}ot1eMDp#oguafky(jC6E8A=<Po=4@)6!EM!
zP-I at EADMc!G)Pj_aX-c5khPO%pBs~Kc at C`5TaO2y5$K$vqV-M27M@1vb-H-3cu&EX
zy%P^^y9-!l*(P<B1K`aqTC7{ogG0>a&U3AJzAUvTL0vNq_9Pmm!5dpFSado+cm^|g
zMks^}uYTTT{58MM&)wbr&zT~YBHd#$RGYqRxw-?!Av+!+s@!Kkj?&U-ag#TedR--;
z6STXB?I>;uk?M`)r;Bf^bpFRI=)x1K%I&|mU at GV8&X0tB6C|u1VCCSTyqDg at -QyW~
zJ$?cpo at UqScg8f^SugOUIi;9_9_6oqCBOCTZ`)=LCvB*qL5B6__BQ*fV(Bth`p}Q<
zxStq_hW at t|6+}t_d*8Yq=zU`)jxL#$h=+Y&gQybOL{FZ at e6+2x?&flL&${DQ`4G+s
zo&pY53&CZ;M;ylg?s6LjyA^sa^QHK<=c%Z0`0coUJ8mXZ-3^eVyR~4&#5S)rR=il|
zTRr8Ext^Cy-W+mh%#OPv?{TetKMg{EBu^F;<OYhza`tI@4<1~9Idn_Rq31zm*-_g7
z$gY1jid!4GeJFdx2kaUKp~bonvr0=#uR(qrO1qYi3$=JIdAMZ9(ljZq_CyeP%dmx#
z(1y~4SI9A?^V@>$G-<FSnr7m;4%pzgZyA%9DOoQZS;vtX+vi7rl#8COvnHjc=7(aQ
zK<bkE?QVeK>v>41IbO`q&;KLt`G}Yb2netThrjZE4467C$Z(plV^%L+BX4Q_^%hNI
z4Fd+i(8MI~S4{+Ny{XcDAabKD3bII(I;dA&tX4d0J7JA?KrX$V4K<BSW|ud+cglig
zhy9?BG<F2sg@jf`1Lpa>|NG2c{>YQ<X&;g=Cu1`1U-*0sKS6?XhZ`Csl`oGc5cgp+
z12Y%kkK4lE9luB_#eU~OC|R*I`0tw4nAj>n-PW&OkEy{xtbn{iGhW4NPodXzGZCEl
zxn|b}<T&48M;{$6NGp|9RhG<BHVCErw>Z|tFoEm2PQxDdp9uonKu9NMJ>VC*FO_Ri
zj at k;dX_=3v-JYub2*RiRivVG*R&Js6Z+Y0UqR75|lI`Z#3X`s&=2gb43aV8Q5h>Z$
z8P{n at y#hMByw}K6IF%5_zIF8D)!z?)pS9@=nt-}@$U_ at Sp!N+ZYENn2;->!K!L_qL
zNrcIgAdJ6)d8?pM&$t9z!iR6LP};2yB)_HnIRegMUf%b;kY0lQB3%eh4#4Ga<6-^#
z>BmPM0sE?7{J;UBq at uc14zIIA+>IA&gxZ5i|J?bpg>WQFrD-CURBAi3haF2m`#$sQ
zd_cjg>+Sl<2eFtC)zmj{Ztht*bRL{a5QO_|e8JW6$|<_>07lKHaBJ)0KY9iDcfc7j
zkN at duTQ)YoePVZUx|=c#z<-2f<rxn>lbHYu8(WYXd{P|W#C<K4laq6%-ZpCWNc28l
z7}`|*M#FVP)q~=JcAt%5v426O4}Vt#Dtm-EbwVIOm&(=MyHR#q2CYg%Y6B={%3^nr
zu>!5L#+ZeJT;?SyLJ*oOSNHeXZ8^7@<+gaM&G3KNg9KLX?c&t4v$Jk(2dTo<acypQ
zRxYk9y71{7Q|@?JedvY1wtbh at 8PvXphj2t7CML#TYT!Mk4SM#h&6Fd5$U#C@7Ty3x
z0>VO5Q<KRvZrYV-W-AG-aK7Z}`>U&~R1?*-5@=LZ6gHhd^kv+$f#LI_A}+VZ&e=n*
zU_q`An!HGAY1gc7f*$Lh4{dD#P5t+?u52KaynOkRG4<t0?Bij`^6$e{M1K;CeK!uh
zNWP^fW8zP{TZ2dn&5x7IGhLdWPo!d(Ym at RdBQ=YD3M7EJmqR~pe{g7)Ie7UfN!E4h
zmP;mFT3@c%M&gqw0$>-3Z3GH->;>>E{&YMch1C4uPCo3LJK}O{vbw=#Qh55UHmMnr
z4nN%!h&8dz7KQ}zY$spd(?8 at quo;V?i%<*ikXh}Erw1WamRn&8sY at JOUHYz=W}^-g
zG`p<cg|cqbRT at 7TE-(XHH_eMF=pzN~kp8@Ua>~kom0-ubkjnWUF#s at Jr{DU0!{MKt
zoSfIFVABu!<2$oxr;!BHlsGH#zF|`^;6CKH5ac6I4k%_V?(B2(^OoIWwx#X5d}%*(
z{3NYCPE`P+0Mpabj<uDyo1mcu$FerX(TA#dbWjw*EN0P at EA2E4)uSJG1?Ptcyz!aD
zyy)sn$f7NxYiWP*ba%eJ)~lL at jE$B|ebq5A at OOV+Whf_8p13~%loOSDDJ{KX4CG*j
zUNvFemJFIJ`fh-FQ{8w_B!l)fn`kOt0w6V at O`pFl7UWX7ftkm6lpuo0qj3@RJ47|R
zZs$f0X(_4tDsQgtRZ*og_w%8wnS?SM+}HywaioTZhIgx6orKc(b#Ul`_3hVAU3y)7
zmKiW^n7L}ajXL6nlnVLF=p{fQKUC`FTX2T9(R^6*&6z!XQp{7<njiYW)l~%GiO-gt
z-84XDp{J*3#0EPP+9!1=toHR0S_Q5UNz1!|MP*JMjLuPjfyE;@kj=^YL<qrwv3Gvk
z7B?{x8l-tq9E!fkczzx0>t&XRr3nyQAd at Pc@?YoE)z>%fVzB20EWQo(p{lCt at SEX-
zT-ps~`yIaq6WzXH4!*Rz%1ODoj4?yd0hXy+^H at g=)bE`)LxW)tFJk-26;=2ftxJ$o
zz<altRV?V0KJ5AZJ5bNmQNYaHyxs05nD~R+mrc1fZfS9gG>QFOYwy&0Ifse={iEyY
z7^%s2WW_}kpx~Itm8tb(8~~90q(YzEsysK3)!=o*zRT>$IreaoG?wEAd%vddniu0#
z^mHJj8SvORz{ob*ReKA;aNYRJywcmC{O@(_s}8yd#FK*cvd~jWPREC3Fh?54Twa{r
zzovZ9LxR_NO;A2d+_aI9UCzyGxF5=t$imHCmrJ>h{nR*IIIav}`<n<s*zq8sw`hwS
zv<vFOnPz~F$>X_6p;Z~kSKeRj`M4QJS30w>v)?Iw7{0XM>Nd&#^hP?r9+|p%xREd;
zK<3s&^@GDfrdbUDZUUv?Q-dqO+aOt^?mecI&PazS_pVG-J;=uv|9N~E7}C8)Pr7Fd
z-dz?*G}j@91VRO098jnPAdM&(2s0(7P~=rQPiTzo@#X5CqEP4V12g{8+gPa~EC=%j
z;fhy|NcmGB0-{w$-V0!U1w)I~yhzYWrq2M3pcIU`!tcQWTf_+4pj2+Z9j(2+eE=z4
z>NGD at CK1#I_v>Yz1QMB_<F(3X-uYGAM>jT`q%_cgoPeRqEh-u~8olj_*i1EohlWC#
zs`acp^jQF?qP})5EF$hS*Hm1GPR?WD=g${gKqmkb4pye(8vXb)pcI9wAG-&@SvJ9M
za^2&*B;oLCW7`v#`&39j+^_&`*bn+pm}a#PtOG2JUSq9tH01)=sJS7vT0d7b>oR~(
zN;Y|D$aq%Z*B|A9fdM84 at uC4Tt+SLep${4a;oxMp68v_}kr)!t`LI5c&nYqlP~+<A
zDv%sfI7anY>@AL@<4JLZiB&#`vPYz!5)zC90QBR`wo+E>19Fu>+=!2lZ>&2qL27vj
zgJf}^pKhPzKt1P^Ly$6;+k6Yv`0JH#Vunx#^Vg1%y*$cX6I7b(|0laAWjVu+*FnW{
z`S)_!3Xz}qKA`0&@lBwqwl)bkxLe5T9Uw{%4e4NIm6`I!gZXt_tg?MhF=2#)i4;-2
zJOG*P&Gf{YjoK|H53a7D<ns#(WRxnL!<4!H#ejf-4C^wogX*OWF+7y&`Lldm0-ZeK
z;9k0B&#v-Yh3kP2`5cak0mwxGSwtd2W!U;d&#)Vx3~RDl#WSNM2N=x_;EXt;oLhBR
z4wx7Bk9W85h)GD~K?M2b6j<|Oq~tsocLLGR4-cRG at LrE`YhU($#FvItRaXM!DbUSr
zX9@2(*L2?@)fWzzR8_U2r(&t4p(Jka`->}JK}}sem|yID&jnRMC4H7DdFq_AFhoa5
z{A4NgOrhl^Q5)K3N{^B&X%n12`DvC8a5N0yCkBvfIi}s-YxinQ(F18d%;ZFX>A|~1
zTi_rOd&_!a-$hqHu45C;7c84TJ2{zr7SuWb=pvx3-1rAv;0fQgI(POWP30x)$13q&
zUUsrY!1%^XQCl?Og<7tx_5foL1O*3kDzxVEIM;qybzveW;!p|t=EX_dCBl_@8{=a+
zf-5y(Dk2ao#HotN<F|dFPI4w^Z)Q5SMMNO=@$~qRKrr+%9`<Lc&EzMWZ*li=`?UY#
zhr@^mRGtsuI7iu3?%N(FF&eOcY^j6&8G?zpNVlmB%Y9Q-%YG;Y0TcjN0g;a|YGZjH
zHE;`>jY5$@&RA>V3`79zYxC1Jgf0fnelVieNpB14Uut_oFkNRYZ|48*q0rxM3+Aa;
z!-%z|_}r&;l`WNkBZ6=o8DB38m*yf#t(ZAxnp<ABX@z3QAoEF6L0wimGYwJI<X0X5
z$j{7}jQ9^p+>u~u>Xd8;5<A!}Eetv2*^~XnuC;10qJRU?WzYtgVgs*pZYLOsunkX-
z5ZYA<@C#n-H>SCo94dktyQZoAGkYBLa(I@|&!?rWy)E|pHa9r1Tf6$js_s8sqy|*K
z0{lX-=;|s5BH&6}Ec=37mwMGU$rf~tOx}mImrol|D49`GK9?*}C)#Zo<Z{h+d`c?V
z2gE@;+{kVhuYF&96V)hv;h1gX?fup3vx5CjyM@?|tr1;-0f9mkD|zZ9p|C#*&?Nw_
zDZ36gSF~alw=OGCsPRAA;lvD0gIvKimIfINpk4uz3;5sWT{fj`jBQ9r=U)Ht>Y)i!
z0N;o4a_!`+U7~>*cF>!1efz619w*1AJ4pQ*O=`%_4Sf(Ctc0t!nSJ9QYh#<>>e8qu
z_DQluB~;YZ#Ezy{#JX{&LJS`OaOa>!2W at 895*NXGKph<+jKAFwe70BBE{2M~1%@02
z&Ad^G+<wA^{5~03*|oU?m+EO3J}#_ at nA87Si~AA=GVIi`KwqQQE<$)b+sp)_oyp#A
zrE^}c&IU7h82uiFD}D-x!gp3q&dck7+1Pm7w*#=$_N2W0W8l3U?8~9V2_{eylI=@J
zjP=5()P|9@FFn>l>BVL_LJ1!P{R6B7;qiBgsRQq`4^BS-Io}$QblEg}2B0l2k{S?X
z0>aJ7Lqyp=3=m<Z^BJPJIM6~gg^0_Wv6DwX&&gCbV8Aq>?Hb|$W?>U$2lVe>?8OJR
z0<dPrpc6sZ)087>-a>h{6xO|JXAEVMl#+Us)-|BtQ9wn1=f2>}V*CR{xnJo+Qt_bi
zM7Km%T3a`_8ZkC0vxq8(HPGtQk`Ke{=?JWQla|YAahVEZkiXz69*qTK-YV)RM6gNe
z19$>`<Jdefe%ApGuMJaY2W&z-Jb<N^f;cLLAHoJ7=GSRdzODv`TfFlfLe4VVHO!EK
zwR;#78*5Eaq|WmHy#P9};_G}9FN2j773)Eu53WBR9^4I_)wtzeI at G94{;i=zfG*w|
za$sBT_pF;+$$zIl^m@j*ifmpEo^)~AB>N5!CA1!lBtbD{>uy|V)8DDcyi at 9&ofo|<
zAHk1s2zwBnV;r2L5I-T=WFhvrJ5mnlhf)yh=jxPWAap^jw~$mAA0^fi8e{eNz}qt?
zWnJn47F9|%4F#!#1n(~aWa9Gmg0EzCm&&LuMeT2&+h;y6)i}w)IbSv&n30G4)T&qE
zx@L7;#yq?D1qNf`<gD$eOhOz6b!DAhU^|~q2=S&H!%xav#A?+4>z3w^JfrNHxA`he
zfM82}YuPb1zUU}`8o#;fQIJ$BIiPi)N at M%p7~;%Hm0Yb=CmV_Z+ET}^7(qpjX?X%G
zL~MJqkEv?(8YShza#y7mfVz8M5NPZ0q0pQj-Ik{~tlN5V(?G=Ur9L?u?TFs;8+LUi
z?;mkaAt8UQ<B%1LiUTa5z$5{cZhph<TaGE&K#rq227v}MpENIHO6=Emvot9@>Z5-^
z2uuvz^y8i%9nzo at hS%F2F-+R?_SvtaN7jy3Hh+|TT%a<QkCc;>JG}|H)Y_h^v)=zS
z;SS=-)*c}Mnz(Bw1C!N{lPxl%2nYyb`kj;S at ukI8Ol)>XMVqkNQ;HbZcy*S$#RF1%
zczBq%1zGi))e0pu<4X&a506crs<mjRyPqxA9Qq!>ff#0Khy|yX$HLedfBaAB&S}HZ
zVSml5`w-8_XcJQ&njRcnC;Lm#yb208<BA|(xfSwc)%y!V<~E|~ZAZs^T7)2A{C=`_
zU#N}mo8Cji{MsZG70+{O6Hz$6oNolbyal-*Iv*Sy+~9##)Xta4dhIW*b-l&}*>7hs
zEy7cFUO)D~K0r5l)HbxAYsc<8$-D#*YB7j^K*vnZ3h`TdA9^B5yod(|WaB$G7n!{3
zNpkFTo)82r!8UJ8z&8OBV$AL9i<-Rn0-G3XXGbH5c5#dt)ID>EFM(Zz8Uz>Ve|fQb
za{0CML%PZb3~XRn^D{ra3F-r at 2P%^035V)@K}x!E*3bsGSt(q>W~`?CJ#?o%>*AM!
zC=#+BWAd%0q`9dnBr>jLyEe^{6_iRemiYCzf`;6BVWa at FR%{{w(y=XKC~Ba0iH{=C
zVMI2~nP*SCtlZ|Bh8mph0t{VEbyY0t$JX&XWN#wx+_~d<y{whBcD~Uuako?um@YQ^
zk|Ys-cqJqyOSeDJ7?h<|6<?#Kew)s}Ne{7dKIsB&yaB*>IQ9k2%cd-cJD!-08Nq8U
z)d6~1eCs at S<9{1$X<2!8Dt7nHnW1R@h6fKuYI+!=!mo2Kt~6~_t$hBoTr@&$Sp~94
z((|ah2nhK=jsjhBY+>S^Q2+b>W at E}+58U4s09fEBM^<9KJ3BreF<C8Y`uFVN+*c#<
z2eLO-X7%l5pr-K2{a;oOM5UBSj;J7496eGZ`;JMre}1h2?Kji4LF#`{D!ap^fT>AW
z&@i7V4~4RZ)T?{yIR~P!_<bNk-xcLMlW<KBs*N>1P(JK)-lITCf}D0H_;M%}Z^q%I
z3-}J$<vn~W=DJ}jgjXl^!oP?kvx;u7HX{f{K_4VK&Z??aE6WiOsL4}9PjBzWo8(TI
z-lIRP-=qs?yTihEGfI8Zfg!>r?-Y1MtVk&O8+wu^J3t<TnzsyRx`f#X!lV=wOwrAb
zh$n&BJ)F%jSzcs3%uX8EGREJ5rSaAi$a^68Qqs4Wjgw1Vx*k#IWvxr~;x2y>P&Mj6
z_X at AxVzd!RYc=MrUozJd0fz6iwX3x9npx{q{rAtvatt_V0AsC#_?p{8tvXo%5pMK*
z`&Dmz=YTY?_u8BHWna;+9=(Y}q4tRmJop+H@&p*jZ7<JH0HGGMz*54Vzj^Z}CWusN
z$9u7Xxo#_R{Uqog3$c%kxtSSInLLmqFCG=@qd&5&ddE}B$xXu@6f^HNgBRWg97_y>
zxp`O90LO`rPfy>iTj5K;o$Bj at -RTdiT?|8^*i>{~2Q@$u>xlcQ666ZX45z%viEMR+
z2f<|I8Odv*gvFO%Rp|SHJOV_ at E<^a_62#`|60JQYu6+uGKUZ1Dp5aSH1%=rc!3mZ#
z0uR~$!)p&Gn#83Bd^24DK59vHx^d&iwp7<HacAWEVc@Zc*o5Kx>RyoUrA)KJNP5g!
z?JX>C1Esa$*=5kY-koIRD-%$&c0BN#?Lgi7YXEUQnfk9qCUsvx?F<;k*njB^Qq+}z
z&T^NW4Ev)uMy|C~^jutA&l<ogB9gken9eM+kj~D%ICWsYQKmQun%<m{KVK9sj7x at b
z1c4okd0!Xhl|c76jj)YkajxQ_(DSskG;eVX3Z+U|vPBSW_$C9`lByw{<`YdMfkX at 2
zCtpsceWdk?hx<O~^(T7y*egCHQfCJg5&t)oaw`Prb2cJWRtfo&u7|d@wA9-vPaxse
zcNmG>y}Z0~`E|O%X!8*0h6<o{I59d))O_76Gb~<f*oJMT31bR4r)%lWgkM##S4uK=
zpo7ygkCgZ3_(0u>&z-Er3#@8(0$IQqFb<HY&{@B!LrcIvSIA#-#2nh^>_xgGD<)ff
z5WpeJ+$LZ7WG)er*onwWl*<XU=}s&)_5p1FtNH5DAGd6zgH-Ojx=Mcvy$Ll~7FH;A
zFzU+}eJs-g?6_iOW#tN(IXb4akj8z)kWSD!>82y5?@0n$Ic~!n?4qlq8w8Bt?puYz
z)D(H=m-}J=QUpWyh)LEZ+2?<&h8G5H17zx4trUSmwS``^c**(!|HyKqhR4$T<f@{e
z&&XMsaO*^Xv4(xzDI~Y`PbCLV at qa&soVFy|Xq9A(n#X|t%R943$zniSLF8A8ac^yH
zH8N=9Dz4S#&rB1jzjjQQ9g|su$zRcdoVPimrj336)tP|X@gj&1u1bJWg(e;*AtzVa
z3ME~};PNcV!CeU!<u=!8u?gpO0ut&^?(XjS44UoSJz{zj=PdT`X1zp!+y%9M&jDWZ
z?ck?-GKOQ;*9LOdUWG>p1doQ#B#`3ZiSWS8vo2X6+5w1;_AA0ouiJU}p%6nGwi*bT
z%NI-k-mlz=l01C`5!b7lm;l`qZP>Al{SGvIKB+;5b_ntzsiD5oxhtumKZk66iG;^Q
z at x3AI00=%uOjc=C)u4ZeKU$_E_^G at xHxJAxKT;6$YY^|}so^X*>a{j*s>O9fPb{0`
zILAHR-TQ%x?X^D4iuNSK4}2kcYO^W6p2+(^c@&x?>Feib3p&bg_gXvI`92&U%Y5Bz
zI$&DwrN1qmbLzXf*X?6D21+UyUr^>^9 at u|#Q$702J))y}*Z#L=&E&bd#K0!z_cNiO
zA9QAbbpv#)nw41>#o8^Xf#yfm{O{|{8uC0cOiLrvf9xFK?&2}?>zKyf8idM;VI7f-
z-W}EA*38NICTIFMQs5TzIr#h=D65v1mY~Zci4#M`W4iJ~RK+#8h;NA^lNvsoA;Bp7
z&()_#f$}>Ol(6otKwG}dlZ~0BlNn%Xahr_<2n#qN8ijL}23X3*g>a at CEY`BYZ7l?Z
zBx>cGzt=5Zh|yOKAaAHZt{!^o0V)H!we6$47JAQsuL6j5?&eYe0RcB!|Io`DR2%+^
z5&ub-a7IbBzM;U^0og~Rkfu#hlkR6-wcOu8sx+KFo&oNwAKnVucDlef0<c66a6kbK
z__=wjhr(%>!~hL>^w{EJ3Q{KFF8`wj=$Zy8 at 9H3`gq3m7Nh<eqTLI9~&G9--Jx9tk
z6Wtt(K!up0vU%yNxQiT9W=rN{Oa8(rpPHO(3;O*)JdcsoA7JUU5(nKtFkj$*zzsh)
zXVwrTsS-yDb_Rg1 at 4TNQC}ff4b%FgNd$WYw2_+y;Za_XSMgx&@*X+tnXT?Pkh<0jn
z`F_guLYQ9#_eqCCtfMt-_a5lbFlgq|OVv%AAF91)jU%0PV*(@c9Xb#c#imD;VC@U>
z#7O6WA?+Nm)53EEC<ZG>f7(WQJ;XMEuopSH;RDxQPc-g&*!T$qRogU2PqdDGCanxG
zgc|LisPWi{(1H^I!>f(TK+Wnkk+_h{=;dR~5?FG5Ohog<nG&_$UaFAc_1NNg&K$|I
zK#=RyTT54w*GdWsLzh;)AAn6097c0vpDxgVD$o>sKK!&mpA>2oMSM#LiEGLwpSs3q
z at R}>(gXarb_{M{y58Qr_Uoo4A8VE7G(67>r9C9oWn*}YjUeo#%Y!~Rrc=GXK`Q~uF
zHE!#PrkMR!E4?^U(A`IRde+6)l;vm0sU(s(ta<fnbhM2vDe)oEU0+m7S}W1$3FF*>
zA3t7s5m{(W$Rs5tmDJYOzQzBIxXD27GjhAX%SeI6KE)gf`(Z_?2cMiKFfrWo10r(G
z&5K6fieLB<7r?Xz8hFn?t|WNw_(wgO)f9Y5J7tpTRq8<Stb3`DW$x<oLIAQqVLpMy
zCQlh(36}HGJ~WLZ#Yuc?-oRcWYsy`zJybF5Acd$TCbJkIQpYI&UXCiK=&~^%;|e+G
zou(US>XHTe&JWdRa`}u8ri2a7cfj_KIH|=WJ<jfmWz&l}QuSU(66aqsCl%w#RsMiL
zXeIf+CKvko`8_drs*tpf+$u#01N9L=cr%|V{Wst2e0>>k2AP?eoVe6U9_3u0D4L1c
z#*N01%BO(IJ(e2S6FGZ_oynb{eW>)~=qdOJB}A(6K)RQ#5B0vIP-PE=hAk7@<hKZl
zo`+i*h|;!S2giJAJh%&urth_Ru|0!A$xTA0f=W%GU)*n<1u7r>2?0I?@JSh%0|^Ag
zZ-Ys}MIBB3c^^1VCs{A~H!a$y+lbsjtHVh~FZiM72*`nf*KjSo6~%A2Dn`}?7&IfG
z7 at vPY%}VEwkn~TTan6%Fi;XKmZE=S61uU@~WVo at wWoX9Rz3ZOf<mUZv!64^zmOhNz
zo&mHZ!}%L8(2l{s`O+{AuY9QVwWLTEAx*!_Z%h!_wV1~!Vtl~C27&RZ@gQje>F~A0
zoJt=GvENw*IcmmJt!l~i%}1eY(HiQ?D at 2jRz0s5#-+Fp_lD);vn3{kkiHEjJ(=)m7
zRPBQzJt-Rrv&)#+&n~3tn1kt+0K`$=F$=->>*2jY3c|>N9#pjP9IEn;X#oAQkHS*v
z*>_wjn>hRLn-oQCGEtOg3SG>iWOHL<WBQPJ43}>D*!;Zf+6y1B6%GA5JV>5<(${Nj
z${bcZ7q_!Oi?!0V@Z|W|YgC6}DpzgHq>bh_LAZ2~cpg&|kSy^Ih`VGvhak3vWQ57F
z6s-E68bkE={ctE^iyhLG5v;;M{^Z&m&7B8eavzh~nnG0fbsvStJu}@u5xAd~qw<Xt
z2d8EkNZDwZp-n@vTtP^fXT;6_=*b6`i(KzIOyjU6inm5OqD1luZw#0Xo*<FlL{n%`
z-5HpcWhV+{H(IGS7XGQxP2r>ImP}2QM-06LFA~-V`J2ATX0<&G)4Ib$^NqK2uTq^V
zFO&k1fU9diDb)@yE-fYs;_e<RfmLMyIK7nQodA2dLiW+)W2+y{U;3WAM3g*vqBEAl
zE;`28bX_|o5YlPv32X+b;|hD~CQkV3_Ny@^k^}l|oOd3N0S)jB@)LR%WNyy>IMKbl
zXazr_<e6<!J1=r}kUMO_iZU5kjk~6qMa>+1{}O?^4n|+0mF{^s_64|<md411MgGfF
zc%7XK+n^c;1h8}d<BGfM=0iuy#=-^a$;fMmk7HOuUqVr~WL44<w{R$3e9!htp28p}
z*u6AL8u0&F1x%<hQ_|yyr<Aa^=Yz_LNC~@E*43gmHq(}|qHMc<i-LU4O|sU*|K%W-
z5a<3*)*m4=6V42x4R0)DyHiR7B!k at 5CH2yWG_!gUB@s7A?3)wPK&=?&zB3`?uC}lD
z0n0#2NU`!L#;2^VZa*(~HRI)1%OKD1j56bbcX^O*fkY!E8JLU?GAIuceTdG^2#y-v
zxZ~<tJ-a$u>YOJu4d%%K)_W`d6U!<y2%~0Jwb`4!%IxEKq>}Wcd655pb{AH8PcEE@
z5bSmKR#$0l?Z{5UzFJ#8Zq>hL-RMcdka2=2ZykeafMewrc;h{*dvw!xZ!!KVM^PD|
z#I8D_P-f4pMN5Rp|98GEpT?8^mtjgwpb3T7 at bN4#Ug`WgA(2`4Diq;xOLLDWz}b+O
zVCA`23B?>-T!K%GH61N)@#yvZkp%zmk(Dvi8qzdPuE6qE8GE{T=sGF0D**W{Y+OD#
z`ri!%z#k+<7m_4FEdn1POzZ0Dk)4^1WgL*Q(QXP7)wJdJbct1YT$)~Yx&;I);PZc+
z=|iSz0MO?P&|+6mxM^XaKEb0ycb0J at 3VTP~L}8ILQVS+7*7`znz_FB;Hle?4?F^m{
zy5~Tw986&*B?RvWVlVnNSswo4@7Zq|@8#b(&!LS|0$LRs+ZR6IT#Jcs{kChGn<ot<
zMOF?2+bn$}N*0%si&-a2bkdJIGgn8*=Im2drl<?4HkD`fN?KN(K!>Y3y3O?76WNH8
z at fAiH0*YjiJLf(ht`q8Itu;=uLiV^3wPr|wYgfExPL9B<nm<v9DB<!NTI=LU9UQFX
z@Z8HDV3{v#txv;!C80ekNfP)5jDA?)tIICyks|XDMn)F}YpyphugMeEG9~J>+P9!{
zjlr>GRLWL+=)BW6N_pJ-NCT3Sy~bZwyT+uG-skA}&CXw%gW6|bJ|EzU|6o{Fiou-Y
z!@3RuLVT5l&t7zCjuh@!nHkMvH4J%Qs-_5QD=PXMn}N^h$#+74z+}z>xKc at QtyOL9
z*v-|u>HLIxV=oRU at 8c&C>810lW*;s0Mp;5WQ<H%enoKV_+`FUVvp&pe2S^-Iap<Y(
zee=RVE>e7TmE}i6F~U0O6=h~N#y|l{_4u3A>QJ6VhYy%SmgX903Ev9XTZpWCgGvBR
zn>^L5oC+Q!3^a0{nXsE6t1iyZp`IyOkZ{QsEl=81&@?q0`5PD2Te4Pl7g)xQMz^Pr
zO=r<J7xdJxe{d}X*5z_wsEwSX6HqrtwF=RYny7l!w&gcM&6ynZCJuJcqik2~!-DsK
zywmPhr?yP!(LdUgwnB&?N{-9g6#afv={2LeE3i|$(G>$fJ3x)^T$Q=50mq%&R$y7}
zixPt;&an_1?J)>gI|tKsu8 at cB;H?}bxq#ieKatsQT4JEyeO_+Dy3#;fA8hrC=xd^+
zGcOd%Md2ga-&bzsH6 at 2k(Nh}3pSCJ};P59qGm;<u0KkBOYaD*VK>4LF)~tPWu6{S2
zkPr1{rdo~LYMWA`X{^zz?u=pd2^CSYlZN8MQ1zpW%dFc6(oSDk%nWhRA4mq9_T<|;
z`YiUiLmAWsJ`{U1Ld^xAfq{C>TQ*aa`7hz(Z&n**Dd+z7_Nw<`#>d!ev5m8Cv&qRP
z!boF!yiMQpq9Ak!2(FnX=a-xIE_s6QroTLzbEhLEq--se99TXK1Rv1AD|KcAW+#9W
z at 4o#;)5&BemoFQ1_euXKL~RIxPPsvd5=E#Mk9sfc{~RxW_m=uULsG-BKpxBJBm;19
zgHyQ|B%qTH(02lGhTm}eAX+Qdd3_sVV`ujPIh5K?O{r#^Bsv+qb!dW|WRj`A(Dwv1
z7l1viEWi|5W-sUsCOY!d`EeO9%T=oQ>u at X(+`z>N+e>3wC8B06M#8+x%NN@{5PrQ0
zU)QlMJzVUqagTx9E`HW$z((28vLjJL1ZJz}t_jc;?jA#*n`#9yURk2fN&Qh5n+XyS
z;U6ty;4YhQ;u|nPjhPd$NlS#-;RGq~pgAE?>?fe8!paTyGTxg43xu2F9O2)#%oYAJ
zY0%J-J=VeS(x!P_;-%6(#z>{{4>dxHRf3JrPJk5+cz*5=4kOU;fR1WS=U?!O^AUL2
zcKx!|4nN`X+%M^YHmsgaWxes^u|Tm-vq&aVLg=3pV0V|RF|h&!YHb at i<q!_VFnSif
z5lRs8s4W3+7ki;3caKzJAjOL_kSQKG9=?j|&`n1_zCTtoV3g!f2y|T&u`eSVM|!66
z@GZifmi%^_&I(O@)g5KEBuY{^92A3|B+RVUp5|hcn=IkT_KDfMMbLo;y~gdgrf98J
zvY|*B*By`}GcTSsB*vA)nUo^sRNpEcJ$ExlLOwH1{#q28q>-tfng#d5e63Tp%Cl<G
z8l?{>>@OBRY#hP;Xp(YJaD{uCqn#{m1x_{kPv5bVsm&^-4TkcRp^SXYpD4wBs#jS3
zTJdfYO7S(RL3+SslHjO}-D?d%*M(w$Wtt2o684{P26EAbH&*I(^^JbsC4&xr`V{w8
zfRU7NY;w|ZlMPVT&vNR3Ou$=T<h3u>eQh%dBjyWAzgR}!5<^bbf2nzw4|Z}aG!(e*
zvx+rFkcBrB9??r{N0-2<nOB`&@DH_=-1IUTLq#wK7*5Dos@o^!dMucfnYJp-`pE+S
zFt|*>pxMwojW%_?5>Cb(q8E1OTZ_M|{)WDb9ALjw&9A&yS;W0GHHB!W<jEhAvt%Z%
zn|2j(_60pwrSCalYQVQ-{&6_W9kycvDll87n=;ySNp+r8mQ2lb5*2GxJ$da9$c^vn
z0s^uN*B at sgeC40sh`^H;{j#tB8Pv;_&8p&cZ|;0av<1};=^UU at dv})Nf3r$lN2Z{R
zWuY=6fKX+GCQBlo<{LJcxG7TfrubD(2Yk_WU&dzSsgo}ZrgS)e8zJrq^WhHRI-%tk
z0r&f|RDZb1RkLrC1Lr+aBWtbnV(&!H at S<r~Y|*62tNJg(QIkt^SQY`oxSu2oB*og6
z=16@rr=DTs8`U!A55$y$ZvYR_6L1#@D{HJRNUmN@>A#@IC)GIi7Ff78_|M4J4W^m$
zCa*p9^))*4Lq|Qh_rtrrQiQeMu+r9{@XzHl%(YBJaETFx(uJcQ!#Bn69{AFc#{M^C
zQ=8#Ku*jD{wP{?FdX5lzB}#Q`#n#2;bN!X)BnqA-HHBjsZbqa^OnC->lj7cg3_a+0
z0m-<8|5|`%(#cdy<N34~>`g4V%(L^kC~o)cpZSD!gG*o2p=!iY>X?(Tk<&kqDXJ?B
z0_^#Cy>c#=14>1Z%6mo?gd;BDUthcHn48b4oKvKaZsfl`O`28&w&<9tS<t!@T~g8*
z6OO_@^C1Rj0d#4SYUzi|oe4)?kF>x8(6f=_jZmMZ8F0mMsw>;f%nX{1d5xOO2;D$M
z6#g~^`ghPl2*_=rDg9K>OGfOP;SbTKB%M>>B2dhcezc!)2Y~F=qlE^1DRCS=@)4}+
zA{X~JZkp6&l$c(=II;NhmBAAY2K4PkE>;}_S>3nR6olHWB0-)wuc7FUKY^TZCg^i?
zyA>|)t<oCIO8?3^&ZGg*Pn75;96l*J^TQd9)t$MCl5u&}?l44$!E;*iFs4=lcuFf$
zj#uX^{lX0s2uLSWf<Lg2zWZB0tsZ<(HSrEFr22v`UvDhXb4ypSeB1kOdf((-!?yg)
zUXOrez#7X*M#D}{P88mG>e(e_W<FdD_4a7xY~1o-YrkRK`b#F?uSWz4)T at cmuIlQ<
z?U@hQ8cM6W>8wG=A0AQz=?f&{Q83s$1$Ys6-8 at s?L?l9Bxz^dtupdCkg;~Ap0qEA&
z>0gqvdamzC?lsr5-<D3JVQKM;BzgfvM<Na7_0a1SX6VbDz~E0n0NQ-E7opbk%UD{?
z#3{2crNkM)sxbd9V97Pzqt8$W3PwRtIR%^j@K@$(x5xq4LRNQ;jZGzzxZkD~^&Lt!
z4i0^vUb5OHDOlx-;kDJYmP`T8hnTe+qnD|+wm_dOey1W|>U?T=hU04{s)Dq#Sb_?(
zgDK7|i7nSb7M}$yAw&m0`L1y+Fs1g)v;Mqa*8Fdh_E=?QrSI*dheCam&DXOrvRHq#
zi>>@K#2Bj?X3cx4(JxZ!E>KveAsJY at 9(wc($Jyo}8NhKw(6|v^mfTGEaH7K2tgvzO
z718q!)0;c*@_~k^_3rRvSMb?Z{z1WA&|43~Q!^DwZoOVzxJwsg!YBiW`xS2)LutzG
zW!V7RODj2)`AV2qcU5OL<0qf|J`D2K#Hq(EN_)U$)+0?z^UYel;ft!+$s4f-!<d8v
zxtD&#2cfZmh6h;WF70oy)jtwq$a|ZMkgcCMdi&hquWtG)&w0g&#Rk0axRh-35@)vT
zH~U#7rp;po3^Hjn5(wPU#}leS&kbxG&5|>(c`KCv!OK2BKY!L2icfGa(*GX7dGnj#
zE0^`jHNqnJv${-d_DLdE&PKYkv$I2fD!B7zxxE7%TUuOLdyfp)3<+Nayw&wM3SLa3
z$m|!FcLjXU5J`&@xsn5LU6IeS!XUM^<SVdEa^wGwsikLm_$Ze7n2Gg-P9zq4&50Lv
z6FI{0apfrstKJ}Ww1&l?C<D3PiNqTwMlbn6a6Ov(NwMlH|56BqV*>Yk0eT4OAh=7e
zL=XLM+^j2^t#vew1CJcxM=G0c0maO6B_4O*gKuHvvyI>LWvoT_Gwjdaqm$5!)An=6
zEDL>b9<Yxy^{d*S4f_Xdi$8}`jQkw(SPRq`JC<aNvGwz~L$>1aF11XkWpz=@=Q`vs
zxA_f;-i12Ti6-uBa~RCxiHuSq+h at +YJW}<E!B6QMj7<oP*kgi@saa4U(>k7tfV*mo
zVn03B^KUp3QAx-qxTx<ud+7h<5n;YS3g~B{7>bLE#4hr{{*kML<Y9Cz-KB>GeW at ht
z!br6I?+epm$L9r049i8)qDHxIh(dv{61ILUPxDnxPd?4q{N4vcT?*0wG~G;YEBSDs
znAV7L{7>ul2R0E3>YxE}1Co(B3!vJb&X&Kcxl06sPL)gD=iSKD|K95VHZDG&88~ml
z<`m;~_6|f?>>ai50qky>t#PgB3ps_sE{hqu=Q>jBjCfy#2PzYA7^vLx5>IPS(0- at b
zt*{3_05HW+ZO?{yy()?_fPiG35j1>API<zSt%Vr64;ntq9RoORaeOD7gEsWbln&G@
zw&V>8rF1>@@fc*IMyASH at bOoua%82vAk8wpjNSxHqel~T=`2NpuKqqP7g$Q at w>$5c
z<orRcJ`e0GM`O+cGLn+LyZC^y&R5p5f4@$+YZWL}5JW`@<m7-d^<^$_9k4|?M_16k
z^0dZoiq*@LG8w`FZOw_JG>`h(%g$01_N<y^(vU2B-Ku~|X3;B(Mkb&kzeXwSs&m})
zS2Qq(tDE0w_@ojbMw`hf(_<v-W!h=w*>CTxPi7|F|9zo;ERZI0or^1V(D*10SSA1S
zxLv%?FO+5aUZnKcAcH@=F<=7#5qDErAi9}zpxjGkqh23UmP)$3|0IIsd$!KyZ|?-!
z53=Xa#DLv5tig|tdXKj0{rmSf`Gh+(fp{V<s__}DXDwj_+(4R6M#MOLo_@s@uPCg1
zeErFa_Y{{uR*znZK-DU~5HA3|jK#1_z>Sq6iH99J1D&W%LR}~*M%a}9X<b(b=6&~4
zp#;$YpOBD+*Sbzd@W}*0f_qRQWFs_;Q*E}e5@^H=nk_xUsg<?0$=ieWCxY_l-=CLY
z$x@>c4myX3R!!nL&K)zSZ1L at sUqrN_PrzMZYaX}yW$ZlowG7efPCDgb8MFyyUXy~R
zT|>!cIuz<1^kAkSqrKbG7+dH~DFGq%v9F}kxp+f0LhpD_20QW!ynZw1D()KKZ3`}W
z*ywH(A994|j?YJzbwAJNm`!DWG!7g}oMX9JSy%#7E(qmrUQnon{664?IAOZL4Nt0o
znS5{wy<?HsoHXw#xYRe(h82vHG?v|_9HVUlPDNLUYVFxNxbQIhEFp{7DJRtBz$7}z
zR8HjO3YO*kk?XhgXhAQgjzUkt8#j{kZs`NVm*XD&t?<2a!>l!Ne4&d(U~*`YF6tSk
zU#NL~_^oHtakhrCo{?$p154<$k%RV00#MD2IcA<~pLzn7Wy;)KDQ>TDYI-_=q6e=_
z7I=kx`eZ at 1$aoFtlhy+PbW}!kMT3OaQkXQq;TE3KR4xjI at FzB^FtS&TN!5qL|KY36
zYI`Xb`txTI50h#I2X}bnS;OHNd>11U$EjU6V)a#8?&}n~glE;M*!NC2m!XU9lg{q$
zZnxY0_iTlbz%(-|IpAB>T%Z~{*MQnfzj$*)!#IpbD-toK at seN1gq?ziu=cbepAvUL
zU~e0C{O8{OyalOYFBKeq8&cwSAe at a^0T=mGEE)d0SiRyEsE*e#_u<n`3M!hzl4uFK
zr;9J12L|54rSgT5@o|IlH=Yv-Wg%G?gw%Fh)9tw5S^#<fwsjq7xiNZIHGr~$+wuE1
zJL>aTyo6(jWn$- at 8C#(;hX-E79YYWh#MH+pCx^+=J}eUfz?a1xuFp)ZH-Wp$JLnn<
zC_iYV?a#n%CN+)%mEYZ_7Kt3_AZbo}a)0c3G=h5|rxroeZt+DIQ{TO=8u2lQ33rMN
zlN!3m%%v3-T`C3Y99itawQNn`<po-yqq;O(Ae3<T#)1Cn*E^(UCxD~3K(U}<wz){3
z)Ue;T`UIQ%KC|y at w+szw2x<6RyFvvYVqifBwiga?Uzsi*d~W4!HqqU2^;KW(6$(at
zOD^a5(AApCxve`Pa|iI0ro4tPki^IqaDjr-e&^cp6b&uT<Nw&){D at L~DzO|~^_`d&
z0ck7gyzr1bFRpYJ{33+ech;T@ZU3)@GY^OIecSk0E3#)BWf$4XPGoB$5?^IxElY;%
zk|k+Kl3mv9L?T<Zi6L8r>`V5>l4Lhh4HDjKe#h(ZhrgaN&;302eO=f2IZxZ~4A!wa
z`Lo~EpU|5%+4~Y_4jcq8zOKat1R#O`4ZObbNiN_<n%nccUmEjg=J)!+s&)25KGij@
zWM{;#fkL|Ss_kB^ZFGEbu?KCgs?`6+I^b9%`l!SXz05Eyyv|n=UnZaJ|FUyo2$%X$
z^qIo;(>AwtL-PiZvW=I;Bzm at I@8`6L)bT!Hy7YSxT%8`=W#pYP&9srdwM&~VM3Ktl
zh9<F7$j&Lbb2Ai2&ndm!WQe+xK|q?{^ql?;bn=}LEjJ_reBr&7WyZc2(zTolsNONx
zJo36ch}`q`Wdm3IT6IQh>V@<$M!~<(j99gsz7WhAI1&%e4{*`fqf}iWW@@H55DW?{
z1~GH&@{P(!k5-@jP6@(C_w`=X3fgWU`;x9}R=bGniK&^!N1|Nz8l7AXZ);=2$%Cc(
z8~GTTOSN)|pHmNIBqE0^C|qXJWf})e(dcUhGQU_tFfpLvtvyjyP;hVxWFE@#%4u<M
zJrW1k*?>zr35f{9eu4-I$UulFcF_2fZI%AUyh?bT+RBA{hS>3$YcUWxiS$Kwn2D5D
zi~j%N8KrE8X<zu+hL}0gvNcYQVj){h(P{YQ?{VeEG<^*840D_{ItQ5qhz**ka=NbQ
z`Z#o-n!QD)ne6_(#L~!q76mAY%kIoh)AP#8?oCIZVh)BmzHCdTt?=|A#~vPCwh#=X
zd5W8(;sE#$Yx-93hlkiUl#POyJoBlz&Sp&%QK?!nqwkxp#$T5H>`RuFSaZXd?((a*
zFJ}|mh&yXo-VYq<l06JO?;a#T?1ANuy?Tz)`qgWwoT6vhjseQpLih$uY(q!K*iw)z
z<W0bT`?ILmTFSnN6t?-!xNr_&?T;n%r%D3CL{Hm%@$TujS=D(Tmem4}FE4N4=2w+`
z;=y)TSJz9|tk;xv+soiR;-lR<yIjMQZUhM@;4A$fA%Tn85c%D^4b925F}-}cbRI9j
zr`j6rbB#3|3oF)~Ayq)`X&c{Utq0#7En6C|zLYq?DN656ArJ?2jSs&zJ?7EaZDrb8
z;5(YAsEB*%scc135R_f*eRwR!S!L_2>u+^Sh!HA*+nvSFb#khoI!DF3V_87)+s^*c
z%$S~dXh~}XghB-BCcL&rWLIuCfg|<bZl^{^qLF$8Jkg%x7o<>Pr-mOBx?%OCo?EcV
zUol2qnxcdru))ASAYiK3FgxzjRtwdS1sQbvAE!0&u*UUN{gXo+cC0=seDj7J)BwB}
z+wMG5P&iO+c7Q~ip2--BGi)DnHX20O7D%D+X*{ON-an#;h%3d##R~YodjjG&a1(H*
z(rm4LzALMR%Ap!`UpzpCR#sNxW#ew-cLE*&!3%<1Cy|&*eV9*c!gO21LL$WUVs@+i
zO8wJYgCMK_!v>j0O~sPop-xBBFLLC1=n57Fdc7&_8a!NFa|6pJsgWtR;I2EG2Id27
zfP4Hb2O4uV;Oh}|C)E4sVoXvN@#pdKPb<DkQp9!MB<Wh}pG=iv2l?`a at Y`29IB48f
z<Wh~qPJs*r)*#q{J?X}^lhOmmZp1Y@L%p$qLLlTe8vCKVsSnReF4}EMfJ`GE1TQZV
z`PZ^zLKN}ONHn&jxY%LMSwKI6LTKkLwf#x*acZtDl~*kOG8c!#&Hw1zwtNJ6B!eR(
z_Iq^&cxKZd8uEfLn#bWLeHC<dbb5tn4vWT+%1C2e<R^c%!v!-*QZ?$gI6|Xn%tta5
zJ>Ip+JZ=$M`>fu0_>&=N%DoIN1j9~e)e=1vrnK6TiBJ9C`S*q<G{v_=&cI8=67>lS
zwlS{YdFMM!h#nc4{4vy@<L`2>2(noB^po#tQy3x3mKIujmu0;O*y6d>Yq;&3n}d!H
z>!b1khSP@$izs*0r at tb4^*Q0{6fG6Q15)m at V;j;<{DxnhaMbTW#sI(j`>J=2)#jUS
z|LH6o=i$yD7?lK3w$Lz3)`Elz3OdSvZ)8g2tOJ*uY21Gf;AJf%pZbT>azAlKRCOkw
zUBph&r7U>eepmadR9^LF!_ at Sj#EFj^HMI7<gWC!{;L~GJJq~Fu&KkZ_H<U>Gu*^E<
zDf<-U2&#&sy5Uz14LoGP^LMsgWtRhCR6Hvy%ZjE94mx<Tx}RTZsIT_~?}wK)8_PV5
zzZjCyih`%;RK8Jw(_L-vdt!YKc&z1k<BrZxi<YqZj9l`tv6<rvwnwNxhSUyxNr?+P
zi`$sIn-Gf|bw!%Y7!|+lekVt*JE6+TE>|ql{fucNfDCoi(BWwrCsmowOiXZvhfDB|
z6`3#IhX-4kqhHx~J$2|Qf1y}6QTcwAxG_+}IncVjMHu!SntKkeEW~N>0)oV1p2GQW
z^lHMXVfl at H1jos4fDzz0C!4KP%FA##cDz-&z-oa%0hkkrRhit5fs!4%A{ZB!FDOOj
z!mz8Yw9>rX3LgT+3_&5fQWtvQlT at xa18cf;ZZdpejHsWr5scrpM>y=~-+_=KppYw)
z&VuI+geTQ4>uX!Soe0b~r+`0BP_fQ&z))xYPXNA9Z<Gp}ga=ZuSpX^`TM{jN!2|m*
zLP)e!P~qjNB4Kzl;}Bxg;n&gVa(o_4BN-~wz%$}$nGVy2`gdy)S=`7<(mT{Wmz<j-
z;^ZsXy9L?6u*Rpkw)8EH8~nvB_*bG)0i2W-r-L!kDx?QxXHo5L1vHct)_&&zEOKsj
z|593g8+hI!r!SS#jpUM1PIPX%(rmpaHnXBz9+yiIoF^7^EVnc$wP&&SEA!5r3Cmqv
z<$|xTpWj-OyPs(ZVN3-VmL~=viJw6)IJgWmm2GPz>E~+CsMs<L{th7*yiqbF?nVVL
z0smOl96DZJn5CRN9r9ymp9eDomyfl;AjlP+-0W;lyPeGC(GpJNf_nvc8FQ%rQ|yAk
zvECZ7relSQthd-yy=p)OB$SiOI@4<c9cGu!THV7Z!R~)@=>bgDA*(G;)pr=Fc^nxG
zwI1Y}PzAX3XQ_6gJLc}bFGe!QOG%WKlw8~K;q}9+!!7nXXn`s(wmz+;_g@%9Gw?{=
zRJi`A2MPzC;>QupHRj>VaTG}mT;N@^s`GrZHi2z!F0a1tYeC||(LoeZaar+E!21x;
zx)#O_QU06wrCzl_4OZAKmL?)xs0Ey=+aXR4O3o2WZ|GS!L;B%Bs^ux!IBs!)>x&OP
z{j-n_mN4}kCRkLT5k~6-VR-g*)8%LS0MP2I`#Jm4VK45q#zO{vYByeRBOli^|1>P$
zXE0VIIqz8~od^ob<b74})#vSBG%A}VBz2#0Ca{wH)yNC7IPbepa<i(xJJBg{Y|ah3
zkbi_@&Rhaczn0h58alWhp*;FvDxY>vh5p9hq0#)J$;q60|DSf&waze1i$8c*@VD7X
z-nrpK-bhk;8Bo&6M2*DHbC5-#l-RO&U?z#VM`w9SfO<pvKK|<+#9*1I^22RmzsD&f
z&k~bA_8*$O8!u__4i5MHvx=U%X1Nszd0+~O6jJzhck{U7;%|`WA>(btNZQ#^GBN$-
zzPfe`O+nfusA{2zqn3#SOMQ3ay9Ily7Sg0 at --b@Fd=JBRaB06{hCr{9A7Lq9d#(z9
zD at J2MoRg!f^60Aihv_go at Vh?v3X3&n7v_k1d_q&-qYt1bw@=vBp at W(Q4lo9<cEnUo
zmX?+Mw+K`x1Tw&VXLo5?`RNZ4bzvYdjkB>k9vzYT&%Y_#k6f6YB~EovPt#CkpRg&E
zm%Nr?l9p6%X~FAya at 6c5dOz{)+LRk%3^Pm`L_apGJ$9quMv8MrP2q;Eb<H`#l#lfn
zeW#cc*_5B<MKnDxJ6)xVKv9KG(5kxk;)s_XAx2(bUw7G`vT8fHy0fv=6aS+5 at SvZV
zNleQ$NuU(y-(vz89g9zp)#j|3Zs8K at -!rO6(rgq0GKvQ8{MypGd(qe3%S(pHO5Xt%
ze57nSK5*~;ZKA1m{d_}tIV0qN6cb}rmWoPCLkaHB3GU}3sy6|KJbU(RRk?li!PMFx
z(y2@Q47v1EXF!NtidfcsqmUpx4~G=ZsByu&t)5nk^l&;PDPv=To9<cUruW(7l#(3u
zt7~hvwbRCEbn*^UWUEa}7z2-K=rE=_dA;-8X-0cjSIM=Df~yeGa^!GAdzgChR*ac8
z<&$9Zl*OB<8mW=`urS)MkBE&lM~#3w`Ky)R^S;`z0+{QzH0_zwr+fWtT%Dai0wBE2
zaNZ;Qc!ID%vc6V=F!PWjwn%x2nVN$3DMbi>sRg4vGRDry>8f7P&xe8m75Vu>wK5oo
zXlW;N^3!bupN5ddq*z*7&fmw=9X^8VAY+`TJ`7^27qgslGBPe- at LwvX=vU#z?#@@K
zguP4$f^mM{RwN5S4=>uo$$Bgymrtd7?oWVj#B$-}n01}!tGOoBTw)Jp)Tg{j-)!yJ
ziAnb}4(9zm$89c=p<8+R*Qj0&iuKzbcC^bOZ^C0^W5>DdJsd4}T95I4S3BG^G(n?V
z-D_Q(<$0G*kB*Mg>;Vfg`1Nb1SKpT}U+U9WUx&g!VRNDAd#YY^Wh3ye&8NKXF<1|t
zvXf22QrpOmq??F8Bma{MT9H?0d)Z6SXE{NkbS_|GU|`^u*!zWZu_yuIwm?;md8h|o
zx95?3$%;cX*9AbyXVFXGrF!8-4;;0Onp)}Vi&ObS;pyo}_~<0732||8o7!owacjS~
zDbz|_C(S+709;pita3vfgTY*omCft2NeVw)|FuU-=9lctqqksG+wKx_qzF8w+41Xz
zSY&Y&vf|4y%(kD_*VpGY%)jxw3t#by-k_3_l4CE+*+e}EpVP+)1*+WN+jf8)Aj7v6
ze6c7&joWKkh{-|BnEAr)!67HN{jusYIb;l^$mkj~@Fsp1Mj3~SMbhAVWIJqR(`*zo
zY-Q8*ZzOnvJGJ!Sd9+NOl{6FuN$3(Y0SF6%a@a~bZ3ehOBk6$>>+$7~6j4y4gQ&M$
zL3!Y}fx at P!q(maXVC5Vz5`^u*i>>`!Px+5aD4=PdzWVOKDkmogn*#bnQ&kl!oVw;`
zJbSWGf=_HNr1tdxmeOL*HY at Sf#NSYl2}R}?6cltW-gl$*40_{(3WZr;N_(WLl!;Eh
zmqRVu+&luP=)fN`8GS`XMZrT(k`FcR3C6c{bzL=7N_%TUS6y8VE{6&;$@KaIbQB~@
zQa^3A3cxU(2-&)1-K(xO`-)wYpZNl8Y_u$otv?48jzpAM)|O}Fk8FTb7VO!QyJsg>
z9(>Dww0SNnrP4J#FC4yoX67Tfg&%GcudQ8jB;9+UCGkROHgM!_?Q|Ssw>aUCX$d=M
z#p55Uon@}>`#x*4MbC7q=-S&00oGtn$HOuYdfDz)8<Y3X@k9zW;;%jIo%X?Q4(maa
zT+j^xPd#97sZA>7q^2NeH^6eo3ym<sw-FK&x>9-kTV~tJ19JF+!>`LS8X9CHmX(K>
zJtCX57pNO~%5*Y+Y0zYDYrgFU<cn$$+-s>?s3ynQSYTV{;NXzI$62NbWfD30A*p{(
zjXIY%_*<wDivULy=!kTDLH~a0WB-eSDuEor$$9>EFYe9`C1N&U1My#E)8(7o&9k$8
zTsPH>b(yK_2<~-+O@%be2Hy=NU`5IO@&`KrBaZVzZly#pRdl6eykptxPj;;xF+B4R
zE-DNy^Tz1NsHmikhe`;p%5a at D0(bbI+FF;B)`OAcc(-i9JPpKuuFf8c8ADT3Aio;7
zcj@cOrnQ43Q<};l1hfF)Ny}Up{$Y>cF>a=q`>ezWJKNft at tr$yz#b%QhFvjkUtgDm
zq>Eot%(w4G9~6VURSUs>0p2B)uvDzr<{(u_&_d)4EPBIA`OQA|n;f%bVNw6PEM#C{
z@I7HUo0WPV49-jM<tCsO<xO<h;|~sr9v;3N;o{-~`?4+00_`V{#~xh#IKS0>Q*(ce
zTQ4EoV$*QQI9%H4%4@*vF|uj5skUOQG+Zjp=6oCGJ(at^iRq(Kv$8&c{ouY&Ru*Cq
zsAt&#y&RYnaz&s>(tJxqHEr=@%1ad%WfhaI61*NOh9^X{YwPO5%_PI%cWwNgJr;YL
zfloC){B{gV at H}y{TDReiKk^D^4eQ*_evWzePMWtv*^m?J@?|O{508Re$_55y+zu21
z<gp|Vg#Ix$Pf>**cB2d!>Q>CudD)-0UtdCG;t#b%UQf5UJ5rO=U3qaCa8jLl+PW3e
zxqvTPjT&dEhZJJ_&R9IfzliXuUyq;nVV<_l2e-|ejc!vz{wCeC3#zJ7cs%|?(*)`_
zV{qXw+;c{1N(|f<iY>w5>w6zAOI+yaXC3+l8?GPD{+u7IgaE1??BzSM9VDs>&TZ+a
zPgSzEMHAk9PYNC$gR%h(uklx3GgIlDXlWvmNC(a)`15`)YFa3bry&X4F+bIVZ_(1y
z9=;Mi7}eseLFYoUGDnL#Vt_(ycPd7PHtG|cA(SPfV0RZ!?Zc$@{mA^~0WT4FuN-Wy
zsquDx{HU$o`FYwa*84DeeC;3yd46BMhf_v_dds>f$x(v!a&+YZz((OS^{=JtbISyY
zjXN`nTFi{vw$mo+sRnP at bz^>e%T-Cf`yR>~5jq at DX{CqoN1yt13-)Fc;|>E!KX<iQ
z5nC7C6bdB~!IN_yRg!$G>+5QbQ>~@w2U;Tt-8f#tXO*B6EemFrM{I(5&EEY%Lo+kC
zKb-r>4OQM<2Q}UuO8+F8F`C@1A**hDH`kg-UQk5duKT(6z{cv7CN+nF?br<(#B7+N
zFZ-S#m4Aje77$Oya^DL|BhVD&2<tIX`UlI9L=e*yMWgx`7;HjiNMJmV%U1TXLk+|v
z!=595H7F?PI<!~n_UkIA%nU5-eo%anKK_x|UGUrHVe0P##8(6|qKLai2XWo(udywn
z*yC>(WiYp3eFs;Dee`wKA+g}xfhGFni`XnnI0oC8S%ArEP+oe32xPl<N4_kcdXRqZ
zd<g$(5U(N$Cwv}!(c!F-g$_7_IE5<#&Q;95m&)dt>4207ZEjrn49w7o?{T;*rso*X
zWLXZ<lo_0$rW~!3tfiQ^f>NbeZ!gmo!o5I5vkh at 0juta>AdFe)uO{OesXY2ABt#0h
zrU<Xlo7I2zW{HQcNJWzU=hz&n?3QfGw)V;rtNnU{WKUuUe`Z|g0ufyNmV}3a7cXA<
acC_=hL|V7tcPs><BlNBqqRO>xLjDg+r#rF$

literal 0
HcmV?d00001

diff --git a/package/midori/midori-0001-remove-libnotify-dependency.patch b/package/midori/midori-0001-remove-libnotify-dependency.patch
new file mode 100644
index 0000000..edd1e17
--- /dev/null
+++ b/package/midori/midori-0001-remove-libnotify-dependency.patch
@@ -0,0 +1,27 @@
+Remove the libnotify dependency.
+
+For now there is no libnotify package in Buildroot and this feature does not
+seem necessary.
+
+Signed-off-by: Hadrien Boutteville <hadrien.boutteville@gmail.com>
+
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -143,16 +143,7 @@
+     endif ()
+ endif ()
+ 
+-if (WIN32)
+-    add_definitions("-DLIBNOTIFY_VERSION=\"No\"")
+-else ()
+-    pkg_check_modules(NOTIFY REQUIRED libnotify)
+-    add_definitions("-DLIBNOTIFY_VERSION=\"${NOTIFY_VERSION}\"")
+-    add_definitions("-DHAVE_LIBNOTIFY")
+-    set(OPTS_INCLUDE_DIRS "${OPTS_INCLUDE_DIRS};${NOTIFY_INCLUDE_DIRS}")
+-    set(OPTS_LIBRARIES "${OPTS_LIBRARIES};${NOTIFY_LIBRARIES}")
+-    set(PKGS ${PKGS} libnotify)
+-endif ()
++add_definitions("-DLIBNOTIFY_VERSION=\"No\"")
+ 
+ option(USE_GTK3 "Use GTK+3" OFF)
+ option(HALF_BRO_INCOM_WEBKIT2 "Serve as a guniea pig" OFF)
diff --git a/package/midori/midori-0002-do-not-use-rsvg-convert.patch b/package/midori/midori-0002-do-not-use-rsvg-convert.patch
new file mode 100644
index 0000000..8cbb5ea
--- /dev/null
+++ b/package/midori/midori-0002-do-not-use-rsvg-convert.patch
@@ -0,0 +1,39 @@
+Fix the need of librsvg for the host.
+
+Midori install script uses rsvg-convert to convert some SVG images to PNG. So,
+we need to build librsvg for the host but this requires to build some heavy
+other packages like Cairo and Pango for the host. Therefore, we hack the build
+to remove the use of rsvg-convert and we copy prerendered PNGs to the target.
+
+Signed-off-by: Hadrien Boutteville <hadrien.boutteville@gmail.com>
+
+--- a/data/CMakeLists.txt
++++ b/data/CMakeLists.txt
+@@ -1,10 +1,5 @@
+ # Copyright (C) 2013 Christian Dywan <christian@twotoasts.de>
+ 
+-include(FindConvert)
+-if (NOT CONVERT_FOUND)
+-    message(FATAL_ERROR "rsvg-convert not found")
+-endif ()
+-
+ include(FindIntltool)
+ if (NOT INTLTOOL_MERGE_FOUND)
+     message(FATAL_ERROR "intltool-merge not found")
+@@ -28,16 +23,6 @@
+             string(REPLACE ".appdata.xml.in" "" DESKTOP_ID ${FILE})
+             INTLTOOL_MERGE_APPDATA (${DESKTOP_ID} po)
+         endif ()
+-    elseif (${FILE} MATCHES "\\.svg$")
+-        string(REPLACE ".svg" "" IMG_ID ${FILE})
+-        string (FIND ${FILE} "/" IS_DIR)
+-        if (IS_DIR GREATER -1)
+-            string(REPLACE "/" ";" DIR_LIST ${FILE})
+-            LIST(GET DIR_LIST 0 S_DIR)
+-            SVG2PNG (${IMG_ID} "${CMAKE_INSTALL_DATADIR}/midori/res/${S_DIR}")
+-        else ()
+-            SVG2PNG (${IMG_ID} "${CMAKE_INSTALL_DATADIR}/midori/res/")
+-        endif()
+     # These are being handled in add_executable for the "midori" binary
+     elseif (${FILE} MATCHES "\\.ico$")
+     elseif (${FILE} MATCHES "\\.rc$")
diff --git a/package/midori/midori.mk b/package/midori/midori.mk
index d55f5f1..66df56a 100644
--- a/package/midori/midori.mk
+++ b/package/midori/midori.mk
@@ -4,45 +4,57 @@
 #
 ################################################################################
 
-MIDORI_VERSION_MAJOR = 0.4
-MIDORI_VERSION = $(MIDORI_VERSION_MAJOR).6
-MIDORI_SOURCE = midori-$(MIDORI_VERSION).tar.bz2
-MIDORI_SITE = http://archive.xfce.org/src/apps/midori/$(MIDORI_VERSION_MAJOR)/
+MIDORI_VERSION = 0.5.8
+MIDORI_SOURCE = midori_$(MIDORI_VERSION)_all_.tar.bz2
+MIDORI_SITE = http://midori-browser.org/downloads/
 MIDORI_LICENSE = LGPLv2.1+
 MIDORI_LICENSE_FILES = COPYING
 MIDORI_DEPENDENCIES = \
 	host-intltool \
 	host-pkgconf \
 	host-vala \
-	host-python \
-	libgtk2 \
-	libsexy \
+	libsoup \
+	sqlite \
+	libxml2 \
 	webkit \
-	$(if $(BR2_NEEDS_GETTEXT_IF_LOCALE),gettext) \
-	$(if $(BR2_PACKAGE_LIBICONV),libiconv)
+	$(if $(BR2_NEEDS_GETTEXT_IF_LOCALE),gettext)
 
-ifneq ($(BR2_PACKAGE_XORG7),y)
-define MIDORI_WITHOUT_X11
-	$(SED) "s/check_pkg ('x11')/#check_pkg ('x11')/" $(@D)/wscript
-endef
+MIDORI_CONF_OPT = -DUSE_ZEITGEIST=OFF
+
+ifeq ($(BR2_PACKAGE_LIBGTK3),y)
+# The actual WebKit logic in Buildroot enable webkit2 when WebKit uses GTK+3
+MIDORI_CONF_OPT += \
+	-DUSE_GTK3=ON \
+	-DHALF_BRO_INCOM_WEBKIT2=ON
+MIDORI_DEPENDENCIES += libgtk3
+else
+MIDORI_DEPENDENCIES += libgtk2
 endif
 
-define MIDORI_CONFIGURE_CMDS
-	$(MIDORI_WITHOUT_X11)
-	(cd $(@D); \
-		$(TARGET_CONFIGURE_OPTS)	\
-		$(HOST_DIR)/usr/bin/python2 ./waf configure \
-		--prefix=/usr			\
-		--disable-libnotify		\
-       )
+define MIDORI_EXTRACT_CMDS
+	$(call suitable-extractor,$(MIDORI_SOURCE)) $(DL_DIR)/$(MIDORI_SOURCE) \
+		| $(TAR) $(TAR_STRIP_COMPONENTS)=0 -C $(@D) $(TAR_OPTIONS) -
 endef
 
-define MIDORI_BUILD_CMDS
-       (cd $(@D); $(HOST_DIR)/usr/bin/python2 ./waf build -j $(PARALLEL_JOBS))
+# Midori install script uses rsvg-convert to convert some SVG images to PNG. So,
+# we need to build librsvg for the host but this requires to build some heavy
+# other packages like Cairo and Pango for the host. Therefore, we hack the build
+# to remove the use of rsvg-convert and we copy prerendered PNGs to the target.
+define MIDORI_INSTALL_PNG
+	$(RM) $(TARGET_DIR)/usr/share/midori/res/logo-shade.svg
+	$(INSTALL) -D -m 0644 package/midori/logo-shade.png \
+		$(TARGET_DIR)/usr/share/midori/res/logo-shade.png
+	$(RM) $(TARGET_DIR)/usr/share/midori/res/adblock/blocked.svg
+	$(INSTALL) -D -m 0644 package/midori/blocked.png \
+		$(TARGET_DIR)/usr/share/midori/res/adblock/blocked.png
+	$(RM) $(TARGET_DIR)/usr/share/midori/res/adblock/enabled.svg
+	$(INSTALL) -D -m 0644 package/midori/enabled.png \
+		$(TARGET_DIR)/usr/share/midori/res/adblock/enabled.png
+	$(RM) $(TARGET_DIR)/usr/share/midori/res/adblock/disabled.svg
+	$(INSTALL) -D -m 0644 package/midori/disabled.png \
+		$(TARGET_DIR)/usr/share/midori/res/adblock/disabled.png
 endef
 
-define MIDORI_INSTALL_TARGET_CMDS
-       (cd $(@D); $(HOST_DIR)/usr/bin/python2 ./waf --destdir=$(TARGET_DIR) install)
-endef
+MIDORI_POST_INSTALL_TARGET_HOOKS += MIDORI_INSTALL_PNG
 
-$(eval $(generic-package))
+$(eval $(cmake-package))
-- 
2.0.1

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [Buildroot] [PATCH v4 1/3] libgtk3: new package
  2014-08-01  1:33 ` [Buildroot] [PATCH v4 1/3] libgtk3: new package Hadrien Boutteville
@ 2014-08-03  9:35   ` Thomas Petazzoni
  2014-08-03 10:15     ` Thomas Petazzoni
  0 siblings, 1 reply; 7+ messages in thread
From: Thomas Petazzoni @ 2014-08-03  9:35 UTC (permalink / raw)
  To: buildroot

Hadrien,

On Fri,  1 Aug 2014 03:33:46 +0200, Hadrien Boutteville wrote:
> Signed-off-by: Hadrien Boutteville <hadrien.boutteville@gmail.com>
> Signed-off-by: Eric Le Bihan <eric.le.bihan.dev@free.fr>
> Cc: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
> Cc: "Yann E. MORIN" <yann.morin.1998@free.fr>

Thanks. Unfortunately, it still does not build here:

Making all in gtk
  CCLD     extract-strings
  GEN      stamp-gtktypebuiltins.h
  GEN      stamp-gtkprivatetypebuiltins.h
  GEN      stamp-gtkmarshalers.h
  GEN      stamp-icons
  GEN      gtkdbusgenerated.c
  GEN      gtkdbusgenerated.h
/usr/bin/ld: skipping incompatible /home/test/outputs/gtk3/host/usr/arm-buildroot-linux-uclibcgnueabi/sysroot/usr/lib/libintl.so when searching for -lintl
/usr/bin/ld: skipping incompatible /home/test/outputs/gtk3/host/usr/arm-buildroot-linux-uclibcgnueabi/sysroot/usr/lib/libintl.a when searching for -lintl
/usr/bin/ld: cannot find -lintl
collect2: ld returned 1 exit status
make[4]: *** [extract-strings] Error 1
make[4]: *** Waiting for unfinished jobs....
/home/test/outputs/gtk3/host/usr/bin/glib-mkenums: gtktextview.h:59: Failed to parse `  /*< private >*/ '
/home/test/outputs/gtk3/host/usr/bin/glib-mkenums: gtktextview.h:61: Failed to parse `  /*< public >*/ '
make[3]: *** [all-recursive] Error 1
make[2]: *** [all] Error 2
make[1]: *** [/home/test/outputs/gtk3/build/libgtk3-3.12.2/.stamp_built] Error 2
make: *** [_all] Error 2

With the following configuration:

BR2_arm=y
BR2_TOOLCHAIN_EXTERNAL=y
BR2_TOOLCHAIN_EXTERNAL_CUSTOM=y
BR2_TOOLCHAIN_EXTERNAL_DOWNLOAD=y
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.org/toolchains/tarballs/br-arm-full-2014.05-rc1.tar.bz2"
BR2_TOOLCHAIN_EXTERNAL_HEADERS_3_14=y
BR2_TOOLCHAIN_EXTERNAL_LARGEFILE=y
BR2_TOOLCHAIN_EXTERNAL_INET_IPV6=y
BR2_TOOLCHAIN_EXTERNAL_LOCALE=y
# BR2_TOOLCHAIN_EXTERNAL_HAS_THREADS_DEBUG is not set
BR2_TOOLCHAIN_EXTERNAL_INET_RPC=y
BR2_TOOLCHAIN_EXTERNAL_CXX=y
BR2_PACKAGE_XORG7=y
BR2_PACKAGE_LIBGTK3=y
BR2_PACKAGE_LIBGTK3_DEMO=y
BR2_PACKAGE_LIBGTK3_TESTS=y

Thomas
-- 
Thomas Petazzoni, CTO, Free Electrons
Embedded Linux, Kernel and Android engineering
http://free-electrons.com

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [Buildroot] [PATCH v4 1/3] libgtk3: new package
  2014-08-03  9:35   ` Thomas Petazzoni
@ 2014-08-03 10:15     ` Thomas Petazzoni
  2014-08-03 22:22       ` Eric Le Bihan
  0 siblings, 1 reply; 7+ messages in thread
From: Thomas Petazzoni @ 2014-08-03 10:15 UTC (permalink / raw)
  To: buildroot

Hello,

On Sun, 3 Aug 2014 11:35:35 +0200, Thomas Petazzoni wrote:

> Making all in gtk
>   CCLD     extract-strings
>   GEN      stamp-gtktypebuiltins.h
>   GEN      stamp-gtkprivatetypebuiltins.h
>   GEN      stamp-gtkmarshalers.h
>   GEN      stamp-icons
>   GEN      gtkdbusgenerated.c
>   GEN      gtkdbusgenerated.h
> /usr/bin/ld: skipping incompatible /home/test/outputs/gtk3/host/usr/arm-buildroot-linux-uclibcgnueabi/sysroot/usr/lib/libintl.so when searching for -lintl
> /usr/bin/ld: skipping incompatible /home/test/outputs/gtk3/host/usr/arm-buildroot-linux-uclibcgnueabi/sysroot/usr/lib/libintl.a when searching for -lintl
> /usr/bin/ld: cannot find -lintl
> collect2: ld returned 1 exit status
> make[4]: *** [extract-strings] Error 1
> make[4]: *** Waiting for unfinished jobs....
> /home/test/outputs/gtk3/host/usr/bin/glib-mkenums: gtktextview.h:59: Failed to parse `  /*< private >*/ '
> /home/test/outputs/gtk3/host/usr/bin/glib-mkenums: gtktextview.h:61: Failed to parse `  /*< public >*/ '
> make[3]: *** [all-recursive] Error 1
> make[2]: *** [all] Error 2
> make[1]: *** [/home/test/outputs/gtk3/build/libgtk3-3.12.2/.stamp_built] Error 2
> make: *** [_all] Error 2

I've done a little bit more investigation. The problem comes from the
fact that the extract-strings program is built for the host, but using
target cflags/ldflags. The gtk3 configure.ac script has provisions to
specify a PKG_CONFIG_FOR_BUILD, but in the case of Buildroot, our
PKG_CONFIG_FOR_BUILD is just $(HOST_DIR)/usr/bin/pkg-config, but with
several environment variables to adjust its behavior (because by
default, $(HOST_DIR)/usr/bin/pkg-config is cross and returns values for
target libraries).

So, I tried something like:

LIBGTK3_CONF_ENV += \
	ac_cv_path_PKG_CONFIG_FOR_BUILD='$(HOST_CONFIGURE_OPTS) $(HOST_PKG_CONFIG_BINARY)'

but it didn't work as the autoconf code does not expect the command to
have multiple, space-separated, tokens.

I've already tried to override GLIB_CFLAGS_FOR_BUILD and
GLIB_LIBS_FOR_BUILD with no luck.

So, right now, I am wondering if we should provide a
$(HOST_DIR)/usr/bin/host-pkg-config that has built-in all the necessary
environment variables to return values appropriate for host libraries.

Any other suggestion?

Best regards,

Thomas
-- 
Thomas Petazzoni, CTO, Free Electrons
Embedded Linux, Kernel and Android engineering
http://free-electrons.com

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [Buildroot] [PATCH v4 1/3] libgtk3: new package
  2014-08-03 10:15     ` Thomas Petazzoni
@ 2014-08-03 22:22       ` Eric Le Bihan
  0 siblings, 0 replies; 7+ messages in thread
From: Eric Le Bihan @ 2014-08-03 22:22 UTC (permalink / raw)
  To: buildroot

Hi All!
On Sun, Aug 03, 2014 at 12:15:47PM +0200, Thomas Petazzoni wrote:
> Hello,
>
> On Sun, 3 Aug 2014 11:35:35 +0200, Thomas Petazzoni wrote:
>
> > Making all in gtk
> >   CCLD     extract-strings
> >   GEN      stamp-gtktypebuiltins.h
> >   GEN      stamp-gtkprivatetypebuiltins.h
> >   GEN      stamp-gtkmarshalers.h
> >   GEN      stamp-icons
> >   GEN      gtkdbusgenerated.c
> >   GEN      gtkdbusgenerated.h
> > /usr/bin/ld: skipping incompatible /home/test/outputs/gtk3/host/usr/arm-buildroot-linux-uclibcgnueabi/sysroot/usr/lib/libintl.so when searching for -lintl
> > /usr/bin/ld: skipping incompatible /home/test/outputs/gtk3/host/usr/arm-buildroot-linux-uclibcgnueabi/sysroot/usr/lib/libintl.a when searching for -lintl
> > /usr/bin/ld: cannot find -lintl
> > collect2: ld returned 1 exit status
> > make[4]: *** [extract-strings] Error 1
> > make[4]: *** Waiting for unfinished jobs....
> > /home/test/outputs/gtk3/host/usr/bin/glib-mkenums: gtktextview.h:59: Failed to parse `  /*< private >*/ '
> > /home/test/outputs/gtk3/host/usr/bin/glib-mkenums: gtktextview.h:61: Failed to parse `  /*< public >*/ '
> > make[3]: *** [all-recursive] Error 1
> > make[2]: *** [all] Error 2
> > make[1]: *** [/home/test/outputs/gtk3/build/libgtk3-3.12.2/.stamp_built] Error 2
> > make: *** [_all] Error 2
>
> I've done a little bit more investigation. The problem comes from the
> fact that the extract-strings program is built for the host, but using
> target cflags/ldflags. The gtk3 configure.ac script has provisions to
> specify a PKG_CONFIG_FOR_BUILD, but in the case of Buildroot, our
> PKG_CONFIG_FOR_BUILD is just $(HOST_DIR)/usr/bin/pkg-config, but with
> several environment variables to adjust its behavior (because by
> default, $(HOST_DIR)/usr/bin/pkg-config is cross and returns values for
> target libraries).
>
> So, I tried something like:
>
> LIBGTK3_CONF_ENV += \
> 	ac_cv_path_PKG_CONFIG_FOR_BUILD='$(HOST_CONFIGURE_OPTS) $(HOST_PKG_CONFIG_BINARY)'
>
> but it didn't work as the autoconf code does not expect the command to
> have multiple, space-separated, tokens.
>
> I've already tried to override GLIB_CFLAGS_FOR_BUILD and
> GLIB_LIBS_FOR_BUILD with no luck.
>
> So, right now, I am wondering if we should provide a
> $(HOST_DIR)/usr/bin/host-pkg-config that has built-in all the necessary
> environment variables to return values appropriate for host libraries.
>
That's the solution I had chosen in my version [1]:

+HOST_LIBGTK3_DEPENDENCIES = host-libglib2 host-libpng host-gdk-pixbuf
+HOST_LIBGTK3_CFLAGS = $(shell $(HOST_DIR)/usr/bin/pkg-config-native \
+ --cflags --libs gdk-pixbuf-2.0)
+
+define HOST_LIBGTK3_INSTALL_PKG_CONFIG_NATIVE
+ $(RM) -f $(HOST_DIR)/usr/bin/pkg-config-native
+ echo -e '#!/bin/sh\n' \
+
'PKG_CONFIG_LIBDIR=$(HOST_DIR)/usr/lib/pkgconfig:$(HOST_DIR)/usr/share/pkgconfig
' \
+ '$(HOST_DIR)/usr/bin/pkgconf $$@' >> $(HOST_DIR)/usr/bin/pkg-config-native
+ chmod +x $(HOST_DIR)/usr/bin/pkg-config-native
+endef
+
+HOST_LIBGTK3_PRE_CONFIGURE_HOOKS += HOST_LIBGTK3_INSTALL_PKG_CONFIG_NATIVE

This hook could easily be moved to package/pkgconf/pkgconf.mk and added to
HOST_PKGCONF_POST_INSTALL_HOOKS. If "host-pkg-config" is preferred over
"pkg-config-native", I can provide a patch using this name.

Best regards,

ELB

[1] https://github.com/elebihan/buildroot/commit/54a0ad6a18481e2db24c6f8f1d0b130b2a830b18

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2014-08-03 22:22 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-08-01  1:33 [Buildroot] [PATCH v4 0/3] Add libgtk3 and bump webkit to version 2.4.3 Hadrien Boutteville
2014-08-01  1:33 ` [Buildroot] [PATCH v4 1/3] libgtk3: new package Hadrien Boutteville
2014-08-03  9:35   ` Thomas Petazzoni
2014-08-03 10:15     ` Thomas Petazzoni
2014-08-03 22:22       ` Eric Le Bihan
2014-08-01  1:33 ` [Buildroot] [PATCH v4 2/3] webkit: bump to version 2.4.3 Hadrien Boutteville
2014-08-01  1:33 ` [Buildroot] [PATCH v4 3/3] midori: bump to version 0.5.8 Hadrien Boutteville

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.