diff --git a/.firefox.metadata b/.firefox.metadata
index f33918f..acf50d0 100644
--- a/.firefox.metadata
+++ b/.firefox.metadata
@@ -1,9 +1,11 @@
 18a8f30a0356c751b8d0ea6f76e764cab13ee046 SOURCES/Python-2.7.13.tar.xz
-e86c38c48960b95353503b78e1de9ddca1ed34d7 SOURCES/cbindgen-vendor.tar.xz
-ee6406ec1280afc24d4a90c392ff09ff5060686e SOURCES/firefox-68.9.0esr.source.tar.xz
-cbb1c23ae26fc81578036403dbceef7cd10fc98b SOURCES/firefox-langpacks-68.9.0esr-20200529.tar.xz
+a9effcc06cf80eaa22f12c1f7d6aa4266a1c4966 SOURCES/cbindgen-vendor-0.14.3.tar.xz
+be371c42648f5581cbde2446f4de861d26104758 SOURCES/firefox-78.2.0esr.source.tar.xz
+450b8e6b20368539c75c6e5e8b4a9eb4293e2fbe SOURCES/firefox-langpacks-78.2.0esr-20200818.tar.xz
 0de63f863b158454b9429234b52ed28a397ec45c SOURCES/gtk3-private-3.22.26-1.el6.src.rpm
 e188ab1a444697bc649e223c28389d82ca94c472 SOURCES/libffi-3.0.13-18.el7_3.src.rpm
-4f8d3bf2483d95261ff90742ecec82d6a899eca3 SOURCES/nodejs-8.11.4-1.3.fc27.src.rpm
+42b15d32c769dbb41863f9debebf56444cefbcd2 SOURCES/nodejs-10.21.0-3.el8_0.src.rpm
+07d67c90367c3ec0d6cebc1a5793c21076d34b78 SOURCES/nspr-4.25.0-1.el8_0.src.rpm
+b6f9f3e52fdcfced1df9e2f45760bcabea69e26f SOURCES/nss-3.53.1-3.el8_0.src.rpm
 a379070abf5000cde61411c97af7e733b267a4d3 SOURCES/openssl-1.0.2k-19.6.bundle.el7_7.src.rpm
 77fd30f7ebc12a629a31c1e252cec06af55a71fe SOURCES/yasm-1.2.0-3.el5.src.rpm
diff --git a/.gitignore b/.gitignore
index 94cbab6..7dfa0ed 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,9 +1,11 @@
 SOURCES/Python-2.7.13.tar.xz
-SOURCES/cbindgen-vendor.tar.xz
-SOURCES/firefox-68.9.0esr.source.tar.xz
-SOURCES/firefox-langpacks-68.9.0esr-20200529.tar.xz
+SOURCES/cbindgen-vendor-0.14.3.tar.xz
+SOURCES/firefox-78.2.0esr.source.tar.xz
+SOURCES/firefox-langpacks-78.2.0esr-20200818.tar.xz
 SOURCES/gtk3-private-3.22.26-1.el6.src.rpm
 SOURCES/libffi-3.0.13-18.el7_3.src.rpm
-SOURCES/nodejs-8.11.4-1.3.fc27.src.rpm
+SOURCES/nodejs-10.21.0-3.el8_0.src.rpm
+SOURCES/nspr-4.25.0-1.el8_0.src.rpm
+SOURCES/nss-3.53.1-3.el8_0.src.rpm
 SOURCES/openssl-1.0.2k-19.6.bundle.el7_7.src.rpm
 SOURCES/yasm-1.2.0-3.el5.src.rpm
diff --git a/SOURCES/Bug-1238661---fix-mozillaSignalTrampoline-to-work-.patch b/SOURCES/Bug-1238661---fix-mozillaSignalTrampoline-to-work-.patch
deleted file mode 100644
index 6dfe2ad..0000000
--- a/SOURCES/Bug-1238661---fix-mozillaSignalTrampoline-to-work-.patch
+++ /dev/null
@@ -1,12 +0,0 @@
-diff -up firefox-60.0/mfbt/LinuxSignal.h.mozilla-1238661 firefox-60.0/mfbt/LinuxSignal.h
---- firefox-60.0/mfbt/LinuxSignal.h.mozilla-1238661	2018-04-27 08:55:38.848241768 +0200
-+++ firefox-60.0/mfbt/LinuxSignal.h	2018-04-27 09:06:47.946769859 +0200
-@@ -22,7 +22,7 @@ __attribute__((naked)) void SignalTrampo
-                                              void* aContext) {
-   asm volatile("nop; nop; nop; nop" : : : "memory");
- 
--  asm volatile("b %0" : : "X"(H) : "memory");
-+  asm volatile("bx %0" : : "r"(H), "l"(aSignal), "l"(aInfo), "l"(aContext) : "memory");
- }
- 
- #  define MOZ_SIGNAL_TRAMPOLINE(h) (mozilla::SignalTrampoline<h>)
diff --git a/SOURCES/Bug-1526653---fix_user_vfp_armv7.patch b/SOURCES/Bug-1526653---fix_user_vfp_armv7.patch
deleted file mode 100644
index 3f84f95..0000000
--- a/SOURCES/Bug-1526653---fix_user_vfp_armv7.patch
+++ /dev/null
@@ -1,35 +0,0 @@
-From fd6847c9416f9eebde636e21d794d25d1be8791d Mon Sep 17 00:00:00 2001
-From: Mike Hommey <mh@glandium.org>
-Date: Sat, 1 Jun 2019 09:06:01 +0900
-Subject: [PATCH] Bug 1526653 - Include struct definitions for user_vfp and
- user_vfp_exc.
-
----
- js/src/wasm/WasmSignalHandlers.cpp | 11 ++++++++++-
- 1 file changed, 10 insertions(+), 1 deletion(-)
-
-diff --git a/js/src/wasm/WasmSignalHandlers.cpp b/js/src/wasm/WasmSignalHandlers.cpp
-index 636537f8478..383c380f04c 100644
---- a/js/src/wasm/WasmSignalHandlers.cpp
-+++ b/js/src/wasm/WasmSignalHandlers.cpp
-@@ -248,7 +248,16 @@ using mozilla::DebugOnly;
- #endif
- 
- #ifdef WASM_EMULATE_ARM_UNALIGNED_FP_ACCESS
--#  include <sys/user.h>
-+struct user_vfp {
-+  unsigned long long fpregs[32];
-+  unsigned long fpscr;
-+};
-+
-+struct user_vfp_exc {
-+  unsigned long fpexc;
-+  unsigned long fpinst;
-+  unsigned long fpinst2;
-+};
- #endif
- 
- #if defined(ANDROID)
--- 
-2.20.1
-
diff --git a/SOURCES/D87019-thin-vec-big-endian.diff b/SOURCES/D87019-thin-vec-big-endian.diff
new file mode 100644
index 0000000..bc8589b
--- /dev/null
+++ b/SOURCES/D87019-thin-vec-big-endian.diff
@@ -0,0 +1,767 @@
+diff -up firefox-78.1.0/Cargo.lock.D87019-thin-vec-big-endian.diff firefox-78.1.0/Cargo.lock
+--- firefox-78.1.0/Cargo.lock.D87019-thin-vec-big-endian.diff	2020-07-22 19:56:54.000000000 +0200
++++ firefox-78.1.0/Cargo.lock	2020-08-17 17:04:24.133598583 +0200
+@@ -4792,12 +4792,9 @@ checksum = "8eaa81235c7058867fa8c0e7314f
+ 
+ [[package]]
+ name = "thin-vec"
+-version = "0.1.0"
++version = "0.2.1"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+-checksum = "73fdf4b84c65a85168477b7fb6c498e0716bc9487fba24623389ea7f51708044"
+-dependencies = [
+- "libc",
+-]
++checksum = "dcc760ada4a9f56fc6d0e81bd143984ebc7bb1b875a6891aa2fa613ca7394fc0"
+ 
+ [[package]]
+ name = "thiserror"
+diff -up firefox-78.1.0/gfx/webrender_bindings/Cargo.toml.D87019-thin-vec-big-endian.diff firefox-78.1.0/gfx/webrender_bindings/Cargo.toml
+--- firefox-78.1.0/gfx/webrender_bindings/Cargo.toml.D87019-thin-vec-big-endian.diff	2020-08-17 17:04:24.133598583 +0200
++++ firefox-78.1.0/gfx/webrender_bindings/Cargo.toml	2020-08-17 17:05:26.984805590 +0200
+@@ -20,7 +20,7 @@ nsstring = { path = "../../xpcom/rust/ns
+ bincode = "1.0"
+ uuid = { version = "0.8", features = ["v4"] }
+ fxhash = "0.2.1"
+-thin-vec = { version = "0.1.0", features = ["gecko-ffi"] }
++thin-vec = { version = "0.2.1", features = ["gecko-ffi"] }
+ swgl = { path = "../wr/swgl" }
+ 
+ [dependencies.webrender]
+diff -up firefox-78.1.0/intl/l10n/rust/fluent-ffi/Cargo.toml.D87019-thin-vec-big-endian.diff firefox-78.1.0/intl/l10n/rust/fluent-ffi/Cargo.toml
+--- firefox-78.1.0/intl/l10n/rust/fluent-ffi/Cargo.toml.D87019-thin-vec-big-endian.diff	2020-07-22 17:56:20.000000000 +0200
++++ firefox-78.1.0/intl/l10n/rust/fluent-ffi/Cargo.toml	2020-08-17 17:04:24.134598587 +0200
+@@ -10,4 +10,4 @@ fluent-pseudo = "0.2"
+ intl-memoizer = "0.4"
+ unic-langid = "0.8"
+ nsstring = { path = "../../../../xpcom/rust/nsstring" }
+-thin-vec = { version = "0.1.0", features = ["gecko-ffi"] }
++thin-vec = { version = "0.2.1", features = ["gecko-ffi"] }
+diff -up firefox-78.1.0/intl/locale/rust/fluent-langneg-ffi/Cargo.toml.D87019-thin-vec-big-endian.diff firefox-78.1.0/intl/locale/rust/fluent-langneg-ffi/Cargo.toml
+--- firefox-78.1.0/intl/locale/rust/fluent-langneg-ffi/Cargo.toml.D87019-thin-vec-big-endian.diff	2020-07-22 17:56:20.000000000 +0200
++++ firefox-78.1.0/intl/locale/rust/fluent-langneg-ffi/Cargo.toml	2020-08-17 17:04:24.134598587 +0200
+@@ -9,7 +9,7 @@ edition = "2018"
+ nserror = { path = "../../../../xpcom/rust/nserror" }
+ nsstring = { path = "../../../../xpcom/rust/nsstring" }
+ xpcom = { path = "../../../../xpcom/rust/xpcom" }
+-thin-vec = { version = "0.1.0", features = ["gecko-ffi"] }
++thin-vec = { version = "0.2.1", features = ["gecko-ffi"] }
+ fluent-langneg = { version = "0.12.1", features = ["cldr"] }
+ unic-langid = "0.8"
+ unic-langid-ffi = { path = "../unic-langid-ffi" }
+diff -up firefox-78.1.0/intl/locale/rust/unic-langid-ffi/Cargo.toml.D87019-thin-vec-big-endian.diff firefox-78.1.0/intl/locale/rust/unic-langid-ffi/Cargo.toml
+--- firefox-78.1.0/intl/locale/rust/unic-langid-ffi/Cargo.toml.D87019-thin-vec-big-endian.diff	2020-07-22 17:56:20.000000000 +0200
++++ firefox-78.1.0/intl/locale/rust/unic-langid-ffi/Cargo.toml	2020-08-17 17:04:24.134598587 +0200
+@@ -9,5 +9,5 @@ edition = "2018"
+ nserror = { path = "../../../../xpcom/rust/nserror" }
+ nsstring = { path = "../../../../xpcom/rust/nsstring" }
+ xpcom = { path = "../../../../xpcom/rust/xpcom" }
+-thin-vec = { version = "0.1.0", features = ["gecko-ffi"] }
++thin-vec = { version = "0.2.1", features = ["gecko-ffi"] }
+ unic-langid = { version = "0.8", features = ["likelysubtags"] }
+diff -up firefox-78.1.0/netwerk/socket/neqo_glue/Cargo.toml.D87019-thin-vec-big-endian.diff firefox-78.1.0/netwerk/socket/neqo_glue/Cargo.toml
+--- firefox-78.1.0/netwerk/socket/neqo_glue/Cargo.toml.D87019-thin-vec-big-endian.diff	2020-08-17 17:04:24.134598587 +0200
++++ firefox-78.1.0/netwerk/socket/neqo_glue/Cargo.toml	2020-08-17 17:05:10.352750807 +0200
+@@ -14,7 +14,7 @@ neqo-common = { tag = "v0.2.4", git = "h
+ nserror = { path = "../../../xpcom/rust/nserror" }
+ nsstring = { path = "../../../xpcom/rust/nsstring" }
+ xpcom = { path = "../../../xpcom/rust/xpcom" }
+-thin-vec = { version = "0.1.0", features = ["gecko-ffi"] }
++thin-vec = { version = "0.2.1", features = ["gecko-ffi"] }
+ 
+ [dependencies.neqo-crypto]
+ tag = "v0.2.4"
+diff -up firefox-78.1.0/security/manager/ssl/cert_storage/Cargo.toml.D87019-thin-vec-big-endian.diff firefox-78.1.0/security/manager/ssl/cert_storage/Cargo.toml
+--- firefox-78.1.0/security/manager/ssl/cert_storage/Cargo.toml.D87019-thin-vec-big-endian.diff	2020-07-22 19:56:55.000000000 +0200
++++ firefox-78.1.0/security/manager/ssl/cert_storage/Cargo.toml	2020-08-17 17:04:24.134598587 +0200
+@@ -18,6 +18,6 @@ rust_cascade = "0.6.0"
+ sha2 = "^0.8"
+ storage_variant = { path = "../../../../storage/variant" }
+ tempfile = "3"
+-thin-vec = { version = "0.1.0", features = ["gecko-ffi"] }
++thin-vec = { version = "0.2.1", features = ["gecko-ffi"] }
+ time = "0.1"
+ xpcom = { path = "../../../../xpcom/rust/xpcom" }
+diff -up firefox-78.1.0/services/fxaccounts/rust-bridge/firefox-accounts-bridge/Cargo.toml.D87019-thin-vec-big-endian.diff firefox-78.1.0/services/fxaccounts/rust-bridge/firefox-accounts-bridge/Cargo.toml
+--- firefox-78.1.0/services/fxaccounts/rust-bridge/firefox-accounts-bridge/Cargo.toml.D87019-thin-vec-big-endian.diff	2020-08-17 17:04:24.134598587 +0200
++++ firefox-78.1.0/services/fxaccounts/rust-bridge/firefox-accounts-bridge/Cargo.toml	2020-08-17 17:04:52.432691786 +0200
+@@ -20,5 +20,5 @@ nserror = { path = "../../../../xpcom/ru
+ nsstring = { path = "../../../../xpcom/rust/nsstring" }
+ xpcom = { path = "../../../../xpcom/rust/xpcom" }
+ storage_variant = { path = "../../../../storage/variant" }
+-thin-vec = { version = "0.1", features = ["gecko-ffi"] }
++thin-vec = { version = "0.2.1", features = ["gecko-ffi"] }
+ fxa-client = { git = "https://github.com/mozilla/application-services", rev = "61dcc364ac0d6d0816ab88a494bbf20d824b009b", features = ["gecko"] }
+diff -up firefox-78.1.0/services/sync/golden_gate/Cargo.toml.D87019-thin-vec-big-endian.diff firefox-78.1.0/services/sync/golden_gate/Cargo.toml
+--- firefox-78.1.0/services/sync/golden_gate/Cargo.toml.D87019-thin-vec-big-endian.diff	2020-07-22 17:56:24.000000000 +0200
++++ firefox-78.1.0/services/sync/golden_gate/Cargo.toml	2020-08-17 17:04:24.134598587 +0200
+@@ -19,5 +19,5 @@ sync15-traits = { git = "https://github.
+ xpcom = { path = "../../../xpcom/rust/xpcom" }
+ 
+ [dependencies.thin-vec]
+-version = "0.1.0"
++version = "0.2.1"
+ features = ["gecko-ffi"]
+diff -up firefox-78.1.0/third_party/rust/thin-vec/.cargo-checksum.json.D87019-thin-vec-big-endian.diff firefox-78.1.0/third_party/rust/thin-vec/.cargo-checksum.json
+--- firefox-78.1.0/third_party/rust/thin-vec/.cargo-checksum.json.D87019-thin-vec-big-endian.diff	2020-07-22 17:56:29.000000000 +0200
++++ firefox-78.1.0/third_party/rust/thin-vec/.cargo-checksum.json	2020-08-17 17:04:24.134598587 +0200
+@@ -1 +1 @@
+-{"files":{"Cargo.toml":"fb96cad605ae48215811808c1cc1b9a50248f2b14542058094b23983e2f8d8a0","README.md":"c26d7101e3031e7dd8890ce938e50cad7a1e6adf7fc2f2b0d3c36b03afe68c0b","src/heap.rs":"fe84a4ff433568d5713685456d87597ac5dcdb9d5190061a3da8074240ba1bc3","src/lib.rs":"ce36db8e3464dddade7c1ddbe3ee1f5e525af5be492ea51a0d8a0776c1adfc28","src/range.rs":"bac59bcb6230367a39c7e28ac15263e4526f966cd8c72015873017f17c115aaa"},"package":"73fdf4b84c65a85168477b7fb6c498e0716bc9487fba24623389ea7f51708044"}
+\ No newline at end of file
++{"files":{"Cargo.toml":"754c05523d17eb7591c3ea2c9294e47c05fbb257fed04b78546fb2ec7cafa8b4","README.md":"c26d7101e3031e7dd8890ce938e50cad7a1e6adf7fc2f2b0d3c36b03afe68c0b","src/lib.rs":"627c6094c3f0286dba25bc73f5672c06c5061c25b01c513d213cbdda100673a2"},"package":"dcc760ada4a9f56fc6d0e81bd143984ebc7bb1b875a6891aa2fa613ca7394fc0"}
+\ No newline at end of file
+diff -up firefox-78.1.0/third_party/rust/thin-vec/Cargo.toml.D87019-thin-vec-big-endian.diff firefox-78.1.0/third_party/rust/thin-vec/Cargo.toml
+--- firefox-78.1.0/third_party/rust/thin-vec/Cargo.toml.D87019-thin-vec-big-endian.diff	2020-07-22 17:56:29.000000000 +0200
++++ firefox-78.1.0/third_party/rust/thin-vec/Cargo.toml	2020-08-17 17:04:24.135598590 +0200
+@@ -3,7 +3,7 @@
+ # When uploading crates to the registry Cargo will automatically
+ # "normalize" Cargo.toml files for maximal compatibility
+ # with all versions of Cargo and also rewrite `path` dependencies
+-# to registry (e.g. crates.io) dependencies
++# to registry (e.g., crates.io) dependencies
+ #
+ # If you believe there's an error in this file please file an
+ # issue against the rust-lang/cargo repository. If you're
+@@ -11,16 +11,17 @@
+ # will likely look very different (and much more reasonable)
+ 
+ [package]
++edition = "2018"
+ name = "thin-vec"
+-version = "0.1.0"
++version = "0.2.1"
+ authors = ["Alexis Beingessner <a.beingessner@gmail.com>"]
+ description = "a vec that takes up less space on the stack"
+ homepage = "https://github.com/gankro/thin-vec"
+ readme = "README.md"
+ license = "MIT/Apache-2.0"
+ repository = "https://github.com/gankro/thin-vec"
+-[dependencies.libc]
+-version = "0.2"
++
++[dependencies]
+ 
+ [features]
+ default = []
+diff -up firefox-78.1.0/third_party/rust/thin-vec/src/heap.rs.D87019-thin-vec-big-endian.diff firefox-78.1.0/third_party/rust/thin-vec/src/heap.rs
+diff -up firefox-78.1.0/third_party/rust/thin-vec/src/lib.rs.D87019-thin-vec-big-endian.diff firefox-78.1.0/third_party/rust/thin-vec/src/lib.rs
+--- firefox-78.1.0/third_party/rust/thin-vec/src/lib.rs.D87019-thin-vec-big-endian.diff	2020-07-22 17:56:28.000000000 +0200
++++ firefox-78.1.0/third_party/rust/thin-vec/src/lib.rs	2020-08-17 17:04:24.135598590 +0200
+@@ -1,50 +1,252 @@
+-mod range;
++//! ThinVec is exactly the same as Vec, except that it stores its `len` and `capacity` in the buffer
++//! it allocates.
++//!
++//! This makes the memory footprint of ThinVecs lower; notably in cases where space is reserved for
++//! a non-existence ThinVec<T>. So `Vec<ThinVec<T>>` and `Option<ThinVec<T>>::None` will waste less
++//! space. Being pointer-sized also means it can be passed/stored in registers.
++//!
++//! Of course, any actually constructed ThinVec will theoretically have a bigger allocation, but
++//! the fuzzy nature of allocators means that might not actually be the case.
++//!
++//! Properties of Vec that are preserved:
++//! * `ThinVec::new()` doesn't allocate (it points to a statically allocated singleton)
++//! * reallocation can be done in place
++//! * `size_of::<ThinVec<T>>()` == `size_of::<Option<ThinVec<T>>>()`
++//!
++//! Properties of Vec that aren't preserved:
++//! * `ThinVec<T>` can't ever be zero-cost roundtripped to a `Box<[T]>`, `String`, or `*mut T`
++//! * `from_raw_parts` doesn't exist
++//! * ThinVec currently doesn't bother to not-allocate for Zero Sized Types (e.g. `ThinVec<()>`),
++//!   but it could be done if someone cared enough to implement it.
++//!
++//!
++//!
++//! # Gecko FFI
++//!
++//! If you enable the gecko-ffi feature, ThinVec will verbatim bridge with the nsTArray type in
++//! Gecko (Firefox). That is, ThinVec and nsTArray have identical layouts *but not ABIs*, 
++//! so nsTArrays/ThinVecs an be natively manipulated by C++ and Rust, and ownership can be 
++//! transferred across the FFI boundary (**IF YOU ARE CAREFUL, SEE BELOW!!**).
++//!
++//! While this feature is handy, it is also inherently dangerous to use because Rust and C++ do not
++//! know about eachother. Specifically, this can be an issue with non-POD types (types which
++//! have destructors, move constructors, or are `!Copy`).
++//!
++//! ## Do Not Pass By Value
++//!
++//! The biggest thing to keep in mind is that **FFI functions cannot pass ThinVec/nsTArray 
++//! by-value**. That is, these are busted APIs:
++//!
++//! ```rust,ignore
++//! // BAD WRONG
++//! extern fn process_data(data: ThinVec<u32>) { ... }
++//! // BAD WRONG
++//! extern fn get_data() -> ThinVec<u32> { ... }
++//! ```
++//!
++//! You must instead pass by-reference:
++//!
++//! ```rust
++//! # use thin_vec::*;
++//! # use std::mem;
++//!
++//! // Read-only access, ok!
++//! extern fn process_data(data: &ThinVec<u32>) {
++//!     for val in data {
++//!         println!("{}", val);
++//!     }
++//! }
++//! 
++//! // Replace with empty instance to take ownership, ok!
++//! extern fn consume_data(data: &mut ThinVec<u32>) {
++//!     let owned = mem::replace(data, ThinVec::new());
++//!     mem::drop(owned);
++//! }
++//! 
++//! // Mutate input, ok!
++//! extern fn add_data(dataset: &mut ThinVec<u32>) {
++//!     dataset.push(37);
++//!     dataset.push(12);
++//! }
++//! 
++//! // Return via out-param, usually ok!
++//! //
++//! // WARNING: output must be initialized! (Empty nsTArrays are free, so just do it!)
++//! extern fn get_data(output: &mut ThinVec<u32>) {
++//!     *output = thin_vec![1, 2, 3, 4, 5];
++//! }
++//! ```
++//!
++//! Ignorable Explanation For Those Who Really Want To Know Why:
++//!
++//! > The fundamental issue is that Rust and C++ can't currently communicate about destructors, and
++//! > the semantics of C++ require destructors of function arguments to be run when the function
++//! > returns. Whether the callee or caller is responsible for this is also platform-specific, so
++//! > trying to hack around it manually would be messy. 
++//! >
++//! > Also a type having a destructor changes its C++ ABI, because that type must actually exist 
++//! > in memory (unlike a trivial struct, which is often passed in registers). We don't currently
++//! > have a way to communicate to Rust that this is happening, so even if we worked out the
++//! > destructor issue with say, MaybeUninit, it would still be a non-starter without some RFCs
++//! > to add explicit rustc support.
++//! >
++//! > Realistically, the best answer here is to have a "heavier" bindgen that can secretly
++//! > generate FFI glue so we can pass things "by value" and have it generate by-reference code
++//! > behind our back (like the cxx crate does). This would muddy up debugging/searchfox though.
++//!
++//! ## Types Should Be Trivially Relocatable
++//!
++//! Types in Rust are always trivially relocatable (unless suitably borrowed/[pinned][]/hidden).
++//! This means all Rust types are legal to relocate with a bitwise copy, you cannot provide
++//! copy or move constructors to execute when this happens, and the old location won't have its
++//! destructor run. This will cause problems for types which have a significant location
++//! (types that intrusively point into themselves or have their location registered with a service).
++//!
++//! While relocations are generally predictable if you're very careful, **you should avoid using
++//! types with significant locations with Rust FFI**.
++//!
++//! Specifically, ThinVec will trivially relocate its contents whenever it needs to reallocate its
++//! buffer to change its capacity. This is the default reallocation strategy for nsTArray, and is
++//! suitable for the vast majority of types. Just be aware of this limitation!
++//!
++//! ## Auto Arrays Are Dangerous
++//!
++//! ThinVec has *some* support for handling auto arrays which store their buffer on the stack, 
++//! but this isn't well tested.
++//!
++//! Regardless of how much support we provide, Rust won't be aware of the buffer's limited lifetime,
++//! so standard auto array safety caveats apply about returning/storing them! ThinVec won't ever
++//! produce an auto array on its own, so this is only an issue for transferring an nsTArray into
++//! Rust.
++//!
++//! ## Other Issues
++//!
++//! Standard FFI caveats also apply: 
++//!
++//!  * Rust is more strict about POD types being initialized (use MaybeUninit if you must)
++//!  * `ThinVec<T>` has no idea if the C++ version of `T` has move/copy/assign/delete overloads
++//!  * `nsTArray<T>` has no idea if the Rust version of `T` has a Drop/Clone impl
++//!  * C++ can do all sorts of unsound things that Rust can't catch
++//!  * C++ and Rust don't agree on how zero-sized/empty types should be handled
++//!
++//! The gecko-ffi feature will not work if you aren't linking with code that has nsTArray
++//! defined. Specifically, we must share the symbol for nsTArray's empty singleton. You will get
++//! linking errors if that isn't defined.
++//!
++//! The gecko-ffi feature also limits ThinVec to the legacy behaviors of nsTArray. Most notably,
++//! nsTArray has a maximum capacity of i32::MAX (~2.1 billion items). Probably not an issue.
++//! Probably.
++//!
++//! [pinned]: https://doc.rust-lang.org/std/pin/index.html
+ 
+ use std::{fmt, io, ptr, mem, slice};
+ use std::collections::Bound;
+ use std::iter::FromIterator;
+ use std::slice::IterMut;
+-use std::ops::{Deref, DerefMut};
++use std::ops::{Deref, DerefMut, RangeBounds};
+ use std::marker::PhantomData;
++use std::alloc::*;
+ use std::cmp::*;
+ use std::hash::*;
+ use std::borrow::*;
+-use range::RangeArgument;
+ use std::ptr::NonNull;
+ 
+-// Heap shimming because reasons. This doesn't unfortunately match the heap api
+-// right now because reasons.
+-mod heap;
++use impl_details::*;
+ 
+-#[cfg(not(feature = "gecko-ffi"))]
+-type SizeType = usize;
+-#[cfg(feature = "gecko-ffi")]
+-type SizeType = u32;
+-
+-#[cfg(feature = "gecko-ffi")]
+-const AUTO_MASK: u32 = 1 << 31;
+-#[cfg(feature = "gecko-ffi")]
+-const CAP_MASK: u32 = !AUTO_MASK;
++// modules: a simple way to cfg a whole bunch of impl details at once
+ 
+ #[cfg(not(feature = "gecko-ffi"))]
+-const MAX_CAP: usize = !0;
+-#[cfg(feature = "gecko-ffi")]
+-const MAX_CAP: usize = i32::max_value() as usize;
++mod impl_details {
++    pub type SizeType = usize;
++    pub const MAX_CAP: usize = !0;
+ 
+-#[cfg(not(feature = "gecko-ffi"))]
+-#[inline(always)]
+-fn assert_size(x: usize) -> SizeType { x }
++    #[inline(always)]
++    pub fn assert_size(x: usize) -> SizeType { x }
++}
+ 
+ #[cfg(feature = "gecko-ffi")]
+-#[inline]
+-fn assert_size(x: usize) -> SizeType {
+-    if x > MAX_CAP as usize {
+-        panic!("nsTArray size may not exceed the capacity of a 32-bit sized int");
++mod impl_details {
++    // Support for briding a gecko nsTArray verbatim into a ThinVec.
++    //
++    // ThinVec can't see copy/move/delete implementations
++    // from C++
++    //
++    // The actual layout of an nsTArray is:
++    //
++    // ```cpp
++    // struct {
++    //   uint32_t mLength;
++    //   uint32_t mCapacity: 31;
++    //   uint32_t mIsAutoArray: 1;
++    // }
++    // ```
++    //
++    // Rust doesn't natively support bit-fields, so we manually mask
++    // and shift the bit. When the "auto" bit is set, the header and buffer
++    // are actually on the stack, meaning the ThinVec pointer-to-header
++    // is essentially an "owned borrow", and therefore dangerous to handle.
++    // There are no safety guards for this situation.
++    //
++    // On little-endian platforms, the auto bit will be the high-bit of
++    // our capacity u32. On big-endian platforms, it will be the low bit.
++    // Hence we need some platform-specific CFGs for the necessary masking/shifting.
++    // 
++    // ThinVec won't ever construct an auto array. They only happen when
++    // bridging from C++. This means we don't need to ever set/preserve the bit.
++    // We just need to be able to read and handle it if it happens to be there.
++    //
++    // Handling the auto bit mostly just means not freeing/reallocating the buffer.
++
++    pub type SizeType = u32;
++
++    pub const MAX_CAP: usize = i32::max_value() as usize;
++
++    // Little endian: the auto bit is the high bit, and the capacity is
++    // verbatim. So we just need to mask off the high bit. Note that
++    // this masking is unnecessary when packing, because assert_size
++    // guards against the high bit being set.
++    #[cfg(target_endian = "little")]
++    pub fn pack_capacity(cap: SizeType) -> SizeType {
++        cap as SizeType
++    }
++    #[cfg(target_endian = "little")]
++    pub fn unpack_capacity(cap: SizeType) -> usize {
++        (cap as usize) & !(1 << 31)
++    }
++    #[cfg(target_endian = "little")]
++    pub fn is_auto(cap: SizeType) -> bool {
++        (cap & (1 << 31)) != 0
++    }
++
++    // Big endian: the auto bit is the low bit, and the capacity is
++    // shifted up one bit. Masking out the auto bit is unnecessary,
++    // as rust shifts always shift in 0's for unsigned integers.
++    #[cfg(target_endian = "big")]
++    pub fn pack_capacity(cap: SizeType) -> SizeType {
++        (cap as SizeType) << 1
++    }
++    #[cfg(target_endian = "big")]
++    pub fn unpack_capacity(cap: SizeType) -> usize {
++        (cap >> 1) as usize
++    }
++    #[cfg(target_endian = "big")]
++    pub fn is_auto(cap: SizeType) -> bool {
++        (cap & 1) != 0
++    }
++
++    #[inline]
++    pub fn assert_size(x: usize) -> SizeType {
++        if x > MAX_CAP as usize {
++            panic!("nsTArray size may not exceed the capacity of a 32-bit sized int");
++        }
++        x as SizeType
+     }
+-    x as SizeType
++
+ }
+ 
+-/// The header of a ThinVec
++/// The header of a ThinVec.
++///
++/// The _cap can be a bitfield, so use accessors to avoid trouble.
+ #[repr(C)]
+ struct Header {
+     _len: SizeType,
+@@ -56,38 +258,10 @@ impl Header {
+         self._len as usize
+     }
+ 
+-    #[cfg(feature = "gecko-ffi")]
+-    fn cap(&self) -> usize {
+-        (self._cap & CAP_MASK) as usize
+-    }
+-
+-    #[cfg(not(feature = "gecko-ffi"))]
+-    fn cap(&self) -> usize {
+-        self._cap as usize
+-    }
+-
+     fn set_len(&mut self, len: usize) {
+         self._len = assert_size(len);
+     }
+ 
+-    #[cfg(feature = "gecko-ffi")]
+-    fn set_cap(&mut self, cap: usize) {
+-        debug_assert!(cap & (CAP_MASK as usize) == cap);
+-        // FIXME: this is busted because it reads uninit memory
+-        // debug_assert!(!self.uses_stack_allocated_buffer());
+-        self._cap = assert_size(cap) & CAP_MASK;
+-    }
+-
+-    #[cfg(feature = "gecko-ffi")]
+-    fn uses_stack_allocated_buffer(&self) -> bool {
+-        self._cap & AUTO_MASK != 0
+-    }
+-
+-    #[cfg(not(feature = "gecko-ffi"))]
+-    fn set_cap(&mut self, cap: usize) {
+-        self._cap = assert_size(cap);
+-    }
+-
+     fn data<T>(&self) -> *mut T {
+         let header_size = mem::size_of::<Header>();
+         let padding = padding::<T>();
+@@ -105,6 +279,41 @@ impl Header {
+     }
+ }
+ 
++
++#[cfg(feature = "gecko-ffi")]
++impl Header {
++    fn cap(&self) -> usize {
++        unpack_capacity(self._cap)
++    }
++
++    fn set_cap(&mut self, cap: usize) {
++        // debug check that our packing is working
++        debug_assert_eq!(unpack_capacity(pack_capacity(cap as SizeType)), cap);
++        // FIXME: this assert is busted because it reads uninit memory
++        // debug_assert!(!self.uses_stack_allocated_buffer());
++
++        // NOTE: this always stores a cleared auto bit, because set_cap
++        // is only invoked by Rust, and Rust doesn't create auto arrays.
++        self._cap = pack_capacity(assert_size(cap));
++    }
++
++    fn uses_stack_allocated_buffer(&self) -> bool {
++        is_auto(self._cap)
++    }
++}
++
++#[cfg(not(feature = "gecko-ffi"))]
++impl Header {
++    fn cap(&self) -> usize {
++        self._cap as usize
++    }
++
++    fn set_cap(&mut self, cap: usize) {
++        self._cap = assert_size(cap);
++    }
++}
++
++
+ /// Singleton that all empty collections share.
+ /// Note: can't store non-zero ZSTs, we allocate in that case. We could
+ /// optimize everything to not do that (basically, make ptr == len and branch
+@@ -121,9 +330,7 @@ extern {
+ 
+ // TODO: overflow checks everywhere
+ 
+-// Utils
+-
+-fn oom() -> ! { std::process::abort() }
++// Utils for computing layouts of allocations
+ 
+ fn alloc_size<T>(cap: usize) -> usize {
+     // Compute "real" header size with pointer math
+@@ -156,15 +363,22 @@ fn alloc_align<T>() -> usize {
+     max(mem::align_of::<T>(), mem::align_of::<Header>())
+ }
+ 
+-fn header_with_capacity<T>(cap: usize) -> NonNull<Header> {
+-    debug_assert!(cap > 0);
++fn layout<T>(cap: usize) -> Layout {
+     unsafe {
+-        let header = heap::allocate(
++        Layout::from_size_align_unchecked(
+             alloc_size::<T>(cap),
+             alloc_align::<T>(),
+-        ) as *mut Header;
++        )
++    }
++}
+ 
+-        if header.is_null() { oom() }
++fn header_with_capacity<T>(cap: usize) -> NonNull<Header> {
++    debug_assert!(cap > 0);
++    unsafe {
++        let layout = layout::<T>(cap);
++        let header = alloc(layout) as *mut Header;
++
++        if header.is_null() { handle_alloc_error(layout) }
+ 
+         // "Infinite" capacity for zero-sized types:
+         (*header).set_cap(if mem::size_of::<T>() == 0 { MAX_CAP } else { cap });
+@@ -176,28 +390,8 @@ fn header_with_capacity<T>(cap: usize) -
+ 
+ 
+ 
+-/// ThinVec is exactly the same as Vec, except that it stores its `len` and `capacity` in the buffer
+-/// it allocates.
+-///
+-/// This makes the memory footprint of ThinVecs lower; notably in cases where space is reserved for
+-/// a non-existence ThinVec<T>. So `Vec<ThinVec<T>>` and `Option<ThinVec<T>>::None` will waste less
+-/// space. Being pointer-sized also means it can be passed/stored in registers.
+-///
+-/// Of course, any actually constructed ThinVec will theoretically have a bigger allocation, but
+-/// the fuzzy nature of allocators means that might not actually be the case.
+-///
+-/// Properties of Vec that are preserved:
+-/// * `ThinVec::new()` doesn't allocate (it points to a statically allocated singleton)
+-/// * reallocation can be done in place
+-/// * `size_of::<ThinVec<T>>()` == `size_of::<Option<ThinVec<T>>>()`
+-///   * NOTE: This is only possible when the `unstable` feature is used.
+-///
+-/// Properties of Vec that aren't preserved:
+-/// * `ThinVec<T>` can't ever be zero-cost roundtripped to a `Box<[T]>`, `String`, or `*mut T`
+-/// * `from_raw_parts` doesn't exist
+-/// * ThinVec currently doesn't bother to not-allocate for Zero Sized Types (e.g. `ThinVec<()>`),
+-///   but it could be done if someone cared enough to implement it.
+-#[cfg_attr(feature = "gecko-ffi", repr(C))]
++/// See the crate's top level documentation for a description of this type.
++#[repr(C)]
+ pub struct ThinVec<T> {
+     ptr: NonNull<Header>,
+     boo: PhantomData<T>,
+@@ -627,15 +821,15 @@ impl<T> ThinVec<T> {
+     }
+ 
+     pub fn drain<R>(&mut self, range: R) -> Drain<T>
+-        where R: RangeArgument<usize>
++        where R: RangeBounds<usize>
+     {
+         let len = self.len();
+-        let start = match range.start() {
++        let start = match range.start_bound() {
+             Bound::Included(&n) => n,
+             Bound::Excluded(&n) => n + 1,
+             Bound::Unbounded => 0,
+         };
+-        let end = match range.end() {
++        let end = match range.end_bound() {
+             Bound::Included(&n) => n + 1,
+             Bound::Excluded(&n) => n,
+             Bound::Unbounded => len,
+@@ -666,9 +860,10 @@ impl<T> ThinVec<T> {
+ 
+     unsafe fn deallocate(&mut self) {
+         if self.has_allocation() {
+-            heap::deallocate(self.ptr() as *mut u8,
+-                alloc_size::<T>(self.capacity()),
+-                alloc_align::<T>());
++            dealloc(
++                self.ptr() as *mut u8,
++                layout::<T>(self.capacity()),
++            )
+         }
+     }
+ 
+@@ -678,15 +873,36 @@ impl<T> ThinVec<T> {
+         debug_assert!(new_cap > 0);
+         if self.has_allocation() {
+             let old_cap = self.capacity();
+-            let ptr = heap::reallocate(self.ptr() as *mut u8,
+-                                       alloc_size::<T>(old_cap),
+-                                       alloc_size::<T>(new_cap),
+-                                       alloc_align::<T>()) as *mut Header;
+-            if ptr.is_null() { oom() }
++            let ptr = realloc(
++                self.ptr() as *mut u8,
++                layout::<T>(old_cap),
++                alloc_size::<T>(new_cap),
++            ) as *mut Header;
++
++            if ptr.is_null() { handle_alloc_error(layout::<T>(new_cap)) }
+             (*ptr).set_cap(new_cap);
+             self.ptr = NonNull::new_unchecked(ptr);
+         } else {
+-            self.ptr = header_with_capacity::<T>(new_cap);
++            let mut new_header = header_with_capacity::<T>(new_cap);
++
++            // If we get here and have a non-zero len, then we must be handling
++            // a gecko auto array, and we have items in a stack buffer. We shouldn't
++            // free it, but we should memcopy the contents out of it and mark it as empty.
++            //
++            // T is assumed to be trivially relocatable, as this is ~required
++            // for Rust compatibility anyway. Furthermore, we assume C++ won't try
++            // to unconditionally destroy the contents of the stack allocated buffer
++            // (i.e. it's obfuscated behind a union).
++            //
++            // In effect, we are partially reimplementing the auto array move constructor
++            // by leaving behind a valid empty instance.
++            let len = self.len();
++            if cfg!(feature = "gecko-ffi") && len > 0 {
++                new_header.as_mut().data::<T>().copy_from_nonoverlapping(self.data_raw(), len);
++                self.set_len(0);
++            }
++            
++            self.ptr = new_header;
+         }
+     }
+ 
+@@ -1087,10 +1303,7 @@ mod tests {
+         use std::mem::size_of;
+         assert_eq!(size_of::<ThinVec<u8>>(), size_of::<&u8>());
+ 
+-        // We don't perform the null-pointer optimization on stable rust.
+-        if cfg!(feature = "unstable") {
+-            assert_eq!(size_of::<Option<ThinVec<u8>>>(), size_of::<&u8>());
+-        }
++        assert_eq!(size_of::<Option<ThinVec<u8>>>(), size_of::<&u8>());
+     }
+ 
+     #[test]
+@@ -1725,7 +1938,6 @@ mod std_tests {
+         assert_eq!(v, &[(), ()]);
+     }
+ 
+-/* TODO: support inclusive ranges
+     #[test]
+     fn test_drain_inclusive_range() {
+         let mut v = thin_vec!['a', 'b', 'c', 'd', 'e'];
+@@ -1755,6 +1967,7 @@ mod std_tests {
+     }
+ 
+     #[test]
++    #[cfg(not(feature = "gecko-ffi"))]
+     fn test_drain_max_vec_size() {
+         let mut v = ThinVec::<()>::with_capacity(usize::max_value());
+         unsafe { v.set_len(usize::max_value()); }
+@@ -1775,7 +1988,6 @@ mod std_tests {
+         let mut v = thin_vec![1, 2, 3, 4, 5];
+         v.drain(5..=5);
+     }
+-*/
+ 
+ /* TODO: implement splice?
+     #[test]
+@@ -2181,7 +2393,7 @@ mod std_tests {
+         assert!(v.capacity() >= 33)
+     }
+ 
+-/* TODO: implement try_reserve 
++/* TODO: implement try_reserve
+     #[test]
+     fn test_try_reserve() {
+ 
+diff -up firefox-78.1.0/third_party/rust/thin-vec/src/range.rs.D87019-thin-vec-big-endian.diff firefox-78.1.0/third_party/rust/thin-vec/src/range.rs
+diff -up firefox-78.1.0/toolkit/components/cascade_bloom_filter/Cargo.toml.D87019-thin-vec-big-endian.diff firefox-78.1.0/toolkit/components/cascade_bloom_filter/Cargo.toml
+--- firefox-78.1.0/toolkit/components/cascade_bloom_filter/Cargo.toml.D87019-thin-vec-big-endian.diff	2020-07-22 17:56:29.000000000 +0200
++++ firefox-78.1.0/toolkit/components/cascade_bloom_filter/Cargo.toml	2020-08-17 17:04:24.135598590 +0200
+@@ -8,5 +8,5 @@ nserror = { path = "../../../xpcom/rust/
+ nsstring = { path = "../../../xpcom/rust/nsstring" }
+ rental = "0.5.5"
+ rust_cascade = "0.6.0"
+-thin-vec = { version = "0.1.0", features = ["gecko-ffi"] }
++thin-vec = { version = "0.2.1", features = ["gecko-ffi"] }
+ xpcom = { path = "../../../xpcom/rust/xpcom" }
+diff -up firefox-78.1.0/toolkit/components/extensions/storage/webext_storage_bridge/Cargo.toml.D87019-thin-vec-big-endian.diff firefox-78.1.0/toolkit/components/extensions/storage/webext_storage_bridge/Cargo.toml
+--- firefox-78.1.0/toolkit/components/extensions/storage/webext_storage_bridge/Cargo.toml.D87019-thin-vec-big-endian.diff	2020-07-22 17:56:30.000000000 +0200
++++ firefox-78.1.0/toolkit/components/extensions/storage/webext_storage_bridge/Cargo.toml	2020-08-17 17:04:24.135598590 +0200
+@@ -13,7 +13,7 @@ moz_task = { path = "../../../../../xpco
+ nserror = { path = "../../../../../xpcom/rust/nserror" }
+ nsstring = { path = "../../../../../xpcom/rust/nsstring" }
+ once_cell = "1"
+-thin-vec = { version = "0.1.0", features = ["gecko-ffi"] }
++thin-vec = { version = "0.2.1", features = ["gecko-ffi"] }
+ xpcom = { path = "../../../../../xpcom/rust/xpcom" }
+ serde = "1"
+ serde_json = "1"
+diff -up firefox-78.1.0/toolkit/components/kvstore/Cargo.toml.D87019-thin-vec-big-endian.diff firefox-78.1.0/toolkit/components/kvstore/Cargo.toml
+--- firefox-78.1.0/toolkit/components/kvstore/Cargo.toml.D87019-thin-vec-big-endian.diff	2020-07-22 17:56:30.000000000 +0200
++++ firefox-78.1.0/toolkit/components/kvstore/Cargo.toml	2020-08-17 17:04:24.135598590 +0200
+@@ -18,7 +18,7 @@ rkv = "0.10.2"
+ storage_variant = { path = "../../../storage/variant" }
+ xpcom = { path = "../../../xpcom/rust/xpcom" }
+ tempfile = "3"
+-thin-vec = { version = "0.1.0", features = ["gecko-ffi"] }
++thin-vec = { version = "0.2.1", features = ["gecko-ffi"] }
+ 
+ # Get rid of failure's dependency on backtrace. Eventually
+ # backtrace will move into Rust core, but we don't need it here.
+diff -up firefox-78.1.0/toolkit/components/places/bookmark_sync/Cargo.toml.D87019-thin-vec-big-endian.diff firefox-78.1.0/toolkit/components/places/bookmark_sync/Cargo.toml
+--- firefox-78.1.0/toolkit/components/places/bookmark_sync/Cargo.toml.D87019-thin-vec-big-endian.diff	2020-07-22 17:56:30.000000000 +0200
++++ firefox-78.1.0/toolkit/components/places/bookmark_sync/Cargo.toml	2020-08-17 17:04:24.135598590 +0200
+@@ -19,5 +19,5 @@ url = "2.0"
+ xpcom = { path = "../../../../xpcom/rust/xpcom" }
+ 
+ [dependencies.thin-vec]
+-version = "0.1.0"
++version = "0.2.1"
+ features = ["gecko-ffi"]
+diff -up firefox-78.1.0/tools/profiler/rust-helper/Cargo.toml.D87019-thin-vec-big-endian.diff firefox-78.1.0/tools/profiler/rust-helper/Cargo.toml
+--- firefox-78.1.0/tools/profiler/rust-helper/Cargo.toml.D87019-thin-vec-big-endian.diff	2020-07-22 17:56:30.000000000 +0200
++++ firefox-78.1.0/tools/profiler/rust-helper/Cargo.toml	2020-08-17 17:04:24.135598590 +0200
+@@ -23,7 +23,7 @@ features = ["endian_fd", "elf32", "elf64
+ default-features = false
+ 
+ [dependencies.thin-vec]
+-version = "0.1.0"
++version = "0.2.1"
+ features = ["gecko-ffi"]
+ 
+ [features]
+diff -up firefox-78.1.0/xpcom/rust/xpcom/Cargo.toml.D87019-thin-vec-big-endian.diff firefox-78.1.0/xpcom/rust/xpcom/Cargo.toml
+--- firefox-78.1.0/xpcom/rust/xpcom/Cargo.toml.D87019-thin-vec-big-endian.diff	2020-07-22 17:56:30.000000000 +0200
++++ firefox-78.1.0/xpcom/rust/xpcom/Cargo.toml	2020-08-17 17:04:24.136598593 +0200
+@@ -9,4 +9,4 @@ nsstring = { path = "../nsstring" }
+ nserror = { path = "../nserror" }
+ threadbound = "0.1"
+ xpcom_macros = { path = "xpcom_macros" }
+-thin-vec = { version = "0.1.0", features = ["gecko-ffi"] }
++thin-vec = { version = "0.2.1", features = ["gecko-ffi"] }
diff --git a/SOURCES/build-debug-qcms.patch b/SOURCES/build-debug-qcms.patch
deleted file mode 100644
index a65223a..0000000
--- a/SOURCES/build-debug-qcms.patch
+++ /dev/null
@@ -1,12 +0,0 @@
-diff -up firefox-60.0/gfx/qcms/transform-altivec.c.debug firefox-60.0/gfx/qcms/transform-altivec.c
---- firefox-60.0/gfx/qcms/transform-altivec.c.debug	2018-05-15 09:26:43.603043100 +0200
-+++ firefox-60.0/gfx/qcms/transform-altivec.c	2018-05-15 09:28:57.302385632 +0200
-@@ -30,7 +30,7 @@
- static const ALIGN float floatScaleX4 = FLOATSCALE;
- static const ALIGN float clampMaxValueX4 = CLAMPMAXVAL;
- 
--inline vector float load_aligned_float(float *dataPtr)
-+static vector float load_aligned_float(float *dataPtr)
- {
- 	vector float data = vec_lde(0, dataPtr);
- 	vector unsigned char moveToStart = vec_lvsl(0, dataPtr);
diff --git a/SOURCES/build-icu-big-endian.patch b/SOURCES/build-icu-big-endian.patch
deleted file mode 100644
index ee5fd6a..0000000
--- a/SOURCES/build-icu-big-endian.patch
+++ /dev/null
@@ -1,13 +0,0 @@
-diff -up firefox-68.0/build/autoconf/icu.m4.icu firefox-68.0/build/autoconf/icu.m4
---- firefox-68.0/build/autoconf/icu.m4.icu	2019-06-25 21:25:25.394425654 +0200
-+++ firefox-68.0/build/autoconf/icu.m4	2019-06-25 21:26:23.544210474 +0200
-@@ -78,7 +78,7 @@ if test -n "$USE_ICU"; then
-     # TODO: the l is actually endian-dependent
-     # We could make this set as 'l' or 'b' for little or big, respectively,
-     # but we'd need to check in a big-endian version of the file.
--    ICU_DATA_FILE="icudt${version}l.dat"
-+    ICU_DATA_FILE="icudt${version}b.dat"
- fi
- 
- AC_SUBST(MOZ_ICU_VERSION)
-
diff --git a/SOURCES/fedora-shebang-build.patch b/SOURCES/fedora-shebang-build.patch
new file mode 100644
index 0000000..9ade86c
--- /dev/null
+++ b/SOURCES/fedora-shebang-build.patch
@@ -0,0 +1,9 @@
+diff -up firefox-73.0/build/unix/run-mozilla.sh.old firefox-73.0/build/unix/run-mozilla.sh
+--- firefox-73.0/build/unix/run-mozilla.sh.old	2020-02-12 09:58:00.150895904 +0100
++++ firefox-73.0/build/unix/run-mozilla.sh	2020-02-12 09:58:06.505860696 +0100
+@@ -1,4 +1,4 @@
+-#!/bin/sh
++#!/usr/bin/sh
+ #
+ # This Source Code Form is subject to the terms of the Mozilla Public
+ # License, v. 2.0. If a copy of the MPL was not distributed with this
diff --git a/SOURCES/firefox-centos-default-prefs.js b/SOURCES/firefox-centos-default-prefs.js
deleted file mode 100644
index ea10021..0000000
--- a/SOURCES/firefox-centos-default-prefs.js
+++ /dev/null
@@ -1,35 +0,0 @@
-pref("app.update.auto",                     false);
-pref("app.update.enabled",                  false);
-pref("app.update.autoInstallEnabled",       false);
-pref("general.smoothScroll",                true);
-pref("intl.locale.matchOS",                 true);
-pref("toolkit.storage.synchronous",         0);
-pref("toolkit.networkmanager.disable",      false);
-pref("offline.autoDetect",                  true);
-pref("browser.backspace_action",            2);
-pref("browser.display.use_system_colors",   true);
-pref("browser.download.folderList",         1);
-pref("browser.link.open_external",          3);
-pref("browser.shell.checkDefaultBrowser",   false);
-pref("network.manage-offline-status",       true);
-pref("extensions.shownSelectionUI",         true);
-pref("ui.SpellCheckerUnderlineStyle",       1);
-pref("startup.homepage_override_url",       "http://www.centos.org");
-pref("startup.homepage_welcome_url",        "http://www.centos.org");
-pref("browser.startup.homepage",            "data:text/plain,browser.startup.homepage=file:///usr/share/doc/HTML/index.html");
-pref("geo.wifi.uri", "https://location.services.mozilla.com/v1/geolocate?key=%MOZILLA_API_KEY%");
-pref("media.gmp-gmpopenh264.provider.enabled",false);
-pref("media.gmp-gmpopenh264.autoupdate",false);
-pref("media.gmp-gmpopenh264.enabled",false);
-pref("media.gmp-gmpopenh264.enabled",false);
-pref("plugins.notifyMissingFlash", false);
-/* See https://bugzilla.redhat.com/show_bug.cgi?id=1226489 */
-pref("browser.display.use_system_colors", false);
-pref("layers.use-image-offscreen-surfaces", false);
-/* Allow sending credetials to all https:// sites */
-pref("network.negotiate-auth.trusted-uris", "https://");
-pref("security.use_sqldb", false);
-/* Use OS settings for UI language */
-pref("intl.locale.requested", "");
-/* See https://bugzilla.redhat.com/show_bug.cgi?id=1672424 */
-pref("storage.nfs_filesystem", true);
diff --git a/SOURCES/firefox-dont-check-binary.patch b/SOURCES/firefox-dont-check-binary.patch
deleted file mode 100644
index c498034..0000000
--- a/SOURCES/firefox-dont-check-binary.patch
+++ /dev/null
@@ -1,47 +0,0 @@
-diff -up firefox-68.0/config/rules.mk.old firefox-68.0/config/rules.mk
---- firefox-68.0/config/rules.mk.old	2019-06-26 09:36:58.537034443 +0200
-+++ firefox-68.0/config/rules.mk	2019-06-26 09:37:38.004970573 +0200
-@@ -569,7 +569,6 @@ ifdef MOZ_PROFILE_GENERATE
- endif
- else # !WINNT || GNU_CC
- 	$(call EXPAND_CC_OR_CXX,$@) -o $@ $(COMPUTED_CXX_LDFLAGS) $(PGO_CFLAGS) $($(notdir $@)_$(OBJS_VAR_SUFFIX)) $(RESFILE) $(WIN32_EXE_LDFLAGS) $(LDFLAGS) $(STATIC_LIBS) $(RUST_STATIC_LIB) $(MOZ_PROGRAM_LDFLAGS) $(SHARED_LIBS) $(OS_LIBS)
--	$(call py_action,check_binary,--target $@)
- endif # WINNT && !GNU_CC
- 
- ifdef ENABLE_STRIP
-@@ -604,9 +603,6 @@ else
- 	$(HOST_CC) -o $@ $(HOST_C_LDFLAGS) $(HOST_LDFLAGS) $($(notdir $@)_OBJS) $(HOST_LIBS) $(HOST_EXTRA_LIBS)
- endif # HOST_CPP_PROG_LINK
- endif
--ifndef CROSS_COMPILE
--	$(call py_action,check_binary,--host $@)
--endif
- 
- #
- # This is an attempt to support generation of multiple binaries
-@@ -630,7 +626,6 @@ ifdef MSMANIFEST_TOOL
- endif	# MSVC with manifest tool
- else
- 	$(call EXPAND_CC_OR_CXX,$@) $(COMPUTED_CXX_LDFLAGS) $(PGO_CFLAGS) -o $@ $($@_$(OBJS_VAR_SUFFIX)) $(WIN32_EXE_LDFLAGS) $(LDFLAGS) $(STATIC_LIBS) $(MOZ_PROGRAM_LDFLAGS) $(SHARED_LIBS) $(OS_LIBS)
--	$(call py_action,check_binary,--target $@)
- endif # WINNT && !GNU_CC
- 
- ifdef ENABLE_STRIP
-@@ -651,9 +646,6 @@ else
- 	$(HOST_CC) $(HOST_OUTOPTION)$@ $(HOST_C_LDFLAGS) $($(notdir $@)_OBJS) $(HOST_LIBS) $(HOST_EXTRA_LIBS)
- endif
- endif
--ifndef CROSS_COMPILE
--	$(call py_action,check_binary,--host $@)
--endif
- 
- $(LIBRARY): $(OBJS) $(STATIC_LIBS) $(EXTRA_DEPS) $(GLOBAL_DEPS)
- 	$(REPORT_BUILD)
-@@ -691,7 +683,6 @@ ifndef INCREMENTAL_LINKER
- 	$(RM) $@
- endif
- 	$(MKSHLIB) $($@_$(OBJS_VAR_SUFFIX)) $(RESFILE) $(LDFLAGS) $(STATIC_LIBS) $(RUST_STATIC_LIB) $(SHARED_LIBS) $(EXTRA_DSO_LDOPTS) $(MOZ_GLUE_LDFLAGS) $(OS_LIBS)
--	$(call py_action,check_binary,--target $@)
- 
- ifeq (_WINNT,$(GNU_CC)_$(OS_ARCH))
- ifdef MSMANIFEST_TOOL
diff --git a/SOURCES/firefox-mozconfig b/SOURCES/firefox-mozconfig
index 5585559..6efa937 100644
--- a/SOURCES/firefox-mozconfig
+++ b/SOURCES/firefox-mozconfig
@@ -5,12 +5,10 @@ ac_add_options --enable-default-toolkit=cairo-gtk3
 ac_add_options --prefix="$PREFIX"
 ac_add_options --libdir="$LIBDIR"
 ac_add_options --with-system-zlib
-ac_add_options --with-system-bz2
 ac_add_options --disable-strip
 ac_add_options --disable-tests
 #ac_add_options --enable-libnotify
 ac_add_options --enable-necko-wifi
-ac_add_options --enable-startup-notification
 ac_add_options --disable-updater
 ac_add_options --enable-chrome-format=omni
 ac_add_options --enable-pulseaudio
diff --git a/SOURCES/firefox-pipewire-0-3.patch b/SOURCES/firefox-pipewire-0-3.patch
index 7aa06b9..0844209 100644
--- a/SOURCES/firefox-pipewire-0-3.patch
+++ b/SOURCES/firefox-pipewire-0-3.patch
@@ -18,6 +18,19 @@ index 2081d0c683a4..641133bf1ea4 100644
      'pixman.h',
      'pk11func.h',
      'pk11pqg.h',
+diff --git a/media/webrtc/trunk/webrtc/modules/desktop_capture/BUILD.gn b/media/webrtc/trunk/webrtc/modules/desktop_capture/BUILD.gn
+index ba885217b3ba..201d3b755221 100644
+--- a/media/webrtc/trunk/webrtc/modules/desktop_capture/BUILD.gn
++++ b/media/webrtc/trunk/webrtc/modules/desktop_capture/BUILD.gn
+@@ -158,7 +158,7 @@ if (rtc_include_tests) {
+ if (is_linux) {
+   if (rtc_use_pipewire) {
+     pkg_config("pipewire") {
+-      packages = [ "libpipewire-0.2" ]
++      packages = [ "libpipewire-0.3" ]
+ 
+       defines = [ "WEBRTC_USE_PIPEWIRE" ]
+     }
 diff --git a/media/webrtc/trunk/webrtc/modules/desktop_capture/desktop_capture_generic_gn/moz.build b/media/webrtc/trunk/webrtc/modules/desktop_capture/desktop_capture_generic_gn/moz.build
 index 90b40431c7e4..d844aa79d591 100644
 --- a/media/webrtc/trunk/webrtc/modules/desktop_capture/desktop_capture_generic_gn/moz.build
@@ -67,7 +80,7 @@ index 1eb8ead26efa..316468eed1fc 100644
  };
  
 diff --git a/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.cc b/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.cc
-index 379341c833de..53e2683df2e8 100644
+index 379341c833de..76349f1fbd4d 100644
 --- a/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.cc
 +++ b/media/webrtc/trunk/webrtc/modules/desktop_capture/linux/base_capturer_pipewire.cc
 @@ -15,8 +15,11 @@
@@ -250,13 +263,13 @@ index 379341c833de..53e2683df2e8 100644
 -  pw_buffer* buf = nullptr;
 +  struct pw_buffer *next_buffer;
 +  struct pw_buffer *buffer = nullptr;
- 
--  if (!(buf = pw_stream_dequeue_buffer(that->pw_stream_))) {
++
 +  next_buffer = pw_stream_dequeue_buffer(that->pw_stream_);
 +  while (next_buffer) {
 +    buffer = next_buffer;
 +    next_buffer = pw_stream_dequeue_buffer(that->pw_stream_);
-+
+ 
+-  if (!(buf = pw_stream_dequeue_buffer(that->pw_stream_))) {
 +    if (next_buffer)
 +      pw_stream_queue_buffer (that->pw_stream_, buffer);
 +  }
@@ -365,7 +378,7 @@ index 379341c833de..53e2683df2e8 100644
  
    if (pw_thread_loop_start(pw_main_loop_) < 0) {
      RTC_LOG(LS_ERROR) << "Failed to start main PipeWire loop";
-@@ -278,81 +266,120 @@ void BaseCapturerPipeWire::InitPipeWire() {
+@@ -278,81 +266,132 @@ void BaseCapturerPipeWire::InitPipeWire() {
    }
  }
  
@@ -476,14 +489,27 @@ index 379341c833de..53e2683df2e8 100644
 +    map = static_cast<uint8_t*>(mmap(
 +        nullptr, spaBuffer->datas[0].maxsize + spaBuffer->datas[0].mapoffset,
 +        PROT_READ, MAP_PRIVATE, spaBuffer->datas[0].fd, 0));
++
++    if (map == MAP_FAILED) {
++      RTC_LOG(LS_ERROR) << "Failed to mmap the memory: " << std::strerror(errno);
++      return;
++    }
++
 +    src = SPA_MEMBER(map, spaBuffer->datas[0].mapoffset, uint8_t);
 +  } else if (spaBuffer->datas[0].type == SPA_DATA_DmaBuf) {
 +    int fd;
 +    fd = spaBuffer->datas[0].fd;
-+
+ 
+-  if (!(src = spaBuffer->datas[0].data)) {
 +    map = static_cast<uint8_t*>(mmap(
 +        nullptr, spaBuffer->datas[0].maxsize + spaBuffer->datas[0].mapoffset,
 +        PROT_READ, MAP_PRIVATE, fd, 0));
++
++    if (map == MAP_FAILED) {
++      RTC_LOG(LS_ERROR) << "Failed to mmap the memory: " << std::strerror(errno);
++      return;
++    }
++
 +    SyncDmaBuf(fd, DMA_BUF_SYNC_START);
 +
 +    src = SPA_MEMBER(map, spaBuffer->datas[0].mapoffset, uint8_t);
@@ -491,16 +517,15 @@ index 379341c833de..53e2683df2e8 100644
 +    map = nullptr;
 +    src = static_cast<uint8_t*>(spaBuffer->datas[0].data);
 +  } else {
-+    return;
-+  }
- 
--  if (!(src = spaBuffer->datas[0].data)) {
-+  if (!src) {
      return;
    }
  
 -  uint32_t maxSize = spaBuffer->datas[0].maxsize;
 -  int32_t srcStride = spaBuffer->datas[0].chunk->stride;
++  if (!src) {
++    return;
++  }
++
 +  DesktopSize prev_crop_size = DesktopSize(0, 0);
 +  if (video_crop_size_initialized_) {
 +    prev_crop_size = video_crop_size_;
@@ -544,7 +569,7 @@ index 379341c833de..53e2683df2e8 100644
    if (srcStride != (desktop_size_.width() * kBytesPerPixel)) {
      RTC_LOG(LS_ERROR) << "Got buffer with stride different from screen stride: "
                        << srcStride
-@@ -361,21 +388,40 @@ void BaseCapturerPipeWire::HandleBuffer(pw_buffer* buffer) {
+@@ -361,21 +400,40 @@ void BaseCapturerPipeWire::HandleBuffer(pw_buffer* buffer) {
      return;
    }
  
@@ -598,7 +623,7 @@ index 379341c833de..53e2683df2e8 100644
    }
  }
  
-@@ -725,10 +771,7 @@ void BaseCapturerPipeWire::OnStartRequestResponseSignal(
+@@ -725,10 +783,7 @@ void BaseCapturerPipeWire::OnStartRequestResponseSignal(
        g_variant_get(variant, "(u@a{sv})", &stream_id, &options);
        RTC_DCHECK(options != nullptr);
  
@@ -610,7 +635,7 @@ index 379341c833de..53e2683df2e8 100644
        g_variant_unref(options);
        g_variant_unref(variant);
      }
-@@ -813,10 +856,15 @@ void BaseCapturerPipeWire::CaptureFrame() {
+@@ -813,10 +868,15 @@ void BaseCapturerPipeWire::CaptureFrame() {
      return;
    }
  
@@ -629,7 +654,7 @@ index 379341c833de..53e2683df2e8 100644
    if (!result) {
      callback_->OnCaptureResult(Result::ERROR_TEMPORARY, nullptr);
      return;
-@@ -837,4 +885,22 @@ bool BaseCapturerPipeWire::SelectSource(SourceId id) {
+@@ -837,4 +897,22 @@ bool BaseCapturerPipeWire::SelectSource(SourceId id) {
    return true;
  }
  
diff --git a/SOURCES/mozilla-1170092.patch b/SOURCES/mozilla-1170092.patch
index 5aebd73..40db2c6 100644
--- a/SOURCES/mozilla-1170092.patch
+++ b/SOURCES/mozilla-1170092.patch
@@ -1,7 +1,7 @@
-diff -up firefox-68.5.0/extensions/pref/autoconfig/src/nsReadConfig.cpp.1170092 firefox-68.5.0/extensions/pref/autoconfig/src/nsReadConfig.cpp
---- firefox-68.5.0/extensions/pref/autoconfig/src/nsReadConfig.cpp.1170092	2020-02-07 01:27:03.000000000 +0100
-+++ firefox-68.5.0/extensions/pref/autoconfig/src/nsReadConfig.cpp	2020-02-24 11:30:32.058044651 +0100
-@@ -246,8 +246,20 @@ nsresult nsReadConfig::openAndEvaluateJS
+diff -up firefox-78.0/extensions/pref/autoconfig/src/nsReadConfig.cpp.1170092 firefox-78.0/extensions/pref/autoconfig/src/nsReadConfig.cpp
+--- firefox-78.0/extensions/pref/autoconfig/src/nsReadConfig.cpp.1170092	2020-06-17 04:18:58.000000000 +0200
++++ firefox-78.0/extensions/pref/autoconfig/src/nsReadConfig.cpp	2020-06-25 13:45:28.816999491 +0200
+@@ -244,8 +244,20 @@ nsresult nsReadConfig::openAndEvaluateJS
      if (NS_FAILED(rv)) return rv;
  
      rv = NS_NewLocalFileInputStream(getter_AddRefs(inStr), jsFile);
@@ -23,10 +23,10 @@ diff -up firefox-68.5.0/extensions/pref/autoconfig/src/nsReadConfig.cpp.1170092 
    } else {
      nsAutoCString location("resource://gre/defaults/autoconfig/");
      location += aFileName;
-diff -up firefox-68.5.0/modules/libpref/Preferences.cpp.1170092 firefox-68.5.0/modules/libpref/Preferences.cpp
---- firefox-68.5.0/modules/libpref/Preferences.cpp.1170092	2020-02-24 11:30:32.059044645 +0100
-+++ firefox-68.5.0/modules/libpref/Preferences.cpp	2020-02-24 11:35:14.613443673 +0100
-@@ -4436,6 +4436,8 @@ static nsresult pref_ReadDefaultPrefs(co
+diff -up firefox-78.0/modules/libpref/Preferences.cpp.1170092 firefox-78.0/modules/libpref/Preferences.cpp
+--- firefox-78.0/modules/libpref/Preferences.cpp.1170092	2020-06-25 13:45:28.818999498 +0200
++++ firefox-78.0/modules/libpref/Preferences.cpp	2020-06-25 13:48:45.996708102 +0200
+@@ -4499,6 +4499,8 @@ nsresult Preferences::InitInitialObjects
    //
    // Thus, in the omni.jar case, we always load app-specific default
    // preferences from omni.jar, whether or not `$app == $gre`.
@@ -34,11 +34,11 @@ diff -up firefox-68.5.0/modules/libpref/Preferences.cpp.1170092 firefox-68.5.0/m
 +  // - /etc/firefox/pref/*.js
  
    nsresult rv = NS_ERROR_FAILURE;
-   nsZipFind* findPtr;
-diff -up firefox-68.5.0/toolkit/xre/nsXREDirProvider.cpp.1170092 firefox-68.5.0/toolkit/xre/nsXREDirProvider.cpp
---- firefox-68.5.0/toolkit/xre/nsXREDirProvider.cpp.1170092	2020-02-07 01:28:06.000000000 +0100
-+++ firefox-68.5.0/toolkit/xre/nsXREDirProvider.cpp	2020-02-24 11:34:27.284704700 +0100
-@@ -61,6 +61,7 @@
+   UniquePtr<nsZipFind> find;
+diff -up firefox-78.0/toolkit/xre/nsXREDirProvider.cpp.1170092 firefox-78.0/toolkit/xre/nsXREDirProvider.cpp
+--- firefox-78.0/toolkit/xre/nsXREDirProvider.cpp.1170092	2020-06-17 04:20:11.000000000 +0200
++++ firefox-78.0/toolkit/xre/nsXREDirProvider.cpp	2020-06-25 13:48:28.613645633 +0200
+@@ -60,6 +60,7 @@
  #endif
  #ifdef XP_UNIX
  #  include <ctype.h>
@@ -46,7 +46,7 @@ diff -up firefox-68.5.0/toolkit/xre/nsXREDirProvider.cpp.1170092 firefox-68.5.0/
  #endif
  #ifdef XP_IOS
  #  include "UIKitDirProvider.h"
-@@ -524,6 +525,21 @@ nsXREDirProvider::GetFile(const char* aP
+@@ -533,6 +534,21 @@ nsXREDirProvider::GetFile(const char* aP
        }
      }
    }
@@ -68,9 +68,9 @@ diff -up firefox-68.5.0/toolkit/xre/nsXREDirProvider.cpp.1170092 firefox-68.5.0/
    if (NS_FAILED(rv) || !file) return NS_ERROR_FAILURE;
  
    if (ensureFilePermissions) {
-@@ -880,6 +896,17 @@ nsresult nsXREDirProvider::GetFilesInter
+@@ -845,6 +861,17 @@ nsresult nsXREDirProvider::GetFilesInter
+ 
      LoadDirIntoArray(mXULAppDir, kAppendPrefDir, directories);
-     LoadDirsIntoArray(mAppBundleDirectories, kAppendPrefDir, directories);
  
 +    // Add /etc/<application>/pref/ directory if it exists
 +    nsCOMPtr<nsIFile> systemPrefDir;
@@ -86,10 +86,10 @@ diff -up firefox-68.5.0/toolkit/xre/nsXREDirProvider.cpp.1170092 firefox-68.5.0/
      rv = NS_NewArrayEnumerator(aResult, directories, NS_GET_IID(nsIFile));
    } else if (!strcmp(aProperty, NS_APP_CHROME_DIR_LIST)) {
      // NS_APP_CHROME_DIR_LIST is only used to get default (native) icons
-diff -up firefox-68.5.0/xpcom/io/nsAppDirectoryServiceDefs.h.1170092 firefox-68.5.0/xpcom/io/nsAppDirectoryServiceDefs.h
---- firefox-68.5.0/xpcom/io/nsAppDirectoryServiceDefs.h.1170092	2020-02-07 01:27:52.000000000 +0100
-+++ firefox-68.5.0/xpcom/io/nsAppDirectoryServiceDefs.h	2020-02-24 11:30:32.059044645 +0100
-@@ -62,6 +62,7 @@
+diff -up firefox-78.0/xpcom/io/nsAppDirectoryServiceDefs.h.1170092 firefox-78.0/xpcom/io/nsAppDirectoryServiceDefs.h
+--- firefox-78.0/xpcom/io/nsAppDirectoryServiceDefs.h.1170092	2020-06-17 04:20:17.000000000 +0200
++++ firefox-78.0/xpcom/io/nsAppDirectoryServiceDefs.h	2020-06-25 13:45:28.819999502 +0200
+@@ -60,6 +60,7 @@
  #define NS_APP_PREFS_DEFAULTS_DIR_LIST "PrefDL"
  #define NS_APP_PREFS_OVERRIDE_DIR \
    "PrefDOverride"  // Directory for per-profile defaults
diff --git a/SOURCES/mozilla-1603112-accept-lang.patch b/SOURCES/mozilla-1603112-accept-lang.patch
deleted file mode 100644
index b67b232..0000000
--- a/SOURCES/mozilla-1603112-accept-lang.patch
+++ /dev/null
@@ -1,12 +0,0 @@
-diff --git a/intl/strres/nsStringBundle.cpp b/intl/strres/nsStringBundle.cpp
---- a/intl/strres/nsStringBundle.cpp
-+++ b/intl/strres/nsStringBundle.cpp
-@@ -66,7 +66,6 @@
-     "chrome://global/locale/commonDialogs.properties",
-     "chrome://global/locale/css.properties",
-     "chrome://global/locale/dom/dom.properties",
--    "chrome://global/locale/intl.properties",
-     "chrome://global/locale/layout/HtmlForm.properties",
-     "chrome://global/locale/layout/htmlparser.properties",
-     "chrome://global/locale/layout_errors.properties",
-
diff --git a/SOURCES/mozilla-bmo1005535.patch b/SOURCES/mozilla-bmo1005535.patch
index 96f6e1a..cab0134 100644
--- a/SOURCES/mozilla-bmo1005535.patch
+++ b/SOURCES/mozilla-bmo1005535.patch
@@ -1,15 +1,7 @@
-# HG changeset patch
-# User Steve Singer <steve@ssinger.info>
-# Date 1558451540 -7200
-#      Tue May 21 17:12:20 2019 +0200
-# Node ID 433beec63e6b5f409683af20a0c1ab137cc7bfad
-# Parent  42c99b59a87b904063bad3193f10c51d068d2eac
-Bug 1005535 - Get skia GPU building on big endian.
-
-diff -r 42c99b59a87b -r 433beec63e6b gfx/skia/skia/include/private/GrColor.h
---- a/gfx/skia/skia/include/private/GrColor.h	Wed Jun 05 08:48:08 2019 +0200
-+++ b/gfx/skia/skia/include/private/GrColor.h	Tue May 21 17:12:20 2019 +0200
-@@ -63,7 +63,7 @@
+diff -up firefox-78.0/gfx/skia/skia/src/gpu/GrColor.h.mozilla.bmo1005535 firefox-78.0/gfx/skia/skia/src/gpu/GrColor.h
+--- firefox-78.0/gfx/skia/skia/src/gpu/GrColor.h.mozilla.bmo1005535	2020-06-25 16:16:34.459083304 +0200
++++ firefox-78.0/gfx/skia/skia/src/gpu/GrColor.h	2020-06-25 16:17:00.968174743 +0200
+@@ -64,7 +64,7 @@ static inline GrColor GrColorPackRGBA(un
   *  Since premultiplied means that alpha >= color, we construct a color with
   *  each component==255 and alpha == 0 to be "illegal"
   */
diff --git a/SOURCES/mozilla-bmo1504834-part1.patch b/SOURCES/mozilla-bmo1504834-part1.patch
index cb985bb..01da145 100644
--- a/SOURCES/mozilla-bmo1504834-part1.patch
+++ b/SOURCES/mozilla-bmo1504834-part1.patch
@@ -1,11 +1,7 @@
-# HG changeset patch
-# Parent  051b75a600dfbf7503c3485cebfd34d4eb29be96
-Taken from https://bugzilla.mozilla.org/show_bug.cgi?id=1504834
-
-diff -r 051b75a600df gfx/2d/DrawTargetSkia.cpp
---- a/gfx/2d/DrawTargetSkia.cpp	Fri Jul 05 12:42:44 2019 +0200
-+++ b/gfx/2d/DrawTargetSkia.cpp	Mon Jul 08 10:59:30 2019 +0200
-@@ -138,8 +138,7 @@
+diff -up firefox-78.0/gfx/2d/DrawTargetSkia.cpp.mozilla-bmo1504834-part1 firefox-78.0/gfx/2d/DrawTargetSkia.cpp
+--- firefox-78.0/gfx/2d/DrawTargetSkia.cpp.mozilla-bmo1504834-part1	2020-06-17 04:18:58.000000000 +0200
++++ firefox-78.0/gfx/2d/DrawTargetSkia.cpp	2020-06-25 16:52:29.824532769 +0200
+@@ -135,8 +135,7 @@ static IntRect CalculateSurfaceBounds(co
    return surfaceBounds.Intersect(bounds);
  }
  
@@ -15,48 +11,48 @@ diff -r 051b75a600df gfx/2d/DrawTargetSkia.cpp
  
  static bool VerifyRGBXFormat(uint8_t* aData, const IntSize& aSize,
                               const int32_t aStride, SurfaceFormat aFormat) {
-diff -r 051b75a600df gfx/2d/Types.h
---- a/gfx/2d/Types.h	Fri Jul 05 12:42:44 2019 +0200
-+++ b/gfx/2d/Types.h	Mon Jul 08 10:59:30 2019 +0200
-@@ -85,15 +85,8 @@
+diff -up firefox-78.0/gfx/2d/Types.h.mozilla-bmo1504834-part1 firefox-78.0/gfx/2d/Types.h
+--- firefox-78.0/gfx/2d/Types.h.mozilla-bmo1504834-part1	2020-06-25 16:52:29.826532776 +0200
++++ firefox-78.0/gfx/2d/Types.h	2020-06-25 16:55:02.942063616 +0200
+@@ -90,15 +90,8 @@ enum class SurfaceFormat : int8_t {
  // The following values are endian-independent synonyms. The _UINT32 suffix
  // indicates that the name reflects the layout when viewed as a uint32_t
  // value.
--#if MOZ_LITTLE_ENDIAN
+-#if MOZ_LITTLE_ENDIAN()
    A8R8G8B8_UINT32 = B8G8R8A8,  // 0xAARRGGBB
-   X8R8G8B8_UINT32 = B8G8R8X8   // 0x00RRGGBB
--#elif MOZ_BIG_ENDIAN
+   X8R8G8B8_UINT32 = B8G8R8X8,  // 0x00RRGGBB
+-#elif MOZ_BIG_ENDIAN()
 -  A8R8G8B8_UINT32 = A8R8G8B8,  // 0xAARRGGBB
--  X8R8G8B8_UINT32 = X8R8G8B8   // 0x00RRGGBB
+-  X8R8G8B8_UINT32 = X8R8G8B8,  // 0x00RRGGBB
 -#else
 -#  error "bad endianness"
 -#endif
- };
  
- static inline int BytesPerPixel(SurfaceFormat aFormat) {
-diff -r 051b75a600df gfx/skia/skia/third_party/skcms/skcms.cc
---- a/gfx/skia/skia/third_party/skcms/skcms.cc	Fri Jul 05 12:42:44 2019 +0200
-+++ b/gfx/skia/skia/third_party/skcms/skcms.cc	Mon Jul 08 10:59:30 2019 +0200
-@@ -17,6 +17,8 @@
-     #include <arm_neon.h>
- #elif defined(__SSE__)
-     #include <immintrin.h>
+   // The following values are OS and endian-independent synonyms.
+   //
+diff -up firefox-78.0/gfx/skia/skia/third_party/skcms/skcms.cc.mozilla-bmo1504834-part1 firefox-78.0/gfx/skia/skia/third_party/skcms/skcms.cc
+--- firefox-78.0/gfx/skia/skia/third_party/skcms/skcms.cc.mozilla-bmo1504834-part1	2020-06-17 04:18:58.000000000 +0200
++++ firefox-78.0/gfx/skia/skia/third_party/skcms/skcms.cc	2020-06-25 16:54:02.993855444 +0200
+@@ -30,6 +30,8 @@
+         #include <avx512fintrin.h>
+         #include <avx512dqintrin.h>
+     #endif
 +#else
 +    #define SKCMS_PORTABLE
  #endif
  
  // sizeof(x) will return size_t, which is 32-bit on some machines and 64-bit on others.
-@@ -124,20 +126,28 @@
+@@ -280,20 +282,28 @@ enum {
  static uint16_t read_big_u16(const uint8_t* ptr) {
      uint16_t be;
      memcpy(&be, ptr, sizeof(be));
 -#if defined(_MSC_VER)
+-    return _byteswap_ushort(be);
 +#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
 +    return be;
-+#else
+ #else
 +    #if defined(_MSC_VER)
-     return _byteswap_ushort(be);
--#else
++    return _byteswap_ushort(be);
 +    #else
      return __builtin_bswap16(be);
 +    #endif
@@ -67,12 +63,12 @@ diff -r 051b75a600df gfx/skia/skia/third_party/skcms/skcms.cc
      uint32_t be;
      memcpy(&be, ptr, sizeof(be));
 -#if defined(_MSC_VER)
+-    return _byteswap_ulong(be);
 +#if __BYTE_ORDER == __ORDER_BIG_ENDIAN__
 +    return be;
-+#else
+ #else
 +    #if defined(_MSC_VER)
-     return _byteswap_ulong(be);
--#else
++    return _byteswap_ulong(be);
 +    #else
      return __builtin_bswap32(be);
 +    #endif
diff --git a/SOURCES/mozilla-bmo1626236.patch b/SOURCES/mozilla-bmo1626236.patch
new file mode 100644
index 0000000..32e3742
--- /dev/null
+++ b/SOURCES/mozilla-bmo1626236.patch
@@ -0,0 +1,86 @@
+# HG changeset patch
+# User msirringhaus@suse.de
+# Date 1582805876 -3600
+#      Thu Feb 27 13:17:56 2020 +0100
+# Node ID cc3d09abea31068e57f1ab918782f9f86fc6a158
+# Parent  9cd90914846f667f18babc491a74c164ae5d6e9f
+imported patch decoder_workaround.patch
+
+diff -r 9cd90914846f image/decoders/nsGIFDecoder2.cpp
+--- a/image/decoders/nsGIFDecoder2.cpp	Thu Feb 27 12:57:14 2020 +0100
++++ b/image/decoders/nsGIFDecoder2.cpp	Fri Mar 27 13:06:18 2020 +0100
+@@ -422,6 +422,9 @@
+   MOZ_ASSERT(mSwizzleFn);
+   uint8_t* data = reinterpret_cast<uint8_t*>(aColormap);
+   mSwizzleFn(data, data, aColors);
++#if MOZ_BIG_ENDIAN()
++  SwizzleRow(SurfaceFormat::A8R8G8B8, SurfaceFormat::B8G8R8A8)(data, data, aColors);
++#endif
+ }
+ 
+ LexerResult nsGIFDecoder2::DoDecode(SourceBufferIterator& aIterator,
+diff -r 9cd90914846f image/decoders/nsJPEGDecoder.cpp
+--- a/image/decoders/nsJPEGDecoder.cpp	Thu Feb 27 12:57:14 2020 +0100
++++ b/image/decoders/nsJPEGDecoder.cpp	Fri Mar 27 13:06:18 2020 +0100
+@@ -263,6 +263,9 @@
+         case JCS_YCbCr:
+           // By default, we will output directly to BGRA. If we need to apply
+           // special color transforms, this may change.
++#if MOZ_BIG_ENDIAN()
++          mInfo.out_color_space = MOZ_JCS_EXT_NATIVE_ENDIAN_XRGB;
++#else
+           switch (SurfaceFormat::OS_RGBX) {
+             case SurfaceFormat::B8G8R8X8:
+               mInfo.out_color_space = JCS_EXT_BGRX;
+@@ -277,6 +280,7 @@
+               mState = JPEG_ERROR;
+               return Transition::TerminateFailure();
+           }
++#endif
+           break;
+         case JCS_CMYK:
+         case JCS_YCCK:
+diff -r 9cd90914846f image/decoders/nsPNGDecoder.cpp
+--- a/image/decoders/nsPNGDecoder.cpp	Thu Feb 27 12:57:14 2020 +0100
++++ b/image/decoders/nsPNGDecoder.cpp	Fri Mar 27 13:06:18 2020 +0100
+@@ -361,7 +361,7 @@
+                                    IResumable* aOnResume) {
+   MOZ_ASSERT(!HasError(), "Shouldn't call DoDecode after error!");
+ 
+-  return mLexer.Lex(aIterator, aOnResume,
++  LexerResult res = mLexer.Lex(aIterator, aOnResume,
+                     [=](State aState, const char* aData, size_t aLength) {
+                       switch (aState) {
+                         case State::PNG_DATA:
+@@ -371,6 +371,14 @@
+                       }
+                       MOZ_CRASH("Unknown State");
+                     });
++
++#if MOZ_BIG_ENDIAN()
++  if(res.is<TerminalState>() && res.as<TerminalState>() == TerminalState::SUCCESS) {
++      NativeEndian::swapToLittleEndianInPlace<uint32_t>((uint32_t*)(mImageData), mImageDataLength / 4);
++  }
++#endif
++
++  return res;
+ }
+ 
+ LexerTransition<nsPNGDecoder::State> nsPNGDecoder::ReadPNGData(
+diff -r 9cd90914846f image/decoders/nsWebPDecoder.cpp
+--- a/image/decoders/nsWebPDecoder.cpp	Thu Feb 27 12:57:14 2020 +0100
++++ b/image/decoders/nsWebPDecoder.cpp	Fri Mar 27 13:06:18 2020 +0100
+@@ -237,7 +237,12 @@
+   // WebP doesn't guarantee that the alpha generated matches the hint in the
+   // header, so we always need to claim the input is BGRA. If the output is
+   // BGRX, swizzling will mask off the alpha channel.
++#if MOZ_BIG_ENDIAN()
++  mBuffer.colorspace = MODE_ARGB;
++  SurfaceFormat inFormat = mFormat;
++#else
+   SurfaceFormat inFormat = SurfaceFormat::OS_RGBA;
++#endif
+ 
+   SurfacePipeFlags pipeFlags = SurfacePipeFlags();
+   if (mFormat == SurfaceFormat::OS_RGBA &&
+
diff --git a/SOURCES/mozilla-bmo998749.patch b/SOURCES/mozilla-bmo998749.patch
new file mode 100644
index 0000000..4ddde4c
--- /dev/null
+++ b/SOURCES/mozilla-bmo998749.patch
@@ -0,0 +1,30 @@
+# HG changeset patch
+# User msirringhaus@suse.de
+# Date 1583738770 -3600
+#      Mon Mar 09 08:26:10 2020 +0100
+# Node ID 34676feac1a542e409e22acf5b98735f8313b1ce
+# Parent  506857dace0a08d1c9685e3ac264646590b3e27f
+[mq]: mozilla-bmo998749.patch
+
+diff -r 506857dace0a -r 34676feac1a5 gfx/2d/FilterProcessing.h
+--- a/gfx/2d/FilterProcessing.h	Fri Feb 28 12:31:51 2020 +0100
++++ b/gfx/2d/FilterProcessing.h	Mon Mar 09 08:26:10 2020 +0100
+@@ -13,10 +13,17 @@
+ namespace mozilla {
+ namespace gfx {
+ 
++#if MOZ_BIG_ENDIAN()
++const ptrdiff_t B8G8R8A8_COMPONENT_BYTEOFFSET_B = 3;
++const ptrdiff_t B8G8R8A8_COMPONENT_BYTEOFFSET_G = 2;
++const ptrdiff_t B8G8R8A8_COMPONENT_BYTEOFFSET_R = 1;
++const ptrdiff_t B8G8R8A8_COMPONENT_BYTEOFFSET_A = 0;
++#else
+ const ptrdiff_t B8G8R8A8_COMPONENT_BYTEOFFSET_B = 0;
+ const ptrdiff_t B8G8R8A8_COMPONENT_BYTEOFFSET_G = 1;
+ const ptrdiff_t B8G8R8A8_COMPONENT_BYTEOFFSET_R = 2;
+ const ptrdiff_t B8G8R8A8_COMPONENT_BYTEOFFSET_A = 3;
++#endif
+ 
+ class FilterProcessing {
+  public:
+
diff --git a/SOURCES/mozilla-nestegg-big-endian.patch b/SOURCES/mozilla-nestegg-big-endian.patch
deleted file mode 100644
index de9adbf..0000000
--- a/SOURCES/mozilla-nestegg-big-endian.patch
+++ /dev/null
@@ -1,38 +0,0 @@
-# HG changeset patch
-# Parent  381102061fccdec40efda75c7423a766f68201ba
-Bug-behavior: Youtube-videos using VP9 and opus as audio-codec started loading but did not play
-Reason: While parsing the audio-stream, the sampling frequency (short rate) was wrongly parsed by
-        nestegg, returning 0 all the time. This led to the audio-track reporting that it neither had 
-        valid video nor audio. Which led to an endless-loop in the video state machine.
-Solution: Correct parsing of rate in nestegg, which is a float and cuts of bytes.
-Link: https://github.com/kinetiknz/nestegg/issues/64
-
-diff -r 381102061fcc -r 8da4be020b1e media/libnestegg/src/nestegg.c
---- a/media/libnestegg/src/nestegg.c	Tue Aug 13 07:51:27 2019 +0200
-+++ b/media/libnestegg/src/nestegg.c	Tue Aug 20 07:59:54 2019 +0200
-@@ -768,7 +768,15 @@
- {
-   union {
-     uint64_t u;
--    float f;
-+    struct {
-+#if __FLOAT_WORD_ORDER__ == __ORDER_BIG_ENDIAN__
-+      uint32_t _pad;
-+      float f;
-+#else
-+      float f;
-+      uint32_t _pad;
-+#endif
-+    } f;
-     double d;
-   } value;
-   int r;
-@@ -780,7 +788,7 @@
-   if (r != 1)
-     return r;
-   if (length == 4)
--    *val = value.f;
-+    *val = value.f.f;
-   else
-     *val = value.d;
-   return 1;
diff --git a/SOURCES/mozilla-s390x-skia-gradient.patch b/SOURCES/mozilla-s390x-skia-gradient.patch
new file mode 100644
index 0000000..8c0e3bd
--- /dev/null
+++ b/SOURCES/mozilla-s390x-skia-gradient.patch
@@ -0,0 +1,52 @@
+# HG changeset patch
+# Parent  acf59ea86dd1d878b43920832093f082dcfc61c0
+
+diff -r acf59ea86dd1 gfx/skia/skia/src/shaders/gradients/Sk4fLinearGradient.cpp
+--- a/gfx/skia/skia/src/shaders/gradients/Sk4fLinearGradient.cpp	Mon Mar 09 08:26:10 2020 +0100
++++ b/gfx/skia/skia/src/shaders/gradients/Sk4fLinearGradient.cpp	Fri Mar 27 13:30:28 2020 +0100
+@@ -7,7 +7,7 @@
+ 
+ #include "include/core/SkPaint.h"
+ #include "src/shaders/gradients/Sk4fLinearGradient.h"
+-
++#include "src/core/SkEndian.h"
+ #include <cmath>
+ #include <utility>
+ 
+@@ -28,6 +28,9 @@
+ 
+     while (n >= 4) {
+         DstTraits<premul>::store4x(c0, c1, c2, c3, dst, bias0, bias1);
++#ifdef SK_CPU_BENDIAN
++        SkEndianSwap32s(dst, 4);
++#endif
+         dst += 4;
+ 
+         c0 = c0 + dc4;
+@@ -37,12 +40,23 @@
+         n -= 4;
+     }
+     if (n & 2) {
+-        DstTraits<premul>::store(c0, dst++, bias0);
+-        DstTraits<premul>::store(c1, dst++, bias1);
++        DstTraits<premul>::store(c0, dst, bias0);
++#ifdef SK_CPU_BENDIAN
++        *dst = SkEndianSwap32(*dst);
++#endif
++        ++dst;
++        DstTraits<premul>::store(c1, dst, bias1);
++#ifdef SK_CPU_BENDIAN
++        *dst = SkEndianSwap32(*dst);
++#endif
++        ++dst;
+         c0 = c0 + dc2;
+     }
+     if (n & 1) {
+         DstTraits<premul>::store(c0, dst, bias0);
++#ifdef SK_CPU_BENDIAN
++        *dst = SkEndianSwap32(*dst);
++#endif
+     }
+ }
+ 
+
diff --git a/SOURCES/no-rust-lto.patch b/SOURCES/no-rust-lto.patch
deleted file mode 100644
index 7d8ae5d..0000000
--- a/SOURCES/no-rust-lto.patch
+++ /dev/null
@@ -1,12 +0,0 @@
-diff -up firefox-68.0/config/makefiles/rust.mk.old firefox-68.0/config/makefiles/rust.mk
---- firefox-68.0/config/makefiles/rust.mk.old	2019-06-05 10:33:34.290128660 +0200
-+++ firefox-68.0/config/makefiles/rust.mk	2019-06-05 10:33:59.835052814 +0200
-@@ -47,7 +47,7 @@ cargo_rustc_flags = $(CARGO_RUSTCFLAGS)
- ifndef DEVELOPER_OPTIONS
- ifndef MOZ_DEBUG_RUST
- # Enable link-time optimization for release builds.
--cargo_rustc_flags += -C lto
-+#cargo_rustc_flags += -C lto
- endif
- endif
- 
diff --git a/SOURCES/nss-build-mozilla-1564499.patch b/SOURCES/nss-build-mozilla-1564499.patch
deleted file mode 100644
index 9d5bb5c..0000000
--- a/SOURCES/nss-build-mozilla-1564499.patch
+++ /dev/null
@@ -1,12 +0,0 @@
-diff -up firefox-68.0/security/nss/lib/freebl/mpi/mpcpucache.c.old firefox-68.0/security/nss/lib/freebl/mpi/mpcpucache.c
---- firefox-68.0/security/nss/lib/freebl/mpi/mpcpucache.c.old	2019-07-26 07:09:02.383303420 +0200
-+++ firefox-68.0/security/nss/lib/freebl/mpi/mpcpucache.c	2019-07-26 07:09:27.228193798 +0200
-@@ -727,7 +727,7 @@ static inline void
- dcbzl(char *array)
- {
-     register char *a asm("r2") = array;
--    __asm__ __volatile__("dcbzl %0,r0"
-+    __asm__ __volatile__("dcbzl %0,0"
-                          : "=r"(a)
-                          : "0"(a));
- }
diff --git a/SOURCES/nss-setup-flags-env.inc b/SOURCES/nss-setup-flags-env.inc
new file mode 100644
index 0000000..c3624b1
--- /dev/null
+++ b/SOURCES/nss-setup-flags-env.inc
@@ -0,0 +1,7 @@
+sed -i 's@%{gtk3_install_path}@%{_buildrootdir}%{gtk3_install_path}@g' %{_buildrootdir}%{gtk3_install_path}/%{_lib}/pkgconfig/nss*.pc
+
+export LDFLAGS="-L%{_buildrootdir}%{gtk3_install_path}/%{_lib} $LDFLAGS"
+export LDFLAGS="-Wl,-rpath,%{gtk3_install_path}/%{_lib} $LDFLAGS"
+export LDFLAGS="-Wl,-rpath-link,%{_buildrootdir}%{gtk3_install_path}/%{_lib} $LDFLAGS"
+export PKG_CONFIG_PATH=%{_buildrootdir}%{gtk3_install_path}/%{_lib}/pkgconfig
+export PATH="{_buildrootdir}%{gtk3_install_path}/bin:$PATH"
diff --git a/SOURCES/rhbz-1821418.patch b/SOURCES/rhbz-1821418.patch
index 588084c..8b02dfb 100644
--- a/SOURCES/rhbz-1821418.patch
+++ b/SOURCES/rhbz-1821418.patch
@@ -1,7 +1,7 @@
-diff -up firefox-68.7.0/xpcom/base/AvailableMemoryTracker.cpp.rhbz-1821418 firefox-68.7.0/xpcom/base/AvailableMemoryTracker.cpp
---- firefox-68.7.0/xpcom/base/AvailableMemoryTracker.cpp.rhbz-1821418	2020-04-03 21:30:08.000000000 +0200
-+++ firefox-68.7.0/xpcom/base/AvailableMemoryTracker.cpp	2020-04-23 21:15:56.015491502 +0200
-@@ -147,8 +147,12 @@ bool nsAvailableMemoryWatcher::IsVirtual
+diff -up firefox-78.0/xpcom/base/AvailableMemoryTracker.cpp.rhbz-1821418 firefox-78.0/xpcom/base/AvailableMemoryTracker.cpp
+--- firefox-78.0/xpcom/base/AvailableMemoryTracker.cpp.rhbz-1821418	2020-06-17 04:20:44.000000000 +0200
++++ firefox-78.0/xpcom/base/AvailableMemoryTracker.cpp	2020-06-25 14:50:46.369798294 +0200
+@@ -157,8 +157,12 @@ bool nsAvailableMemoryWatcher::IsVirtual
  
  /* static */
  bool nsAvailableMemoryWatcher::IsCommitSpaceLow(const MEMORYSTATUSEX& aStat) {
@@ -16,7 +16,7 @@ diff -up firefox-68.7.0/xpcom/base/AvailableMemoryTracker.cpp.rhbz-1821418 firef
      sNumLowCommitSpaceEvents++;
      CrashReporter::AnnotateCrashReport(
          CrashReporter::Annotation::LowCommitSpaceEvents,
-@@ -206,13 +210,16 @@ void nsAvailableMemoryWatcher::AdjustPol
+@@ -210,12 +214,15 @@ void nsAvailableMemoryWatcher::AdjustPol
  // polling interval accordingly.
  NS_IMETHODIMP
  nsAvailableMemoryWatcher::Notify(nsITimer* aTimer) {
@@ -28,10 +28,9 @@ diff -up firefox-68.7.0/xpcom/base/AvailableMemoryTracker.cpp.rhbz-1821418 firef
    bool success = GlobalMemoryStatusEx(&stat);
  
 -  if (success) {
-+  if (success || forceLowMem) {
-     bool lowMemory = IsVirtualMemoryLow(stat) || IsCommitSpaceLow(stat) ||
--                     IsPhysicalMemoryLow(stat);
-+                     IsPhysicalMemoryLow(stat) || forceLowMem;
+-    bool lowMemory = IsVirtualMemoryLow(stat) || IsCommitSpaceLow(stat);
++  if (success || forceLowMemory) {
++    bool lowMemory = IsVirtualMemoryLow(stat) || IsCommitSpaceLow(stat || forceLowMem);
  
      if (lowMemory) {
        SendMemoryPressureEvent();
diff --git a/SOURCES/rust-network-check.patch b/SOURCES/rust-network-check.patch
deleted file mode 100644
index d18f2fe..0000000
--- a/SOURCES/rust-network-check.patch
+++ /dev/null
@@ -1,105 +0,0 @@
-diff -up firefox-68.0/config/makefiles/rust.mk.rust-network-check firefox-68.0/config/makefiles/rust.mk
---- firefox-68.0/config/makefiles/rust.mk.rust-network-check	2019-06-06 10:29:18.984737603 +0200
-+++ firefox-68.0/config/makefiles/rust.mk	2019-06-06 11:39:51.581028835 +0200
-@@ -127,7 +127,7 @@ export RUST_BACKTRACE=full
- export MOZ_TOPOBJDIR=$(topobjdir)
- 
- target_rust_ltoable := force-cargo-library-build
--target_rust_nonltoable := force-cargo-test-run force-cargo-library-check $(foreach b,build check,force-cargo-program-$(b))
-+target_rust_nonltoable := force-cargo-test-run $(foreach b,build check,force-cargo-program-$(b))
- 
- $(target_rust_ltoable): RUSTFLAGS:=$(rustflags_override) $(RUSTFLAGS) $(if $(MOZ_LTO_RUST),-Clinker-plugin-lto)
- $(target_rust_nonltoable): RUSTFLAGS:=$(rustflags_override) $(RUSTFLAGS)
-@@ -238,19 +238,9 @@ force-cargo-library-build:
- 	$(call CARGO_BUILD) --lib $(cargo_target_flag) $(rust_features_flag) -- $(cargo_rustc_flags)
- 
- $(RUST_LIBRARY_FILE): force-cargo-library-build
--# When we are building in --enable-release mode; we add an additional check to confirm
--# that we are not importing any networking-related functions in rust code. This reduces
--# the chance of proxy bypasses originating from rust code.
--ifndef DEVELOPER_OPTIONS
--ifndef MOZ_DEBUG_RUST
--ifeq ($(OS_ARCH), Linux)
--	$(call py_action,check_binary,--target --networking $@)
--endif
--endif
--endif
- 
- force-cargo-library-check:
--	$(call CARGO_CHECK) --lib $(cargo_target_flag) $(rust_features_flag)
-+	@true
- else
- force-cargo-library-check:
- 	@true
-diff -up firefox-68.0/python/mozbuild/mozbuild/action/check_binary.py.rust-network-check firefox-68.0/python/mozbuild/mozbuild/action/check_binary.py
---- firefox-68.0/python/mozbuild/mozbuild/action/check_binary.py.rust-network-check	2019-05-20 18:17:57.000000000 +0200
-+++ firefox-68.0/python/mozbuild/mozbuild/action/check_binary.py	2019-06-06 10:29:18.986737599 +0200
-@@ -250,43 +250,6 @@ def check_mozglue_order(target, binary):
-         raise RuntimeError('Could not parse readelf output?')
- 
- 
--def check_networking(binary):
--    retcode = 0
--    networking_functions = set([
--        # socketpair is not concerning; it is restricted to AF_UNIX
--        "socket", "connect", "accept", "bind", "listen",
--        "getsockname", "getsockopt", "setsockopt",
--        "recv", "recvfrom",
--        "send", "sendto",
--        # We would be concerned by recvmsg and sendmsg; but we believe
--        # they are okay as documented in 1376621#c23
--        "gethostbyname", "gethostbyaddr", "gethostent", "sethostent", "endhostent",
--        "gethostent_r", "gethostbyname2", "gethostbyaddr_r", "gethostbyname_r",
--        "gethostbyname2_r",
--        "getaddrinfo", "getservent", "getservbyname", "getservbyport", "setservent",
--        "getprotoent", "getprotobyname", "getprotobynumber", "setprotoent",
--        "endprotoent"])
--    bad_occurences_names = set()
--
--    try:
--        for sym in at_least_one(iter_symbols(binary)):
--            if sym['addr'] == 0 and sym['name'] in networking_functions:
--                bad_occurences_names.add(sym['name'])
--    except Empty:
--        raise RuntimeError('Could not parse llvm-objdump output?')
--
--    basename = os.path.basename(binary)
--    if bad_occurences_names:
--        s = 'TEST-UNEXPECTED-FAIL | check_networking | {} | Identified {} ' + \
--            'networking function(s) being imported in the rust static library ({})'
--        print(s.format(basename, len(bad_occurences_names),
--            ",".join(sorted(bad_occurences_names))),
--            file=sys.stderr)
--        retcode = 1
--    elif buildconfig.substs.get('MOZ_AUTOMATION'):
--        print('TEST-PASS | check_networking | {}'.format(basename))
--    return retcode
--
- def checks(target, binary):
-     # The clang-plugin is built as target but is really a host binary.
-     # Cheat and pretend we were passed the right argument.
-@@ -330,8 +293,6 @@ def main(args):
-                         help='Perform checks for a host binary')
-     parser.add_argument('--target', action='store_true',
-                         help='Perform checks for a target binary')
--    parser.add_argument('--networking', action='store_true',
--                        help='Perform checks for networking functions')
- 
-     parser.add_argument('binary', metavar='PATH',
-                         help='Location of the binary to check')
-@@ -343,14 +304,7 @@ def main(args):
-               file=sys.stderr)
-         return 1
- 
--    if options.networking and options.host:
--        print('--networking is only valid with --target',
--               file=sys.stderr)
--        return 1
--
--    if options.networking:
--        return check_networking(options.binary)
--    elif options.host:
-+    if options.host:
-         return checks(HOST, options.binary)
-     elif options.target:
-         return checks(TARGET, options.binary)
diff --git a/SPECS/firefox.spec b/SPECS/firefox.spec
index f7e18d0..1259e5f 100644
--- a/SPECS/firefox.spec
+++ b/SPECS/firefox.spec
@@ -1,22 +1,43 @@
 # Set for local builds only
 %global disable_toolsets  0
 
-%ifarch %{arm}
-%if %{defined el8}
-%undefine _debugsource_packages
+%ifarch i686
+# no debug package for the i686 because oom on i686 with debuginfos
+%global debug_package %{nil}
 %endif
+
+%global rhel_minor_version -1
+%if "%{?dist}" == ".el8"
+%global rhel_minor_version 3
+%endif
+%if "%{?dist}" == ".el8_3"
+%global rhel_minor_version 3
+%endif
+%if "%{?dist}" == ".el8_2"
+%global rhel_minor_version 2
+%endif
+%if "%{?dist}" == ".el8_1"
+%global rhel_minor_version 1
+%endif
+%if "%{?dist}" == ".el8_0"
+%global rhel_minor_version 0
 %endif
 
+%global bundle_nss        0
+%global system_nss        1
 # Use system nspr/nss? FIXME
 %if 0%{?rhel} == 8
-%global system_nss        1
+  %if 0%{?rhel_minor_version} < 2
+%global bundle_nss        1
+  %endif
 %endif
 %if 0%{?rhel} == 7
 %global system_nss        1
 %endif
 %if 0%{?rhel} == 6
-%global system_nss        1
+%global bundle_nss        1
 %endif
+
 %define use_bundled_ffi   0
 %if 0%{?rhel} == 8
 %define use_bundled_python_2 1
@@ -25,6 +46,14 @@
 %define use_bundled_python_2 1
 %define use_bundled_python_3 1
 %endif
+
+%if 0%{?flatpak:1}
+%define use_bundled_python_2 1
+%endif
+
+# we need python2 because of icu data gen
+%define use_bundled_python_2 1
+
 %define bundle_gnome_extension 0
 
 # Don't use system hunspell for now
@@ -102,21 +131,6 @@
 %global libvpx_version 1.4.0
 %endif
 
-%global rhel_minor_version -1
-%if "%{?dist}" == "el8"
-%global rhel_minor_version 3
-%endif
-%if "%{?dist}" == ".el8_2"
-%global rhel_minor_version 2
-%endif
-%if "%{?dist}" == ".el8_1"
-%global rhel_minor_version 1
-%endif
-%if "%{?dist}" == ".el8_0"
-%global rhel_minor_version 0
-%endif
-
-
 %if 0%{?system_nss}
 %global nspr_version 4.21
 # NSS/NSPR quite often ends in build override, so as requirement the version
@@ -136,11 +150,20 @@
 
 %define bundled_python_version_2 2.7.13
 %define bundled_python_version_3 3.6.8
-%define use_bundled_yasm        1
 %define use_bundled_openssl     0
 %define use_bundled_nodejs      0
+
+%if 0%{?rhel} == 8
+  %if 0%{?rhel_minor_version} <= 2
+%define use_bundled_nodejs      1
+%define use_bundled_python_2    1
+  %endif
+%endif
+
 %if 0%{?rhel} < 8
 %define use_bundled_nodejs      1
+%define use_bundled_yasm        1
+%define use_bundled_python_2    1
 %if 0%{?rhel} == 6
 %define use_bundled_openssl     1
 %endif
@@ -159,12 +182,12 @@
 %define gtk3_nvr 3.22.26-1
 %define gtk3_install_path %{mozappdir}/bundled
 
-%if 0%{?bundle_gtk3}
+#%if 0%{?bundle_gtk3}
 # We could use %%include, but in %%files, %%post and other sections, but in these
 # sections it could lead to syntax errors about unclosed %%if. Work around it by
 # using the following macro
 %define include_file() %{expand:%(cat '%1')}
-%endif
+#%endif
 
 
 %global mozappdir     %{_libdir}/%{name}
@@ -186,8 +209,8 @@
 
 Summary:        Mozilla Firefox Web browser
 Name:           firefox
-Version:        68.9.0
-Release:        1%{?dist}
+Version:        78.2.0
+Release:        2%{?dist}
 URL:            https://www.mozilla.org/firefox/
 License:        MPLv1.1 or GPLv2+ or LGPLv2+
 %if 0%{?rhel} == 7
@@ -199,9 +222,9 @@ ExclusiveArch:  i686 x86_64 ppc64 s390x
 
 Source0:        https://hg.mozilla.org/releases/mozilla-release/archive/firefox-%{version}%{?pre_version}.source.tar.xz
 %if %{build_langpacks}
-Source1:        firefox-langpacks-%{version}%{?pre_version}-20200529.tar.xz
+Source1:        firefox-langpacks-%{version}%{?pre_version}-20200818.tar.xz
 %endif
-Source2:        cbindgen-vendor.tar.xz
+Source2:        cbindgen-vendor-0.14.3.tar.xz
 Source10:       firefox-mozconfig
 %if 0%{?centos}
 Source12:       firefox-centos-default-prefs.js
@@ -226,9 +249,12 @@ Source205:      gtk3-private-%{gtk3_nvr}-setup-flags-env.inc
 Source206:      gtk3-private-%{gtk3_nvr}-requires-provides-filter.inc
 Source301:      yasm-1.2.0-3.el5.src.rpm
 Source303:      libffi-3.0.13-18.el7_3.src.rpm
-Source304:      nodejs-8.11.4-1.3.fc27.src.rpm
+Source304:      nodejs-10.21.0-3.el8_0.src.rpm
 Source305:      openssl-1.0.2k-19.6.bundle.el7_7.src.rpm
 
+Source400:      nss-3.53.1-3.el8_0.src.rpm
+Source401:      nss-setup-flags-env.inc
+Source402:      nspr-4.25.0-1.el8_0.src.rpm 
 #Python
 %if 0%{?use_bundled_python_2}
 Source100:      https://www.python.org/ftp/python/%{bundled_python_version_2}/Python-%{bundled_python_version_2}.tar.xz
@@ -243,36 +269,27 @@ Patch1002:      python-2.7-gcc8-fix.patch
 Patch1003:      python-missing-utimensat.patch
 Patch1004:      build-icu-make.patch
 # workaround for https://bugzilla.redhat.com/show_bug.cgi?id=1699374
-Patch1:         no-rust-lto.patch
-Patch2:         rust-network-check.patch
 Patch4:         build-mozconfig-fix.patch
 Patch6:         build-nss-version.patch
 Patch7:         firefox-debugedits-error.patch
-Patch8:         firefox-dont-check-binary.patch
-Patch9:         nss-build-mozilla-1564499.patch
-Patch26:        build-icu-big-endian.patch
-Patch41:        build-debug-qcms.patch
 
 # Fedora/RHEL specific patches
 Patch215:        firefox-enable-addons.patch
 Patch219:        rhbz-1173156.patch
 Patch224:        mozilla-1170092.patch
 #ARM run-time patch
-#Patch226:        rhbz-1354671.patch
 Patch231:        firefox-pipewire.patch
 Patch232:        firefox-rhel6-hugepage.patch
 Patch233:        firefox-rhel6-nss-tls1.3.patch
 Patch234:        rhbz-1821418.patch
 Patch235:        firefox-pipewire-0-3.patch
+Patch236:        fedora-shebang-build.patch
 
 # Upstream patches
 Patch402:        mozilla-1196777.patch
 
-#Patch500:        debug.patch
 Patch501:        python-encode.patch
-Patch502:        mozilla-1603112-accept-lang.patch
 Patch503:        mozilla-s390-context.patch
-Patch504:        mozilla-nestegg-big-endian.patch
 Patch505:        mozilla-bmo1005535.patch
 Patch506:        mozilla-bmo1504834-part1.patch
 Patch507:        mozilla-bmo1504834-part2.patch
@@ -281,6 +298,10 @@ Patch509:        mozilla-bmo1504834-part4.patch
 Patch510:        mozilla-bmo1554971.patch
 Patch511:        mozilla-bmo1602730.patch
 Patch512:        mozilla-bmo849632.patch
+Patch513:        mozilla-bmo998749.patch
+Patch514:        mozilla-s390x-skia-gradient.patch
+Patch515:        mozilla-bmo1626236.patch
+Patch516:        D87019-thin-vec-big-endian.diff
 
 # CentOS patches
 %if 0%{?centos}
@@ -289,10 +310,12 @@ Patch10001:      Bug-1526653---fix_user_vfp_armv7.patch
 %endif
 
 %if %{?system_nss}
+%if !0%{?bundle_nss}
 BuildRequires:  pkgconfig(nspr) >= %{nspr_version}
 BuildRequires:  pkgconfig(nss) >= %{nss_version}
 BuildRequires:  nss-static >= %{nss_version}
 %endif
+%endif
 %if %{?system_cairo}
 BuildRequires:  pkgconfig(cairo) >= %{cairo_version}
 %endif
@@ -353,7 +376,7 @@ BuildRequires:  clang >= %{llvm_version}
 BuildRequires:  clang-devel >= %{llvm_version}
 BuildRequires:  rustfmt >= %{rust_version}
 BuildRequires:  python3
-BuildRequires:  nodejs >= 8.11
+BuildRequires:  nodejs >= 10.21
 %else
 %if 0%{?use_rustts}
 BuildRequires:  rust-toolset-%{rust_toolset_version}
@@ -364,13 +387,22 @@ BuildRequires:  llvm-toolset-%{llvm_version}-llvm-devel
 %endif
 %endif
 
+%if ! 0%{?use_bundled_yasm}
+BuildRequires:  yasm
+%endif
+
+
 %if 0%{?use_bundled_python_2}
 # Needed for Python in RHEL6
 BuildRequires:  openssl-devel
 %endif
 
 %if 0%{?rhel} == 8
+  %if 0%{?rhel_minor_version} >= 3
+BuildRequires:  pkgconfig(libpipewire-0.3)
+  %else
 BuildRequires:  pipewire-devel
+  %endif
 %endif
 
 %if 0%{?bundle_gtk3}
@@ -418,16 +450,37 @@ BuildRequires:        gtk3-devel
 BuildRequires:        glib2-devel
 %endif
 
+# Bundled nss/nspr requirement
+%if 0%{?bundle_nss}
+BuildRequires:    nss-softokn
+BuildRequires:    sqlite-devel
+BuildRequires:    zlib-devel
+BuildRequires:    pkgconfig
+BuildRequires:    gawk
+BuildRequires:    psmisc
+%if 0%{?rhel} == 6
+BuildRequires:    perl
+%else
+BuildRequires:    perl-interpreter
+%endif
+BuildRequires:    gcc-c++
+BuildRequires:    xmlto
+%endif
+
 Requires:       mozilla-filesystem
 Requires:       p11-kit-trust
 %if %{?system_nss}
+%if !0%{?bundle_nss}
 Requires:       nspr >= %{nspr_build_version}
 Requires:       nss >= %{nss_build_version}
 %endif
+%endif
 
 BuildRequires:  desktop-file-utils
 BuildRequires:  system-bookmarks
 Requires:       redhat-indexhtml
+#for the python2
+BuildRequires:  pkgconfig(sqlite3)
 %if %{?system_sqlite}
 BuildRequires:  pkgconfig(sqlite3) >= %{sqlite_version}
 Requires:       sqlite >= %{sqlite_build_version}
@@ -444,6 +497,17 @@ BuildRequires:  pkgconfig(libffi)
   %endif
 %endif
 
+%if %{?use_bundled_nodejs}
+BuildRequires: python3-devel
+BuildRequires: zlib-devel
+BuildRequires: brotli-devel
+BuildRequires: gcc >= 4.9.4
+BuildRequires: gcc-c++ >= 4.9.4
+BuildRequires: chrpath
+BuildRequires: libatomic
+BuildRequires: openssl-devel
+%endif
+
 Obsoletes:      mozilla <= 37:1.7.13
 Provides:       webclient
 
@@ -506,6 +570,20 @@ https://extensions.gnome.org.
 %endif
 
 %prep
+echo "Build environment"
+echo "dist                  %{?dist}"
+echo "RHEL 8 minor version: %{?rhel_minor_version}"
+echo "use_bundled_ffi       %{?use_bundled_ffi}"
+echo "use_bundled_python_2  %{?use_bundled_python_2}"
+echo "use_bundled_python_3  %{?use_bundled_python_3}"
+echo "bundle_nss            %{?bundle_nss}"
+echo "system_nss            %{?system_nss}"
+echo "use_rustts            %{?use_rustts}"
+echo "use_bundled_nodejs    %{?use_bundled_nodejs}"
+echo "use_bundled_openssl   %{?use_bundled_openssl}"
+echo "use_bundled_yasm      %{?use_bundled_yasm}"
+
+
 %if 0%{?use_bundled_python_2}
 %setup -q -T -c -n python2 -a 100
 %patch1000 -p0 -b .build
@@ -521,23 +599,13 @@ https://extensions.gnome.org.
 # Build patches, can't change backup suffix from default because during build
 # there is a compare of config and js/config directories and .orig suffix is
 # ignored during this compare.
-%patch1 -p1 -b .no-rust-lto
-%patch2 -p1 -b .rust-network-check
 %patch7 -p1 -b .debugedits-error
 %ifarch %{ix86} %{arm} ppc
 # binary check fails OOM on 32bit arches
-%patch8 -p1 -b .dont-check-binary
-%endif
-%patch9 -p1 -b .nss-build-mozilla-1564499
-
-%if %{?debug_build}
-%patch41 -p1 -b .build-debug-qcms
 %endif
-#%if 0%{?rhel} == 8
-#%endif
 
 %patch4  -p1 -b .build-mozconfig-fix
-%patch6  -p1 -b .nss-version
+#%patch6  -p1 -b .nss-version
 
 # Fedora patches
 %patch215 -p1 -b .addons
@@ -545,34 +613,28 @@ https://extensions.gnome.org.
 %patch224 -p1 -b .1170092
 %if 0%{?rhel} == 8
   %if 0%{?rhel_minor_version} >= 3
-%patch235 -p1 -b .pipewire-0-3
+#TEMP disable %patch235 -p1 -b .pipewire-0-3
   %else
 %patch231 -p1 -b .pipewire
   %endif
 %endif
+
+%patch236 -p1 -b .fedora-shebang-build
+
 %if 0%{?rhel} == 6
 %patch232 -p1 -b .hugepage
 %patch233 -p1 -b .rhel6-nss-tls1.3
 %endif
 %patch234 -p1 -b .rhbz-1821418
 
-#ARM run-time patch
-#%ifarch aarch64
-#%patch226 -p1 -b .1354671
-#%endif
-
 %patch402 -p1 -b .1196777
 
 # Patch for big endian platforms only
 %if 0%{?big_endian}
-%patch26 -p1 -b .icu
 %endif
 
-#%patch500 -p1 -b .debug
 %patch501 -p1 -b .python-encode
-%patch502 -p1 -b .1603112-accept-lang
 %patch503 -p1 -b .mozilla-s390-context
-%patch504 -p1 -b .mozilla-nestegg-big-endian
 %patch505 -p1 -b .mozilla-bmo1005535
 %patch506 -p1 -b .mozilla-bmo1504834-part1
 %patch507 -p1 -b .mozilla-bmo1504834-part2
@@ -581,6 +643,10 @@ https://extensions.gnome.org.
 %patch510 -p1 -b .mozilla-bmo1554971
 %patch511 -p1 -b .mozilla-bmo1602730
 %patch512 -p1 -b .mozilla-bmo849632
+%patch513 -p1 -b .mozilla-bmo998749
+%patch514 -p1 -b .mozilla-s390x-skia-gradient
+%patch515 -p1 -b .mozilla-bmo1626236
+%patch516 -p1 -b .D87019-thin-vec-big-endian.diff
 %patch1001 -p1 -b .ppc64le-inline
 %patch1004 -p1 -b .icu-make
 
@@ -606,12 +672,6 @@ echo "ac_add_options --without-system-nspr" >> .mozconfig
 echo "ac_add_options --without-system-nss" >> .mozconfig
 %endif
 
-%if %{?system_sqlite}
-echo "ac_add_options --enable-system-sqlite" >> .mozconfig
-%else
-echo "ac_add_options --disable-system-sqlite" >> .mozconfig
-%endif
-
 %if %{?system_cairo}
 echo "ac_add_options --enable-system-cairo" >> .mozconfig
 %else
@@ -646,12 +706,8 @@ echo "ac_add_options --disable-optimize" >> .mozconfig
 %endif
 %ifarch armv7hl
 # ARMv7 need that (rhbz#1426850)
-%if %{defined el8}
-%global optimize_flags "-g0 -O2 -fno-schedule-insns -fno-lto"
-%else
 %global optimize_flags "-g -O2 -fno-schedule-insns"
 %endif
-%endif
 %ifarch ppc64le aarch64
 %global optimize_flags "-g -O2"
 %endif
@@ -698,17 +754,30 @@ echo "ac_add_options --with-system-icu" >> .mozconfig
 echo "ac_add_options --without-system-icu" >> .mozconfig
 %endif
 %ifarch s390 s390x
-echo "ac_add_options --disable-ion" >> .mozconfig
+echo "ac_add_options --disable-jit" >> .mozconfig
+%endif
+
+%ifnarch %{ix86}
+%if !0%{?debug_build}
+echo "ac_add_options --disable-debug-symbols" >> .mozconfig
+%endif
 %endif
 
 echo 'export NODEJS="%{_buildrootdir}/bin/node-stdout-nonblocking-wrapper"' >> .mozconfig
 
 # Remove executable bit to make brp-mangle-shebangs happy.
 chmod -x third_party/rust/itertools/src/lib.rs
+chmod a-x third_party/rust/gfx-backend-vulkan/src/*.rs
+chmod a-x third_party/rust/gfx-hal/src/*.rs
+chmod a-x third_party/rust/ash/src/extensions/ext/*.rs
+chmod a-x third_party/rust/ash/src/extensions/khr/*.rs
+chmod a-x third_party/rust/ash/src/extensions/mvk/*.rs
+chmod a-x third_party/rust/ash/src/extensions/nv/*.rs
 
 #---------------------------------------------------------------------
 
 %build
+ulimit -a
 set -e
 # Hack for missing shell when building in brew on RHEL6
 %if 0%{?rhel} == 6
@@ -744,6 +813,7 @@ function build_bundled_package() {
   PACKAGE_RPM=$1
   PACKAGE_FILES=$2
   PACKAGE_SOURCE=$3
+  PACKAGE_BUILD_OPTIONS=$4
   export PACKAGE_DIR="%{_topdir}/RPMS"
 
   PACKAGE_ALREADY_BUILD=0
@@ -757,7 +827,7 @@ function build_bundled_package() {
   %endif
   if [ $PACKAGE_ALREADY_BUILD == 0 ]; then
     echo "Rebuilding $PACKAGE_RPM from $PACKAGE_SOURCE"; echo "==============================="
-    rpmbuild --nodeps --rebuild $PACKAGE_SOURCE
+    rpmbuild --nodeps $PACKAGE_BUILD_OPTIONS --rebuild $PACKAGE_SOURCE
   fi
 
   if [ ! -f $PACKAGE_DIR/$PACKAGE_RPM ]; then
@@ -771,6 +841,7 @@ function build_bundled_package() {
   pushd $PACKAGE_DIR
 
   echo "Installing $PACKAGE_DIR/$PACKAGE_RPM"; echo "==============================="
+  pwd
   PACKAGE_LIST=$(echo $PACKAGE_DIR/$PACKAGE_RPM | tr " " "\n")
   for PACKAGE in $PACKAGE_LIST
   do
@@ -792,10 +863,54 @@ function build_bundled_package() {
 
 # Build and install local yasm if needed
 # ======================================
-%if %{use_bundled_yasm}
+%if 0%{?use_bundled_yasm}
   build_bundled_package 'yasm-1*.rpm' 'yasm-*.rpm' '%{SOURCE301}'
 %endif
 
+%if 0%{?bundle_nss}
+   rpm -ivh %{SOURCE402}
+   rpmbuild --nodeps --define '_prefix %{gtk3_install_path}' --without=tests -ba %{_specdir}/nspr.spec
+   pushd %{_buildrootdir}
+   install_rpms_to_current_dir nspr-4-*.rpm
+   install_rpms_to_current_dir nspr-devel*.rpm
+   popd
+   #FIXME needs nspr install location and flags
+   echo "Setting nspr flags"
+   # nss-setup-flags-env.inc
+   sed -i 's@%{gtk3_install_path}@%{_buildrootdir}%{gtk3_install_path}@g' %{_buildrootdir}%{gtk3_install_path}/%{_lib}/pkgconfig/nspr*.pc
+
+   export LDFLAGS="-L%{_buildrootdir}%{gtk3_install_path}/%{_lib} $LDFLAGS"
+   export LDFLAGS="-Wl,-rpath,%{gtk3_install_path}/%{_lib} $LDFLAGS"
+   export LDFLAGS="-Wl,-rpath-link,%{_buildrootdir}%{gtk3_install_path}/%{_lib} $LDFLAGS"
+   export PKG_CONFIG_PATH=%{_buildrootdir}%{gtk3_install_path}/%{_lib}/pkgconfig
+   export PATH="{_buildrootdir}%{gtk3_install_path}/bin:$PATH"
+
+   #%include_file %{SOURCE401}
+   export PATH=%{_buildrootdir}/%{gtk3_install_path}/bin:$PATH
+   echo $PKG_CONFIG_PATH
+
+   rpm -ivh %{SOURCE400}
+   rpmbuild --nodeps --define '_prefix %{gtk3_install_path}' --without=tests -ba %{_specdir}/nss.spec
+   pushd %{_buildrootdir}
+   #cleanup
+   #rm -rf {_buildrootdir}/usr/lib/debug/*
+   #rm -rf {_buildrootdir}/usr/lib/.build-id
+   #install_rpms_to_current_dir nss-%{gtk3_nvr}*.rpm
+   #install_rpms_to_current_dir nss-devel-%{gtk3_nvr}*.rpm
+   install_rpms_to_current_dir nss-3*.rpm
+   install_rpms_to_current_dir nss-devel*.rpm
+   install_rpms_to_current_dir nss-pkcs11-devel*.rpm
+   install_rpms_to_current_dir nss-softokn-3*.rpm
+   install_rpms_to_current_dir nss-softokn-devel*.rpm
+   install_rpms_to_current_dir nss-softokn-freebl-3*.rpm
+   install_rpms_to_current_dir nss-softokn-freebl-devel*.rpm
+   install_rpms_to_current_dir nss-util-3*.rpm
+   install_rpms_to_current_dir nss-util-devel*.rpm
+   popd
+  %filter_provides_in %{gtk3_install_path}/%{_lib}
+  %filter_requires_in %{gtk3_install_path}/%{_lib}
+%endif
+
 %if 0%{?bundle_gtk3}
    %if ! 0%{?avoid_bundled_rebuild}
     rpm -ivh %{SOURCE200}
@@ -833,9 +948,11 @@ function build_bundled_package() {
 %endif
 %if 0%{?use_bundled_python_2}
     pushd %{_builddir}/python2/Python-%{bundled_python_version_2}
-    ./configure --prefix="%{_buildrootdir}" --exec-prefix="%{_buildrootdir}" --libdir="%{_buildrootdir}/lib"
+    ./configure --prefix="%{_buildrootdir}" --exec-prefix="%{_buildrootdir}" --libdir="%{_buildrootdir}/lib" || cat config.log
     make %{?_smp_mflags} install V=1
-    popd
+    which python2
+    which python
+    popd    
 %endif
 
 function replace_prefix() {
@@ -884,7 +1001,7 @@ source scl_source enable rust-toolset-%{rust_toolset_version}
 # Build and install local node if needed
 # ======================================
 %if %{use_bundled_nodejs}
-  build_bundled_package 'nodejs-8*.rpm' 'nodejs-*.rpm' %{SOURCE304}
+  build_bundled_package 'nodejs-10*.rpm' 'nodejs-*.rpm npm-*.rpm' %{SOURCE304} "--with bootstrap"
   export MOZ_NODEJS=$PACKAGE_DIR/usr/bin/node
 %else
   export MOZ_NODEJS=/usr/bin/node
@@ -920,6 +1037,9 @@ case "%{sqlite_build_version}" in
 esac
 %endif
 
+# debug missing sqlite3 python module
+./mach python -c "import sys;print(sys.path)"
+
 %if 0%{?big_endian}
 echo "Generate big endian version of config/external/icu/data/icud64l.dat"
  ./mach python intl/icu_sources_data.py .
@@ -931,6 +1051,7 @@ echo "Generate big endian version of config/external/icu/data/icud64l.dat"
 
 mkdir %{_buildrootdir}/bin || :
 cp %{SOURCE28} %{_buildrootdir}/bin || :
+chmod +x %{_buildrootdir}/bin/node-stdout-nonblocking-wrapper
 
 # Update the various config.guess to upstream release for aarch64 support
 find ./ -name config.guess -exec cp /usr/lib/rpm/config.guess {} ';'
@@ -967,21 +1088,20 @@ MOZ_OPT_FLAGS=$(echo "$MOZ_OPT_FLAGS" | %{__sed} -e 's/-g/-g1/')
 # (OOM when linking, rhbz#1238225)
 export MOZ_DEBUG_FLAGS=" "
 %endif
-%ifarch %{arm}
-%if %{defined el8}
-MOZ_OPT_FLAGS=$(echo "$MOZ_OPT_FLAGS" | %{__sed} -e 's/-g/-g0/')
-export MOZ_DEBUG_FLAGS=" "
-%endif
-%endif
+
+# We don't wantfirefox to use CK_GCM_PARAMS_V3 in nss
+MOZ_OPT_FLAGS="$MOZ_OPT_FLAGS -DNSS_PKCS11_3_0_STRICT"
+
 %ifarch s390 %{arm} ppc aarch64 i686
 MOZ_LINK_FLAGS="-Wl,--no-keep-memory -Wl,--reduce-memory-overheads"
 %endif
-%ifarch %{arm}
-export RUSTFLAGS="-Cdebuginfo=0"
-%if %{defined el8}
-MOZ_LINK_FLAGS="-Wl,--no-keep-memory"
+%ifarch %{arm} i686
+MOZ_LINK_FLAGS="-Wl,--no-keep-memory -Wl,--strip-debug"
 echo "ac_add_options --enable-linker=gold" >> .mozconfig
 %endif
+
+%ifarch %{arm} i686
+export RUSTFLAGS="-Cdebuginfo=0"
 %endif
 export CFLAGS=$MOZ_OPT_FLAGS
 export CXXFLAGS=$MOZ_OPT_FLAGS
@@ -1004,18 +1124,46 @@ MOZ_SMP_FLAGS=-j1
      RPM_BUILD_NCPUS="`/usr/bin/getconf _NPROCESSORS_ONLN`"
 [ "$RPM_BUILD_NCPUS" -ge 2 ] && MOZ_SMP_FLAGS=-j2
 [ "$RPM_BUILD_NCPUS" -ge 4 ] && MOZ_SMP_FLAGS=-j4
-[ "$RPM_BUILD_NCPUS" -ge 8 ] && MOZ_SMP_FLAGS=-j8
+[ "$RPM_BUILD_NCPUS" -ge 8 ] && MOZ_SMP_FLAGS=-j4
 %endif
 %endif
+#FIXME workaround for oom
+
+# Free memory in kB
+
+MEM_AVAILABLE=$(grep MemAvailable /proc/meminfo | awk '{ print $2 }')
+
+# Usually the compiler processes can take 2 GB of memory at peaks
+TASK_SIZE=4000000
+MEM_CONSTRAINED_JOBS=$(( MEM_AVAILABLE / TASK_SIZE ))
+CPU_AVAILABLE=$(/usr/bin/getconf _NPROCESSORS_ONLN)
+# Pick the minimum from available CPUs or memory constrained number of jobs
+MOZ_SMP_FLAGS=-j$([ "$CPU_AVAILABLE" -le "$MEM_CONSTRAINED_JOBS" ] && echo "$CPU_AVAILABLE" || echo "$MEM_CONSTRAINED_JOBS")
 
 %if 0%{?bundle_gtk3}
 # gtk3-private-setup-flags-env.inc
 %include_file %{SOURCE205}
 %endif
 
+%if 0%{?bundle_nss}
+echo "Setting nss flags"
+# nss-setup-flags-env.inc
+%include_file %{SOURCE401}
+export PATH=%{_buildrootdir}/%{gtk3_install_path}/bin:$PATH
+echo $PKG_CONFIG_PATH
+%endif
+
 export MOZ_MAKE_FLAGS="$MOZ_SMP_FLAGS"
 export MOZ_SERVICES_SYNC="1"
+# we need to strip the sources on i686 because to we don't use rpm to generate debugsymbols because of oom
+%ifnarch i686
 export STRIP=/bin/true
+%endif
+which node
+echo 'export NODEJS="%{_buildrootdir}/bin/node-stdout-nonblocking-wrapper"'
+env
+ls %{_buildrootdir}
+
 ./mach build -v
 
 # create debuginfo for crash-stats.mozilla.com
@@ -1061,7 +1209,6 @@ rm -f  objdir/dist/bin/pk12util
 export SHELL=/bin/sh
 %endif
 
-%if 0%{?bundle_gtk3}
 function install_rpms_to_current_dir() {
     PACKAGE_RPM=$(eval echo $1)
     PACKAGE_DIR=%{_rpmdir}
@@ -1082,6 +1229,7 @@ function install_rpms_to_current_dir() {
      done
 }
 
+%if 0%{?bundle_gtk3}
 pushd %{buildroot}
 # Install gtk3-private again to the buildroot, but without devel subpackage
 install_rpms_to_current_dir gtk3-private-%{gtk3_nvr}*.rpm
@@ -1089,6 +1237,29 @@ install_rpms_to_current_dir gtk3-private-rpm-scripts-%{gtk3_nvr}*.rpm
 popd
 %endif
 
+%if 0%{?bundle_nss}
+  pushd %{buildroot}
+  #install_rpms_to_current_dir nss-*.rpm
+  install_rpms_to_current_dir nspr-4*.rpm
+  install_rpms_to_current_dir nss-3*.rpm
+  install_rpms_to_current_dir nss-softokn-3*.rpm
+  install_rpms_to_current_dir nss-softokn-freebl-3*.rpm
+  install_rpms_to_current_dir nss-util-3*.rpm
+ 
+  # cleanup unecessary nss files
+  #rm -rf %{_buildrootdir}/%{gtk3_install_path}/bin
+  #rm -rf %{_buildrootdir}/%{gtk3_install_path}/include
+  rm -rf %{buildroot}/%{gtk3_install_path}/lib/dracut
+  rm -rf %{buildroot}/%{gtk3_install_path}/%{_lib}/nss
+  #rm -rf %{_buildrootdir}/%{gtk3_install_path}/%{_lib}/pkgconfig
+  rm -rf %{buildroot}/%{gtk3_install_path}/%{_lib}/share
+  rm -rf %{buildroot}/%{gtk3_install_path}/share
+  rm -rf %{buildroot}/etc/pki
+  rm -rf %{buildroot}/usr/lib/.build-id
+  rm -rf %{buildroot}/etc/crypto-policies
+  popd
+%endif
+
 # Install bundled libffi
 %if %{use_bundled_ffi}
   pushd %{buildroot}
@@ -1301,6 +1472,10 @@ rm -rf %{_srcrpmdir}/libffi*.src.rpm
 find %{_rpmdir} -name "libffi*.rpm" -delete
 rm -rf %{_srcrpmdir}/openssl*.src.rpm
 find %{_rpmdir} -name "openssl*.rpm" -delete
+rm -rf %{_srcrpmdir}/nss*.src.rpm
+find %{_rpmdir} -name "nss*.rpm" -delete
+rm -rf %{_srcrpmdir}/nspr*.src.rpm
+find %{_rpmdir} -name "nspr*.rpm" -delete
 
 %post
 update-desktop-database &> /dev/null || :
@@ -1342,17 +1517,14 @@ gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || :
 %dir %{mozappdir}
 %doc %{mozappdir}/LICENSE
 %{mozappdir}/browser/chrome
-%{mozappdir}/browser/chrome.manifest
 %{mozappdir}/defaults/preferences/*
 %{mozappdir}/browser/defaults/preferences
 %{mozappdir}/browser/features/*.xpi
 %{mozappdir}/distribution/distribution.ini
-%attr(644, root, root) %{mozappdir}/browser/blocklist.xml
-%if %{build_langpacks}
-%dir %{langpackdir}
-%endif
+#%if %{build_langpacks}
+#%dir %{langpackdir}
+#%endif
 %{mozappdir}/browser/omni.ja
-%{mozappdir}/chrome.manifest
 %{mozappdir}/run-mozilla.sh
 %{mozappdir}/application.ini
 %{mozappdir}/pingsender
@@ -1381,13 +1553,7 @@ gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || :
 %{mozappdir}/plugin-container
 %{mozappdir}/gmp-clearkey
 %{mozappdir}/fonts/*.ttf
-%if !%{?system_libicu}
-#%{mozappdir}/icudt*.dat
-%endif
 %if !%{?system_nss}
-%{mozappdir}/libfreeblpriv3.chk
-%{mozappdir}/libnssdbm3.chk
-%{mozappdir}/libsoftokn3.chk
 %exclude %{mozappdir}/libnssckbi.so
 %endif
 %if 0%{use_bundled_ffi}
@@ -1400,10 +1566,32 @@ gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || :
 %include_file %{SOURCE204}
 %endif
 
+%if 0%{?bundle_nss}
+%{mozappdir}/bundled/%{_lib}/libfreebl*
+%{mozappdir}/bundled/%{_lib}/libnss3*
+%{mozappdir}/bundled/%{_lib}/libnssdbm3*
+%{mozappdir}/bundled/%{_lib}/libnssutil3*
+%{mozappdir}/bundled/%{_lib}/libsmime3*
+%{mozappdir}/bundled/%{_lib}/libsoftokn*
+%{mozappdir}/bundled/%{_lib}/libssl3*
+%{mozappdir}/bundled/%{_lib}/libnspr4.so
+%{mozappdir}/bundled/%{_lib}/libplc4.so
+%{mozappdir}/bundled/%{_lib}/libplds4.so
+%endif
+
 
 #---------------------------------------------------------------------
 
 %changelog
+* Tue Aug 18 2020 Jan Horak <jhorak@redhat.com> - 78.2.0-2
+- Update to 78.2.0 build1
+
+* Fri Jul 24 2020 Jan Horak <jhorak@redhat.com>
+- Update to 68.11.0 build1
+
+* Fri Jun 26 2020 Jan Horak <jhorak@redhat.com>
+- Update to 68.10.0 build1
+
 * Fri May 29 2020 Jan Horak <jhorak@redhat.com>
 - Update to 68.9.0 build1
 - Added patch for pipewire 0.3