From 6930f277769566f642d19c3bbc45028b54fa1e27 Mon Sep 17 00:00:00 2001 From: Jakub Bogusz Date: Sat, 10 Oct 2020 07:26:50 +0200 Subject: [PATCH] - started update to 2.53.4 - updated pld-branging,enable-addons,system-virtualenv patches - removed agent patch (no longer applicable, there is no vendor part of UA now) - removed obsolete glibc2.30,crmf,mozilla-1389436 patches - added sysctl,mozilla-revert-1332139 patches from Fedora --- mozilla-1389436.patch | 31 --- seamonkey-agent.patch | 13 -- seamonkey-crmf.patch | 13 -- seamonkey-enable-addons.patch | 23 +- seamonkey-glibc2.30.patch | 17 -- seamonkey-mozilla-revert-1332139.patch | 307 +++++++++++++++++++++++++ seamonkey-pld-branding.patch | 8 +- seamonkey-sysctl.patch | 12 + seamonkey-system-virtualenv.patch | 12 +- seamonkey.spec | 257 ++++++++++++--------- 10 files changed, 487 insertions(+), 206 deletions(-) delete mode 100644 mozilla-1389436.patch delete mode 100644 seamonkey-agent.patch delete mode 100644 seamonkey-crmf.patch delete mode 100644 seamonkey-glibc2.30.patch create mode 100644 seamonkey-mozilla-revert-1332139.patch create mode 100644 seamonkey-sysctl.patch diff --git a/mozilla-1389436.patch b/mozilla-1389436.patch deleted file mode 100644 index af4f7cf..0000000 --- a/mozilla-1389436.patch +++ /dev/null @@ -1,31 +0,0 @@ - -# HG changeset patch -# User Mike Hommey -# Date 1502455819 -32400 -# Node ID 97dae871389b7f22a7096a020781b07a5a61de58 -# Parent c73f64ef71d2d87f36008f5ff661f4050692bd06 -Bug 1389436 - Explicitly instantiate gfxFont::GetShapedWord for its use in gfxTextRun.cpp. r=jfkthame - -diff --git a/mozilla/gfx/thebes/gfxFont.cpp b/mozilla/gfx/thebes/gfxFont.cpp -index d0b747f..8d3dd8b 100644 ---- a/mozilla/gfx/thebes/gfxFont.cpp -+++ b/mozilla/gfx/thebes/gfxFont.cpp -@@ -2614,6 +2614,18 @@ gfxFont::GetShapedWord(DrawTarget *aDrawTarget, - return sw; - } - -+template gfxShapedWord* -+gfxFont::GetShapedWord(DrawTarget *aDrawTarget, -+ const uint8_t *aText, -+ uint32_t aLength, -+ uint32_t aHash, -+ Script aRunScript, -+ bool aVertical, -+ int32_t aAppUnitsPerDevUnit, -+ uint32_t aFlags, -+ gfxTextPerfMetrics *aTextPerf); -+ -+ - bool - gfxFont::CacheHashEntry::KeyEquals(const KeyTypePointer aKey) const - { diff --git a/seamonkey-agent.patch b/seamonkey-agent.patch deleted file mode 100644 index 9b510f7..0000000 --- a/seamonkey-agent.patch +++ /dev/null @@ -1,13 +0,0 @@ ---- mozilla/suite/browser/browser-prefs.js.orig 2007-03-21 23:39:25.000000000 +0100 -+++ mozilla/suite/browser/browser-prefs.js 2007-03-21 23:39:10.000000000 +0100 -@@ -61,6 +61,10 @@ - pref("general.useragent.override.natweststockbrokers.com", "Gecko/[^ ]*#Gecko/20100101"); // bug 804179 - pref("general.useragent.override.raiffeisen.hu", "Gecko/[^ ]*#Gecko/20100101"); // bug 795348 - -+pref("general.useragent.vendor", "PLD"); -+pref("general.useragent.vendorSub", "3.0"); -+pref("general.useragent.vendorComment", "Th"); -+ - // 0 = blank, 1 = home (browser.startup.homepage), 2 = last visited page, 3 = resume previous browser session - pref("browser.startup.page", 1); - pref("browser.startup.homepage", "chrome://navigator-region/locale/region.properties"); diff --git a/seamonkey-crmf.patch b/seamonkey-crmf.patch deleted file mode 100644 index d147309..0000000 --- a/seamonkey-crmf.patch +++ /dev/null @@ -1,13 +0,0 @@ ---- seamonkey-2.49.5/mozilla/security/manager/ssl/moz.build.orig 2019-05-06 19:30:52.000000000 +0200 -+++ seamonkey-2.49.5/mozilla/security/manager/ssl/moz.build 2019-11-18 20:33:18.008087191 +0100 -@@ -184,10 +184,6 @@ - - DEFINES['CERT_AddTempCertToPerm'] = '__CERT_AddTempCertToPerm' - --USE_LIBS += [ -- 'crmf', --] -- - include('/ipc/chromium/chromium-config.mozbuild') - - if CONFIG['GNU_CXX']: diff --git a/seamonkey-enable-addons.patch b/seamonkey-enable-addons.patch index 58db926..315b86e 100644 --- a/seamonkey-enable-addons.patch +++ b/seamonkey-enable-addons.patch @@ -9,25 +9,14 @@ // Preferences for AMO integration pref("extensions.getAddons.cache.enabled", true); ---- seamonkey-2.26/suite/browser/browser-prefs.js~ 2013-11-06 19:54:38.789734061 +0100 -+++ seamonkey-2.26/suite/browser/browser-prefs.js 2013-11-06 20:55:33.765611935 +0100 -@@ -616,7 +616,7 @@ +--- seamonkey-2.53.4/suite/app/profile/suite-prefs.js.orig 2020-08-10 13:28:35.000000000 +0200 ++++ seamonkey-2.53.4/suite/app/profile/suite-prefs.js 2020-10-09 07:09:53.453582063 +0200 +@@ -581,7 +581,7 @@ // Disable add-ons installed into the shared user and shared system areas by // default. This does not include the application directory. See the SCOPE - // constants in AddonManager.jsm for values to use here. --pref("extensions.autoDisableScopes", 15); -+pref("extensions.autoDisableScopes", 3); - - // Preferences for AMO integration - pref("extensions.getAddons.cache.enabled", true); // also toggles personalized recommendations ---- seamonkey-2.26/mozilla/browser/app/profile/firefox.js~ 2013-10-29 02:20:40.000000000 +0100 -+++ seamonkey-2.26/mozilla/browser/app/profile/firefox.js 2013-11-06 20:56:58.633092070 +0100 -@@ -62,7 +62,7 @@ - - // Disable add-ons that are not installed by the user in all scopes by default. - // See the SCOPE constants in AddonManager.jsm for values to use here. + // constants in AddonManager.jsm for values to use here -pref("extensions.autoDisableScopes", 15); +pref("extensions.autoDisableScopes", 3); - // Dictionary download preference - pref("browser.dictionaries.download.url", "https://addons.mozilla.org/%LOCALE%/firefox/dictionaries/"); + // Enable add-ons installed and owned by the application, like the default theme. + pref("extensions.startupScanScopes", 4); diff --git a/seamonkey-glibc2.30.patch b/seamonkey-glibc2.30.patch deleted file mode 100644 index 205cb34..0000000 --- a/seamonkey-glibc2.30.patch +++ /dev/null @@ -1,17 +0,0 @@ ---- seamonkey-2.49.4/mozilla/tools/profiler/core/platform.h~ 2018-07-12 04:19:15.000000000 +0200 -+++ seamonkey-2.49.4/mozilla/tools/profiler/core/platform.h 2019-10-10 14:38:34.367540687 +0200 -@@ -65,12 +65,14 @@ - #include - #if !defined(__BIONIC__) - #include -+#if defined(__GLIBC__) && ! __GLIBC_PREREQ(2, 30) - static inline pid_t gettid() - { - return (pid_t) syscall(SYS_gettid); - } - #endif - #endif -+#endif - - #ifdef XP_WIN - #include diff --git a/seamonkey-mozilla-revert-1332139.patch b/seamonkey-mozilla-revert-1332139.patch new file mode 100644 index 0000000..f4ec86b --- /dev/null +++ b/seamonkey-mozilla-revert-1332139.patch @@ -0,0 +1,307 @@ +diff -Nrup -U 8 a/media/webrtc/trunk/webrtc/modules/video_coding/codecs/vp9/vp9_impl.cc b/media/webrtc/trunk/webrtc/modules/video_coding/codecs/vp9/vp9_impl.cc +--- a/media/webrtc/trunk/webrtc/modules/video_coding/codecs/vp9/vp9_impl.cc 2020-02-18 02:37:58.000000000 +0300 ++++ b/media/webrtc/trunk/webrtc/modules/video_coding/codecs/vp9/vp9_impl.cc 2020-03-02 00:34:19.000000000 +0300 +@@ -79,17 +79,19 @@ VP9EncoderImpl::VP9EncoderImpl() + num_temporal_layers_(0), + num_spatial_layers_(0), + num_cores_(0), + is_flexible_mode_(false), + frames_encoded_(0), + // Use two spatial when screensharing with flexible mode. + spatial_layer_(new ScreenshareLayersVP9(2)) { + memset(&codec_, 0, sizeof(codec_)); ++#ifdef LIBVPX_SVC + memset(&svc_params_, 0, sizeof(vpx_svc_extra_cfg_t)); ++#endif + uint32_t seed = rtc::Time32(); + srand(seed); + } + + VP9EncoderImpl::~VP9EncoderImpl() { + Release(); + } + +@@ -115,55 +117,66 @@ int VP9EncoderImpl::Release() { + } + inited_ = false; + return WEBRTC_VIDEO_CODEC_OK; + } + + bool VP9EncoderImpl::ExplicitlyConfiguredSpatialLayers() const { + // We check target_bitrate_bps of the 0th layer to see if the spatial layers + // (i.e. bitrates) were explicitly configured. ++#ifdef LIBVPX_SVC + return num_spatial_layers_ > 1 && + codec_.spatialLayers[0].target_bitrate_bps > 0; ++#else ++ return false; ++#endif + } + + bool VP9EncoderImpl::SetSvcRates() { + uint8_t i = 0; + + if (ExplicitlyConfiguredSpatialLayers()) { ++#ifdef LIBVPX_SVC + if (num_temporal_layers_ > 1) { + LOG(LS_ERROR) << "Multiple temporal layers when manually specifying " + "spatial layers not implemented yet!"; + return false; + } + int total_bitrate_bps = 0; + for (i = 0; i < num_spatial_layers_; ++i) + total_bitrate_bps += codec_.spatialLayers[i].target_bitrate_bps; + // If total bitrate differs now from what has been specified at the + // beginning, update the bitrates in the same ratio as before. + for (i = 0; i < num_spatial_layers_; ++i) { + config_->ss_target_bitrate[i] = config_->layer_target_bitrate[i] = + static_cast(static_cast(config_->rc_target_bitrate) * + codec_.spatialLayers[i].target_bitrate_bps / + total_bitrate_bps); + } ++#endif + } else { + float rate_ratio[VPX_MAX_LAYERS] = {0}; + float total = 0; + ++#ifdef LIBVPX_SVC + for (i = 0; i < num_spatial_layers_; ++i) { + if (svc_params_.scaling_factor_num[i] <= 0 || + svc_params_.scaling_factor_den[i] <= 0) { + LOG(LS_ERROR) << "Scaling factors not specified!"; + return false; + } + rate_ratio[i] = + static_cast(svc_params_.scaling_factor_num[i]) / + svc_params_.scaling_factor_den[i]; + total += rate_ratio[i]; + } ++#else ++ rate_ratio[0] = 1; ++ total = 1; ++#endif + + for (i = 0; i < num_spatial_layers_; ++i) { + config_->ss_target_bitrate[i] = static_cast( + config_->rc_target_bitrate * rate_ratio[i] / total); + if (num_temporal_layers_ == 1) { + config_->layer_target_bitrate[i] = config_->ss_target_bitrate[i]; + } else if (num_temporal_layers_ == 2) { + config_->layer_target_bitrate[i * num_temporal_layers_] = +@@ -390,16 +403,17 @@ int VP9EncoderImpl::NumberOfThreads(int + return 2; + } else { + // 1 thread less than VGA. + return 1; + } + } + + int VP9EncoderImpl::InitAndSetControlSettings(const VideoCodec* inst) { ++#ifdef LIBVPX_SVC + // Set QP-min/max per spatial and temporal layer. + int tot_num_layers = num_spatial_layers_ * num_temporal_layers_; + for (int i = 0; i < tot_num_layers; ++i) { + svc_params_.max_quantizers[i] = config_->rc_max_quantizer; + svc_params_.min_quantizers[i] = config_->rc_min_quantizer; + } + config_->ss_number_layers = num_spatial_layers_; + if (ExplicitlyConfiguredSpatialLayers()) { +@@ -413,37 +427,41 @@ int VP9EncoderImpl::InitAndSetControlSet + for (int i = num_spatial_layers_ - 1; i >= 0; --i) { + // 1:2 scaling in each dimension. + svc_params_.scaling_factor_num[i] = scaling_factor_num; + svc_params_.scaling_factor_den[i] = 256; + if (codec_.mode != kScreensharing) + scaling_factor_num /= 2; + } + } ++#endif + + if (!SetSvcRates()) { + return WEBRTC_VIDEO_CODEC_ERR_PARAMETER; + } + + if (vpx_codec_enc_init(encoder_, vpx_codec_vp9_cx(), config_, 0)) { + return WEBRTC_VIDEO_CODEC_UNINITIALIZED; + } + vpx_codec_control(encoder_, VP8E_SET_CPUUSED, cpu_speed_); + vpx_codec_control(encoder_, VP8E_SET_MAX_INTRA_BITRATE_PCT, + rc_max_intra_target_); + vpx_codec_control(encoder_, VP9E_SET_AQ_MODE, + inst->VP9().adaptiveQpMode ? 3 : 0); + ++#ifdef LIBVPX_SVC + vpx_codec_control( + encoder_, VP9E_SET_SVC, + (num_temporal_layers_ > 1 || num_spatial_layers_ > 1) ? 1 : 0); + if (num_temporal_layers_ > 1 || num_spatial_layers_ > 1) { + vpx_codec_control(encoder_, VP9E_SET_SVC_PARAMETERS, + &svc_params_); + } ++#endif ++ + // Register callback for getting each spatial layer. + vpx_codec_priv_output_cx_pkt_cb_pair_t cbp = { + VP9EncoderImpl::EncoderOutputCodedPacketCallback, + reinterpret_cast(this)}; + vpx_codec_control(encoder_, VP9E_REGISTER_CX_CALLBACK, + reinterpret_cast(&cbp)); + + // Control function to set the number of column tiles in encoding a frame, in +@@ -527,16 +545,17 @@ int VP9EncoderImpl::Encode(const VideoFr + + vpx_enc_frame_flags_t flags = 0; + bool send_keyframe = (frame_type == kVideoFrameKey); + if (send_keyframe) { + // Key frame request from caller. + flags = VPX_EFLAG_FORCE_KF; + } + ++#ifdef LIBVPX_SVC + if (is_flexible_mode_) { + SuperFrameRefSettings settings; + + // These structs are copied when calling vpx_codec_control, + // therefore it is ok for them to go out of scope. + vpx_svc_ref_frame_config enc_layer_conf; + vpx_svc_layer_id layer_id; + +@@ -548,16 +567,17 @@ int VP9EncoderImpl::Encode(const VideoFr + send_keyframe); + } + enc_layer_conf = GenerateRefsAndFlags(settings); + layer_id.temporal_layer_id = 0; + layer_id.spatial_layer_id = settings.start_layer; + vpx_codec_control(encoder_, VP9E_SET_SVC_LAYER_ID, &layer_id); + vpx_codec_control(encoder_, VP9E_SET_SVC_REF_FRAME_CONFIG, &enc_layer_conf); + } ++#endif + + assert(codec_.maxFramerate > 0); + uint32_t duration = 90000 / codec_.maxFramerate; + if (vpx_codec_encode(encoder_, raw_, timestamp_, duration, flags, + VPX_DL_REALTIME)) { + return WEBRTC_VIDEO_CODEC_ERROR; + } + timestamp_ += duration; +@@ -686,29 +706,31 @@ void VP9EncoderImpl::PopulateCodecSpecif + vp9_info->p_diff[i] = p_diff_[layer_id.spatial_layer_id][i]; + } + } else { + vp9_info->gof_idx = + static_cast(frames_since_kf_ % gof_.num_frames_in_gof); + vp9_info->temporal_up_switch = gof_.temporal_up_switch[vp9_info->gof_idx]; + } + ++#ifdef LIBVPX_SVC + if (vp9_info->ss_data_available) { + vp9_info->spatial_layer_resolution_present = true; + for (size_t i = 0; i < vp9_info->num_spatial_layers; ++i) { + vp9_info->width[i] = codec_.width * + svc_params_.scaling_factor_num[i] / + svc_params_.scaling_factor_den[i]; + vp9_info->height[i] = codec_.height * + svc_params_.scaling_factor_num[i] / + svc_params_.scaling_factor_den[i]; + } +- if (!vp9_info->flexible_mode) { +- vp9_info->gof.CopyGofInfoVP9(gof_); +- } ++ } ++#endif ++ if (!vp9_info->flexible_mode) { ++ vp9_info->gof.CopyGofInfoVP9(gof_); + } + } + + int VP9EncoderImpl::GetEncodedLayerFrame(const vpx_codec_cx_pkt* pkt) { + RTC_DCHECK_EQ(pkt->kind, VPX_CODEC_CX_FRAME_PKT); + + if (pkt->data.frame.sz > encoded_image_._size) { + delete[] encoded_image_._buffer; +@@ -756,16 +778,17 @@ int VP9EncoderImpl::GetEncodedLayerFrame + vpx_codec_control(encoder_, VP8E_GET_LAST_QUANTIZER, &qp); + encoded_image_.qp_ = qp; + encoded_complete_callback_->OnEncodedImage(encoded_image_, &codec_specific, + &frag_info); + } + return WEBRTC_VIDEO_CODEC_OK; + } + ++#ifdef LIBVPX_SVC + vpx_svc_ref_frame_config VP9EncoderImpl::GenerateRefsAndFlags( + const SuperFrameRefSettings& settings) { + static const vpx_enc_frame_flags_t kAllFlags = + VP8_EFLAG_NO_REF_ARF | VP8_EFLAG_NO_REF_GF | VP8_EFLAG_NO_REF_LAST | + VP8_EFLAG_NO_UPD_LAST | VP8_EFLAG_NO_UPD_ARF | VP8_EFLAG_NO_UPD_GF; + vpx_svc_ref_frame_config sf_conf = {}; + if (settings.is_keyframe) { + // Used later on to make sure we don't make any invalid references. +@@ -857,16 +880,17 @@ vpx_svc_ref_frame_config VP9EncoderImpl: + buffer_updated_at_frame_[updated_buffer] = frames_encoded_; + sf_conf.frame_flags[layer_idx] = layer_flags; + } + } + } + ++frames_encoded_; + return sf_conf; + } ++#endif + + int VP9EncoderImpl::SetChannelParameters(uint32_t packet_loss, int64_t rtt) { + return WEBRTC_VIDEO_CODEC_OK; + } + + int VP9EncoderImpl::RegisterEncodeCompleteCallback( + EncodedImageCallback* callback) { + encoded_complete_callback_ = callback; +diff -Nrup -U 8 a/media/webrtc/trunk/webrtc/modules/video_coding/codecs/vp9/vp9_impl.h b/media/webrtc/trunk/webrtc/modules/video_coding/codecs/vp9/vp9_impl.h +--- a/media/webrtc/trunk/webrtc/modules/video_coding/codecs/vp9/vp9_impl.h 2020-02-18 02:37:58.000000000 +0300 ++++ b/media/webrtc/trunk/webrtc/modules/video_coding/codecs/vp9/vp9_impl.h 2020-03-02 00:32:05.000000000 +0300 +@@ -77,24 +77,26 @@ class VP9EncoderImpl : public VP9Encoder + + void PopulateCodecSpecific(CodecSpecificInfo* codec_specific, + const vpx_codec_cx_pkt& pkt, + uint32_t timestamp); + + bool ExplicitlyConfiguredSpatialLayers() const; + bool SetSvcRates(); + ++#ifdef LIBVPX_SVC + // Used for flexible mode to set the flags and buffer references used + // by the encoder. Also calculates the references used by the RTP + // packetizer. + // + // Has to be called for every frame (keyframes included) to update the + // state used to calculate references. + vpx_svc_ref_frame_config GenerateRefsAndFlags( + const SuperFrameRefSettings& settings); ++#endif + + virtual int GetEncodedLayerFrame(const vpx_codec_cx_pkt* pkt); + + // Callback function for outputting packets per spatial layer. + static void EncoderOutputCodedPacketCallback(vpx_codec_cx_pkt* pkt, + void* user_data); + + // Determine maximum target for Intra frames +@@ -111,17 +113,19 @@ class VP9EncoderImpl : public VP9Encoder + bool inited_; + int64_t timestamp_; + uint16_t picture_id_; + int cpu_speed_; + uint32_t rc_max_intra_target_; + vpx_codec_ctx_t* encoder_; + vpx_codec_enc_cfg_t* config_; + vpx_image_t* raw_; ++#ifdef LIBVPX_SVC + vpx_svc_extra_cfg_t svc_params_; ++#endif + const VideoFrame* input_image_; + GofInfoVP9 gof_; // Contains each frame's temporal information for + // non-flexible mode. + uint8_t tl0_pic_idx_; // Only used in non-flexible mode. + size_t frames_since_kf_; + uint8_t num_temporal_layers_; + uint8_t num_spatial_layers_; + uint8_t num_cores_; diff --git a/seamonkey-pld-branding.patch b/seamonkey-pld-branding.patch index 923cf6c..c93dffe 100644 --- a/seamonkey-pld-branding.patch +++ b/seamonkey-pld-branding.patch @@ -1,9 +1,9 @@ ---- seamonkey-2.49.4/mozilla/browser/locales/generic/profile/bookmarks.html.in.orig 2019-04-21 08:06:13.737919258 +0200 -+++ seamonkey-2.49.4/mozilla/browser/locales/generic/profile/bookmarks.html.in 2019-04-21 08:11:52.179419096 +0200 +--- seamonkey-2.53.4/mozilla/browser/locales/generic/profile/bookmarks.html.in.orig 2020-02-18 00:37:47.000000000 +0100 ++++ seamonkey-2.53.4/mozilla/browser/locales/generic/profile/bookmarks.html.in 2020-10-08 21:07:26.482740347 +0200 @@ -16,6 +16,8 @@ #define mdn_icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA3XAAAN1wFCKJt4AAACYklEQVQ4y3WSTYjNYRTGf+f9/+/NuDN3GKMxt1mYpKR8RT6zEk1iyUo2IysSNspCxEIZRSN07YiUJSWkaUIZizELMzIZlO9h3MzXvf/341jcmTGa69RZvKfnPOc5z3mhQlRd651Ry17tqQQl5uR9ONHC3EtdiPPxWKZ24bhJvQV0OlBHhiV7pTs3WpUdEmeLrnWJAhhOtJA5/3RjqZg8Lrnwy4bQT/DvTb73Qt3N9ymATNvTU15Mvx8vfvTWDrmgT0y+dzuAZM527lM0Xx6jFKvnEKIYvIIqVeMFRCfEiDBWMw9UQUBUT8fBWvmrU9HEUpUWDq2cT23a0P6kQEqEwTFLQCBJpm9mYrV+6lW0ngNr62jb0kw6KvMeXJohZYSLzz9xvOMDJG6aPUKMtZPDObq+iXPbmoG/ooJC0QVaVy2g5AI3Bkq8/jYCkQEBo9ah1hESS1N1Gu9DxXNFRji0oYm+/Stoaa4tK0kcRq1HE4fxHqOKEf4bk16ubphd9iKxGKxFrcOWLB1vvuOCzmg0Irig1MxKMfBznPbOd2DLCmJNHKgSIdzr/kjXhwKbFtVPNQ+NJiw7+YDh0YTFuVr6CwLpaNJDjCYOtR61DldyHL7975c9dqeH4ZESscC7r79BFBI7kY5YrZsCC8qL/kFyR+6yY0UjS3M1PHz5ich71IOIQGSn0cskwdTeryTyfV9+jGzOP3rTQAiIHUNQEBkCeUbkcqguB2JEMGqt4sJlg8lGIsv0+p5dON8YaVgn3veJ85/F61YNtn5uXf3OCF0TQVacP0PiXMVzpfbemlnbna+I/QPSFTsRLd+hHAAAAABJRU5ErkJggg== - #define addon_icon data:image/vndmicrosofticon;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAKoSURBVDiNjZNLaJRnFIaf75vvy2UGTWr8NYkxl0IFUYkNXSSZQNWFWlxIEVy1FLLo0i4adddVXRnS4kJwYxci2GaRTWlSFGKFGRXNmFBF62VMO4TENBdjMv9k5p//Oy4SLzgqHs7yPc95eTlHiQjvqniPbVYRzuBoR+FQDEvId4neIPNCY945DayNVff/8NUvn9XXNJMv5hhKnTvYP3ymHmj/IMBSbmHjjP8fycxv+MEzGqtatUI1vK7R7wM4J32XUv3Li/l5imGBkbtXlsMw/PF1jXozg3iP3aM0Z8XRBFDr1fl7Og9EnTguXx30p/6fjAIozb/i6C4BdB2z6QOfH27ZUFNL0QUELs/tycs4J2zdGEerCADTM1P8df3PxyUZiKPF8zyGHpwGFLC6QCCRuYA4QQQ6mw4hjhYT77GN2qiBWFnV5sXc0xMAgfKx5foVYKURB2vLPbxoM8auODE6ws/fH+77dHtjhxp5OHzywpWf/IIsRk25Rq0CRFY4UVNNndkmqZFRf3YuWaYUS0aE3RP5MXX3/iCOgu3Y1WYfL90sdSDgxRoYTY5mZ2anjwC/AqEBdM4tMJ4dwYs1YiOGSBkYrVHqlQNxoC34OV8BdxK9gQ+guo7bwdYdrXu92nU6nR7Pzc/PSXxfazTj30IpRaWpIqbX4UQoBDkWJlRwLzVeLBTyGs2UcUX5duzvsfPqNpvDovQhnBIdELGaWFk1hclYmLx2fxmFbNm5qXJNvdi2DQ1WAsO1P/5petshyf6v25gJ0nxUUUeiP531s/kvAcor7MDOL2pjz3JzVKpqUoMTpb8QsSqdeTT98fomjyDv8LP5aKI3uAgQP2orCkGAVRVMZxbQhnQJIAzkm3s3Js6GSfkEQEd4+bpa8+TW71P1ANqoB65I93OA2DgV+Z+omgAAAABJRU5ErkJggg== + #define addon_icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAKoSURBVDiNjZNLaJRnFIaf75vvy2UGTWr8NYkxl0IFUYkNXSSZQNWFWlxIEVy1FLLo0i4adddVXRnS4kJwYxci2GaRTWlSFGKFGRXNmFBF62VMO4TENBdjMv9k5p//Oy4SLzgqHs7yPc95eTlHiQjvqniPbVYRzuBoR+FQDEvId4neIPNCY945DayNVff/8NUvn9XXNJMv5hhKnTvYP3ymHmj/IMBSbmHjjP8fycxv+MEzGqtatUI1vK7R7wM4J32XUv3Li/l5imGBkbtXlsMw/PF1jXozg3iP3aM0Z8XRBFDr1fl7Og9EnTguXx30p/6fjAIozb/i6C4BdB2z6QOfH27ZUFNL0QUELs/tycs4J2zdGEerCADTM1P8df3PxyUZiKPF8zyGHpwGFLC6QCCRuYA4QQQ6mw4hjhYT77GN2qiBWFnV5sXc0xMAgfKx5foVYKURB2vLPbxoM8auODE6ws/fH+77dHtjhxp5OHzywpWf/IIsRk25Rq0CRFY4UVNNndkmqZFRf3YuWaYUS0aE3RP5MXX3/iCOgu3Y1WYfL90sdSDgxRoYTY5mZ2anjwC/AqEBdM4tMJ4dwYs1YiOGSBkYrVHqlQNxoC34OV8BdxK9gQ+guo7bwdYdrXu92nU6nR7Pzc/PSXxfazTj30IpRaWpIqbX4UQoBDkWJlRwLzVeLBTyGs2UcUX5duzvsfPqNpvDovQhnBIdELGaWFk1hclYmLx2fxmFbNm5qXJNvdi2DQ1WAsO1P/5petshyf6v25gJ0nxUUUeiP531s/kvAcor7MDOL2pjz3JzVKpqUoMTpb8QsSqdeTT98fomjyDv8LP5aKI3uAgQP2orCkGAVRVMZxbQhnQJIAzkm3s3Js6GSfkEQEd4+bpa8+TW71P1ANqoB65I93OA2DgV+Z+omgAAAABJRU5ErkJggg== + +#define pld_icon data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABHUlEQVQ4jc1SwWqDQBB91pyFpsWLSGklRVHw7CnJLyTpzaMf4Dck5Feay4bc96T4BQkevCTiXc0nTA9lxbIJ2FP7YFh2Zt+bN8MCfw1lyKPmWhNjDACwWq3w9Pjc8UZDBBhj4JxjPB5j97n7UXu4RTjlR2quNYk75xwA0LYtJu8T9GsSNts1KSrIcW3aHxg115oM0yDHtUlRQcuPxX2ywGw+JUUFGaZBaZaQoqKLQQKiq3DSF0iz5L7AKT92RTFKPxzXlsjdEtMsId/3ISzqui41iONYyo2E5eViiSiKEIYhLMui8/l802VZXUjTNOR5Ds/zvhOb7ZrK6iLZ2x8YzeZTMkxDOsWSlbK60OvL26Af2R+3KAoEQfAb2n/FF3KJkR/xf7tGAAAAAElFTkSuQmCC