From fff6c93830d74ece3e8689ccae0118d5dade6515 Mon Sep 17 00:00:00 2001
From: len-odoo
Date: Tue, 20 Nov 2018 13:43:27 +0000
Subject: [PATCH 001/104] [FIX] board: fix the domain of consecutive 'add to
dashboard' operations
Add a search containing a domain to dashboard. Remove that domain.
Do a new search with a different domain.
Add that search to dashboard;
the domain sent would be the concatenation of the two domains.
We make it so that only the last domain is sent, with a test.
opw 1907650
closes odoo/odoo#28843
---
addons/board/static/src/js/favorite_menu.js | 2 +-
addons/board/static/tests/dashboard_tests.js | 58 ++++++++++++++++++++
2 files changed, 59 insertions(+), 1 deletion(-)
diff --git a/addons/board/static/src/js/favorite_menu.js b/addons/board/static/src/js/favorite_menu.js
index cdb531914c9..a3040af44f0 100644
--- a/addons/board/static/src/js/favorite_menu.js
+++ b/addons/board/static/src/js/favorite_menu.js
@@ -56,7 +56,7 @@ FavoriteMenu.include({
var self = this;
var search_data = this.searchview.build_search_data();
var context = new Context(this.searchview.dataset.get_context() || []);
- var domain = this.searchview.dataset.get_domain() || [];
+ var domain = [];
_.each(search_data.contexts, context.add, context);
_.each(search_data.domains, function (d) {
diff --git a/addons/board/static/tests/dashboard_tests.js b/addons/board/static/tests/dashboard_tests.js
index 1e17ca71db1..7ed0a4a60b0 100644
--- a/addons/board/static/tests/dashboard_tests.js
+++ b/addons/board/static/tests/dashboard_tests.js
@@ -698,6 +698,64 @@ QUnit.test('save actions to dashboard', function (assert) {
actionManager.destroy();
});
+QUnit.test('save two searches to dashboard', function (assert) {
+ // the second search saved should not be influenced by the first
+ assert.expect(2);
+
+ var actionManager = createActionManager({
+ data: this.data,
+ archs: {
+ 'partner,false,list': '
',
+ 'partner,false,search': '',
+ },
+ mockRPC: function (route, args) {
+ if (route === '/board/add_to_dashboard') {
+ if (filter_count === 0) {
+ assert.deepEqual(args.domain, [["display_name", "ilike", "a"]],
+ "the correct domain should be sent");
+ }
+ if (filter_count === 1) {
+ assert.deepEqual(args.domain, [["display_name", "ilike", "b"]],
+ "the correct domain should be sent");
+ }
+
+ filter_count += 1;
+ return $.when(true);
+ }
+ return this._super.apply(this, arguments);
+ },
+ });
+
+ actionManager.doAction({
+ id: 1,
+ res_model: 'partner',
+ type: 'ir.actions.act_window',
+ views: [[false, 'list']],
+ });
+
+ var filter_count = 0;
+ // Add a first filter
+ $('span.fa-filter').click();
+ $('.o_add_custom_filter:visible').click();
+ $('.o_searchview_extended_prop_value .o_input').val('a')
+ $('.o_apply_filter').click();
+ // Add it to dashboard
+ $('.o_add_to_dashboard_button').click();
+ // Remove it
+ $('.o_facet_remove').click();
+
+ // Add the second filter
+ $('span.fa-filter').click();
+ $('span.fa-filter').click();
+ $('.o_add_custom_filter:visible').click();
+ $('.o_searchview_extended_prop_value .o_input').val('b')
+ $('.o_apply_filter').click();
+ // Add it to dashboard
+ $('.o_add_to_dashboard_button').click();
+
+ actionManager.destroy();
+});
+
QUnit.test('save to dashboard actions with flag keepSearchView', function (assert) {
assert.expect(4);
From ad065093eb595e0b26dfd6d245e1b598d70e9d87 Mon Sep 17 00:00:00 2001
From: Raphael Collet
Date: Thu, 22 Nov 2018 10:59:09 +0000
Subject: [PATCH 002/104] [FIX] models: ormcache invalidation on import
Do not propagate cache invalidations to other workers when changes must be
discarded, because of an import error or a dry run, which are both handled as
successful transactions.
---
addons/base_import/models/base_import.py | 2 ++
odoo/models.py | 3 ++-
2 files changed, 4 insertions(+), 1 deletion(-)
diff --git a/addons/base_import/models/base_import.py b/addons/base_import/models/base_import.py
index 35d5692e95b..4e4945fd37c 100644
--- a/addons/base_import/models/base_import.py
+++ b/addons/base_import/models/base_import.py
@@ -885,6 +885,8 @@ class Import(models.TransientModel):
try:
if dryrun:
self._cr.execute('ROLLBACK TO SAVEPOINT import')
+ # cancel all changes done to the registry/ormcache
+ self.pool.reset_changes()
else:
self._cr.execute('RELEASE SAVEPOINT import')
except psycopg2.InternalError:
diff --git a/odoo/models.py b/odoo/models.py
index 1af6cd9c173..b2aab1d5f36 100644
--- a/odoo/models.py
+++ b/odoo/models.py
@@ -846,7 +846,6 @@ class BaseModel(MetaModel('DummyModel', (object,), {'_register': False})):
ids = []
messages = []
ModelData = self.env['ir.model.data']
- ModelData.clear_caches()
# list of (xid, vals, info) for records to be created in batch
batch = []
@@ -928,6 +927,8 @@ class BaseModel(MetaModel('DummyModel', (object,), {'_register': False})):
if any(message['type'] == 'error' for message in messages):
cr.execute('ROLLBACK TO SAVEPOINT model_load')
ids = False
+ # cancel all changes done to the registry/ormcache
+ self.pool.reset_changes()
return {'ids': ids, 'messages': messages}
From e181f592f33b2ae382569927537aed84689ee44f Mon Sep 17 00:00:00 2001
From: Raphael Collet
Date: Thu, 22 Nov 2018 11:00:53 +0000
Subject: [PATCH 003/104] [FIX] odoo: ormcache invalidation on loading registry
Do not propagate cache invalidations to other workers when simply loading the
registry. Only do it when installing/upgrading/uninstalling modules.
---
odoo/modules/loading.py | 5 -----
1 file changed, 5 deletions(-)
diff --git a/odoo/modules/loading.py b/odoo/modules/loading.py
index bc95e1c461d..5fb56887948 100644
--- a/odoo/modules/loading.py
+++ b/odoo/modules/loading.py
@@ -151,8 +151,6 @@ def load_module_graph(cr, graph, status=None, perform_checks=True,
module_count = len(graph)
_logger.info('loading %d modules...', module_count)
- registry.clear_caches()
-
# register, instantiate and initialize models for each modules
t0 = time.time()
t0_sql = odoo.sql_db.sql_counter
@@ -278,9 +276,6 @@ def load_module_graph(cr, graph, status=None, perform_checks=True,
_logger.log(25, "%s modules loaded in %.2fs, %s queries", len(graph), time.time() - t0, odoo.sql_db.sql_counter - t0_sql)
- registry.clear_caches()
-
-
return loaded_modules, processed_modules
def _check_module_names(cr, module_names):
From 5fd5c4095b7d1c2260fb5abb42d63e3c915d9be3 Mon Sep 17 00:00:00 2001
From: "Yenthe V.G"
Date: Thu, 22 Nov 2018 16:59:58 +0000
Subject: [PATCH 004/104] [IMP] hr_recruitment: improve English in demo data
closes odoo/odoo#28970
---
addons/hr_recruitment/data/hr_recruitment_demo.xml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/addons/hr_recruitment/data/hr_recruitment_demo.xml b/addons/hr_recruitment/data/hr_recruitment_demo.xml
index 0784228fd6a..189ae4e5d75 100644
--- a/addons/hr_recruitment/data/hr_recruitment_demo.xml
+++ b/addons/hr_recruitment/data/hr_recruitment_demo.xml
@@ -177,7 +177,7 @@
hr.applicant
Hello,
- I have checked this application but It's not match with our requirement. so no need to process further and we should refuse this application.
+ I have checked this application but it does not match with our requirements. We don't need to proceed further and we should refuse this application.
Kind regards,
]]>
comment
@@ -187,7 +187,7 @@
hr.applicant
Hello,
- We should move further for this application as early as possible..
+ We should move further for this application as early as possible.
Kind regards,
]]>
comment
From 1111de6eb24299e182a2e48702bc4f040edafc46 Mon Sep 17 00:00:00 2001
From: RomainLibert
Date: Fri, 23 Nov 2018 10:52:42 +0000
Subject: [PATCH 005/104] [FIX] hr_holidays: use display_name instead of name
In order to see the remaining days in the tree view we need to use
display_name instead of name, as display name will use the name_get
which is overriden to add this information.
closes odoo/odoo#28981
---
addons/hr_holidays/views/hr_leave_type_views.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/addons/hr_holidays/views/hr_leave_type_views.xml b/addons/hr_holidays/views/hr_leave_type_views.xml
index c3bdc445ec0..759972e36ea 100644
--- a/addons/hr_holidays/views/hr_leave_type_views.xml
+++ b/addons/hr_holidays/views/hr_leave_type_views.xml
@@ -95,7 +95,7 @@
-
+
From 904989215212160741d54062d57ea9d0bb0f3b46 Mon Sep 17 00:00:00 2001
From: qsm-odoo
Date: Tue, 20 Nov 2018 13:17:01 +0000
Subject: [PATCH 006/104] [FIX] website: add some more BS3 compatibility
Completes https://github.com/odoo/odoo/pull/27981
- Correct `col-*-offset-*` support.
- Compatibility for BS3-deprecated `visible-*` classes (only not taking
care of table/table-row/table-cell cases as difficult with sass and
those classes were already BS3 deprecated anyway).
- Correct order for BS3 `visible-*-*` and `hidden-*` classes (otherwise
their combination are not correctly working). Also, the 'inline'
version was forgotten by previous PR.
- Compatibility for BS3 `btn-xs` class.
closes odoo/odoo#28842
---
.../src/scss/compatibility/bs3_for_12_0.scss | 199 +++++++++++-------
1 file changed, 124 insertions(+), 75 deletions(-)
diff --git a/addons/website/static/src/scss/compatibility/bs3_for_12_0.scss b/addons/website/static/src/scss/compatibility/bs3_for_12_0.scss
index 82beeec2cbf..4f93429aa58 100644
--- a/addons/website/static/src/scss/compatibility/bs3_for_12_0.scss
+++ b/addons/website/static/src/scss/compatibility/bs3_for_12_0.scss
@@ -142,12 +142,18 @@ $-compat-gray-map: (
@extend .card-body;
}
-// Adapt grid (push-pull, xs ?)
-@each $breakpoint in map-keys($grid-breakpoints) {
- $infix: breakpoint-infix($breakpoint, $grid-breakpoints);
+// Adapt grid (push-pull ?)
+$-compat-breakpoints: (
+ xs: map-get($grid-breakpoints, 'xs'),
+ sm: map-get($grid-breakpoints, 'md'),
+ md: map-get($grid-breakpoints, 'lg'),
+ lg: map-get($grid-breakpoints, 'xl'),
+);
+@each $breakpoint in map-keys($-compat-breakpoints) {
+ $infix: breakpoint-infix($breakpoint, $-compat-breakpoints);
$infix: if($infix != "", $infix, "-xs");
- @include media-breakpoint-up($breakpoint, $grid-breakpoints) {
+ @include media-breakpoint-up($breakpoint, $-compat-breakpoints) {
// `$grid-columns - 1` because offsetting by the width of an entire row isn't possible
@for $i from 0 through ($grid-columns - 1) {
.col#{$infix}-offset-#{$i} {
@@ -196,105 +202,148 @@ $-compat-gray-map: (
.btn-default {
@include button-variant(theme-color('secondary'), theme-color('secondary'));
}
+.btn-xs {
+ @extend .btn-sm;
+}
// Adapt display classes
-.hidden, .hide {
+.hide {
display: none !important;
}
-.hidden {
- &-xs {
- @include media-breakpoint-down(sm) {
- display: none;
- }
- }
- &-sm {
- @include media-breakpoint-only(md) {
- display: none;
- }
- }
- &-md {
- @include media-breakpoint-only(lg) {
- display: none;
- }
- }
- &-lg {
- @include media-breakpoint-only(xl) {
- display: none;
- }
- }
- &-print {
- @media print {
- display: none;
- }
- }
-}
.show {
display: block !important;
}
+.hidden {
+ display: none !important;
+}
.visible {
- &-xs {
- &-block, &-inline-block {
- display: none;
+ &-xs, &-sm, &-md, &-lg {
+ &, &-block, &-inline, &-inline-block {
+ display: none !important;
}
- @include media-breakpoint-down(sm) {
- &-block {
- display: block;
+ }
+ &-xs {
+ &, &-block {
+ @include media-breakpoint-down(sm) {
+ display: block !important;
}
- &-inline-block {
- display: inline-block;
+ }
+ &-inline {
+ @include media-breakpoint-down(sm) {
+ display: inline !important;
+ }
+ }
+ &-inline-block {
+ @include media-breakpoint-down(sm) {
+ display: inline-block !important;
}
}
}
&-sm {
- &-block, &-inline-block {
- display: none;
- }
- @include media-breakpoint-only(md) {
- &-block {
- display: block;
+ &, &-block {
+ @include media-breakpoint-only(md) {
+ display: block !important;
}
- &-inline-block {
- display: inline-block;
+ }
+ &-inline {
+ @include media-breakpoint-only(md) {
+ display: inline !important;
+ }
+ }
+ &-inline-block {
+ @include media-breakpoint-only(md) {
+ display: inline-block !important;
}
}
}
&-md {
- &-block, &-inline-block {
- display: none;
- }
- @include media-breakpoint-only(lg) {
- &-block {
- display: block;
+ &, &-block {
+ @include media-breakpoint-only(lg) {
+ display: block !important;
}
- &-inline-block {
- display: inline-block;
+ }
+ &-inline {
+ @include media-breakpoint-only(lg) {
+ display: inline !important;
+ }
+ }
+ &-inline-block {
+ @include media-breakpoint-only(lg) {
+ display: inline-block !important;
}
}
}
&-lg {
- &-block, &-inline-block {
- display: none;
- }
- @include media-breakpoint-only(xl) {
- &-block {
- display: block;
- }
- &-inline-block {
- display: inline-block;
+ &, &-block {
+ @include media-breakpoint-up(xl) {
+ display: block !important;
}
}
- }
- &-print {
- &-block, &-inline-block {
- display: none;
- }
- @media print {
- &-block {
- display: block;
+ &-inline {
+ @include media-breakpoint-up(xl) {
+ display: inline !important;
}
- &-inline-block {
- display: inline-block;
+ }
+ &-inline-block {
+ @include media-breakpoint-up(xl) {
+ display: inline-block !important;
}
}
}
}
+.hidden {
+ &-xs {
+ @include media-breakpoint-down(sm) {
+ display: none !important;
+ }
+ }
+ &-sm {
+ @include media-breakpoint-only(md) {
+ display: none !important;
+ }
+ }
+ &-md {
+ @include media-breakpoint-only(lg) {
+ display: none !important;
+ }
+ }
+ &-lg {
+ @include media-breakpoint-up(xl) {
+ display: none !important;
+ }
+ }
+}
+.visible-print {
+ display: none !important;
+
+ @media print {
+ display: block !important;
+ }
+
+ &-block {
+ display: none !important;
+
+ @media print {
+ display: block !important;
+ }
+ }
+ &-inline {
+ display: none !important;
+
+ @media print {
+ display: inline !important;
+ }
+ }
+ &-inline-block {
+ display: none !important;
+
+ @media print {
+ display: inline-block !important;
+ }
+ }
+}
+.hidden-print {
+ @media print {
+ display: none !important;
+ }
+}
From c96d4cdbadf8d15abcad19e8f5839b46bb025e04 Mon Sep 17 00:00:00 2001
From: Raphael Collet
Date: Fri, 23 Nov 2018 14:02:17 +0000
Subject: [PATCH 007/104] [FIX] base: ormcache invalidation in
`ir.config.parameter`
Writing on a parameter invalidates the ormcache and propagates the invalidation
to other workers. Setting a parameter to its current value should not trigger
ormcache invalidations.
---
odoo/addons/base/models/ir_config_parameter.py | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/odoo/addons/base/models/ir_config_parameter.py b/odoo/addons/base/models/ir_config_parameter.py
index eed10daadd8..b7f2356e803 100644
--- a/odoo/addons/base/models/ir_config_parameter.py
+++ b/odoo/addons/base/models/ir_config_parameter.py
@@ -83,7 +83,8 @@ class IrConfigParameter(models.Model):
if param:
old = param.value
if value is not False and value is not None:
- param.write({'value': value})
+ if str(value) != old:
+ param.write({'value': value})
else:
param.unlink()
return old
From 8b1a05d9e09dca317ca38422d75f459a7e1784aa Mon Sep 17 00:00:00 2001
From: Romain Derie
Date: Mon, 19 Nov 2018 14:36:31 +0000
Subject: [PATCH 008/104] [FIX] web_unsplash: don't expose client_id in network
Unsplash CEO asked us to stop exposing our key client side (even if it was
only in the browser network and previously allowed by their API team leader).
After multiple exchange, it has been negociated that:
1. Our non saas user won't be able to apply for a production key and should
prefix they Unsplash application name by 'Odoo:'. Their key will remain in
test mode.
Indeed, Unsplash won't be able to review every Odoo application and ensure
it respects the API terms and it is a real application.
2. Our saas user will query Unsplash with a dedicated enterprise key
3. The documentation should explain it all
Task-1911345
---
addons/web_unsplash/__manifest__.py | 2 +-
addons/web_unsplash/controllers/main.py | 52 ++++++++++++++++---
.../static/src/js/unsplash_image_widget.js | 6 +--
.../web_unsplash/static/src/js/unsplashapi.js | 43 ++++-----------
.../static/src/xml/unsplash_image_widget.xml | 2 +-
5 files changed, 57 insertions(+), 48 deletions(-)
diff --git a/addons/web_unsplash/__manifest__.py b/addons/web_unsplash/__manifest__.py
index 3ad4b1334b3..a139e64743b 100644
--- a/addons/web_unsplash/__manifest__.py
+++ b/addons/web_unsplash/__manifest__.py
@@ -4,7 +4,7 @@
'name': 'Unsplash Image Library',
'category': 'Web',
'summary': 'Find free high-resolution images from Unsplash',
- 'version': '1.0',
+ 'version': '1.1',
'description': """Explore the free high-resolution image library of Unsplash.com and find images to use in Odoo. An Unsplash search bar is added to the image library modal.""",
'depends': ['base_setup', 'web_editor'],
'data': [
diff --git a/addons/web_unsplash/controllers/main.py b/addons/web_unsplash/controllers/main.py
index c53c03ba5bf..7a53cd8e115 100644
--- a/addons/web_unsplash/controllers/main.py
+++ b/addons/web_unsplash/controllers/main.py
@@ -9,12 +9,34 @@ import werkzeug.utils
from PIL import Image
from odoo import http, tools, _
from odoo.http import request
+from werkzeug.urls import url_encode
logger = logging.getLogger(__name__)
class Web_Unsplash(http.Controller):
+ def _get_access_key(self):
+ if request.env.user._has_unsplash_key_rights():
+ return request.env['ir.config_parameter'].sudo().get_param('unsplash.access_key')
+ raise werkzeug.exceptions.NotFound()
+
+ def _notify_download(self, url):
+ ''' Notifies Unsplash from an image download. (API requirement)
+ :param url: the download_url of the image to be notified
+
+ This method won't return anything. This endpoint should just be
+ pinged with a simple GET request for Unsplash to increment the image
+ view counter.
+ '''
+ try:
+ if not url.startswith('https://api.unsplash.com/photos/'):
+ raise Exception(_("ERROR: Unknown Unsplash notify URL!"))
+ access_key = self._get_access_key()
+ requests.get(url, params=url_encode({'client_id': access_key}))
+ except Exception as e:
+ logger.exception("Unsplash download notification failed: " + str(e))
+
# ------------------------------------------------------
# add unsplash image url
# ------------------------------------------------------
@@ -22,8 +44,14 @@ class Web_Unsplash(http.Controller):
def save_unsplash_url(self, unsplashurls=None, **kwargs):
"""
unsplashurls = {
- image_id1: image_url1,
- image_id2: image_url2,
+ image_id1: {
+ url: image_url,
+ download_url: download_url,
+ },
+ image_id2: {
+ url: image_url,
+ download_url: download_url,
+ },
.....
}
"""
@@ -82,13 +110,23 @@ class Web_Unsplash(http.Controller):
attachment.generate_access_token()
uploads.extend(attachment.read(['name', 'mimetype', 'checksum', 'res_id', 'res_model', 'access_token', 'url']))
+ # Notifies Unsplash from an image download. (API requirement)
+ self._notify_download(value.get('download_url'))
+
return uploads
- @http.route("/web_unsplash/get_client_id", type='json', auth="user")
- def get_unsplash_client_id(self, **post):
- if request.env.user._has_unsplash_key_rights():
- return request.env['ir.config_parameter'].sudo().get_param('unsplash.access_key')
- raise werkzeug.exceptions.NotFound()
+ @http.route("/web_unsplash/fetch_images", type='json', auth="user")
+ def fetch_unsplash_images(self, **post):
+ access_key = self._get_access_key()
+ app_id = self.get_unsplash_app_id()
+ if not access_key or not app_id:
+ return {'error': 'key_not_found'}
+ post['client_id'] = access_key
+ response = requests.get('https://api.unsplash.com/search/photos/', params=url_encode(post))
+ if response.status_code == requests.codes.ok:
+ return response.json()
+ else:
+ return {'error': response.status_code}
@http.route("/web_unsplash/get_app_id", type='json', auth="public")
def get_unsplash_app_id(self, **post):
diff --git a/addons/web_unsplash/static/src/js/unsplash_image_widget.js b/addons/web_unsplash/static/src/js/unsplash_image_widget.js
index d353694ddea..ab900d6a03c 100644
--- a/addons/web_unsplash/static/src/js/unsplash_image_widget.js
+++ b/addons/web_unsplash/static/src/js/unsplash_image_widget.js
@@ -88,10 +88,6 @@ ImageWidget.include({
res_id: self.options.res_id,
}
}).then(function (images) {
- for (var img in self._unsplash.selectedImages) {
- self.unsplashAPI.notifyDownload(self._unsplash.selectedImages[img].download_url);
- }
-
_.each(images, function (image) {
image.src = image.url;
image.isDocument = !(/gif|jpe|jpg|png/.test(image.mimetype));
@@ -140,7 +136,7 @@ ImageWidget.include({
self.$('.unsplash_img_container').html(QWeb.render('web_unsplash.dialog.image.content', { rows: rows }));
self._highlightSelectedImages();
}).fail(function (err) {
- self.$('.unsplash_img_container').html(QWeb.render('web_unsplash.dialog.error.content', err));
+ self.$('.unsplash_img_container').html(QWeb.render('web_unsplash.dialog.error.content', { status: err }));
}).always(function () {
self._toggleAttachmentContaines(false);
});
diff --git a/addons/web_unsplash/static/src/js/unsplashapi.js b/addons/web_unsplash/static/src/js/unsplashapi.js
index 0ceb2b8f8a7..a6ec5b75324 100644
--- a/addons/web_unsplash/static/src/js/unsplashapi.js
+++ b/addons/web_unsplash/static/src/js/unsplashapi.js
@@ -38,45 +38,15 @@ var UnsplashCore = Class.extend(Mixins.EventDispatcherMixin, ServicesMixin, {
if (cachedData && (cachedData.images.length >= to || (cachedData.totalImages !== 0 && cachedData.totalImages < to))) {
return $.when({ images: cachedData.images.slice(from, to), isMaxed: to > cachedData.totalImages });
}
- return this._getAPIKey().then(function (clientID) {
- if (!clientID) {
- return $.Deferred().reject({ key_not_found: true });
- }
- return self._fetchImages(query).then(function (cachedData) {
- return { images: cachedData.images.slice(from, to), isMaxed: to > cachedData.totalImages };
- });
+ return self._fetchImages(query).then(function (cachedData) {
+ return { images: cachedData.images.slice(from, to), isMaxed: to > cachedData.totalImages };
});
},
- /**
- * Notifies Unsplash from an image download. (API requirement)
- *
- * @param {String} url url of the image to notify
- */
- notifyDownload: function (url) {
- $.get(url, { client_id: this.clientId });
- },
//--------------------------------------------------------------------------
// Private
//--------------------------------------------------------------------------
- /**
- * Checks and retrieves the unsplash API key
- *
- * @private
- */
- _getAPIKey: function () {
- var self = this;
- if (this.clientId) {
- return $.Deferred().resolve(self.clientId);
- }
- return this._rpc({
- route: '/web_unsplash/get_client_id',
- }).then(function (res) {
- self.clientId = res;
- return res;
- });
- },
/**
* Fetches images from unsplash and stores it in cache
*
@@ -96,10 +66,15 @@ var UnsplashCore = Class.extend(Mixins.EventDispatcherMixin, ServicesMixin, {
var payload = {
query: query,
page: cachedData.pageCached + 1,
- client_id: this.clientId,
per_page: 30, // max size from unsplash API
};
- return $.get('https://api.unsplash.com/search/photos/', payload).then(function (result) {
+ return this._rpc({
+ route: '/web_unsplash/fetch_images',
+ params: payload,
+ }).then(function (result) {
+ if (result.error) {
+ return $.Deferred().reject(result.error);
+ }
cachedData.pageCached++;
cachedData.images.push.apply(cachedData.images, result.results);
cachedData.maxPages = result.total_pages;
diff --git a/addons/web_unsplash/static/src/xml/unsplash_image_widget.xml b/addons/web_unsplash/static/src/xml/unsplash_image_widget.xml
index 409c435884b..05202e073b2 100644
--- a/addons/web_unsplash/static/src/xml/unsplash_image_widget.xml
+++ b/addons/web_unsplash/static/src/xml/unsplash_image_widget.xml
@@ -50,7 +50,7 @@
-
+
Unsplash requires an access key and an application ID
From 55073e3baa97fa1285695233f30044bd7c698858 Mon Sep 17 00:00:00 2001
From: Romain Derie
Date: Mon, 19 Nov 2018 17:09:40 +0000
Subject: [PATCH 009/104] [FIX] web_unsplash: add unsplash searched terms in
attachement name/url
Before this commit:
An unsplash image would be saved as an attachement with:
- A name like 'x54ze78z.JPEG'
- An url like '/unsplash/x54ze78z.JPEG'
- A filename like 'x54ze78z.JPGED'
We would not store the searched terms in the name/url.
Then, we would not be able to search on local attachement in the media dialog
to retrieve the images based on what we searched.
Now:
We store the searched terms in the name/url so it can be used later in the
media dialog search:
- Name like 'big_lion.jpg' (duplicates may be possible)
- Url like '/unsplash/x54ze78z/big_lion.jpg'
- Filename like 'unsplash_x54ze78z_big_lion.jpg'
Task-1911345
---
addons/web_unsplash/controllers/main.py | 24 ++++++++++++++-----
.../static/src/js/unsplash_beacon.js | 4 ++--
.../static/src/js/unsplash_image_widget.js | 1 +
3 files changed, 21 insertions(+), 8 deletions(-)
diff --git a/addons/web_unsplash/controllers/main.py b/addons/web_unsplash/controllers/main.py
index 7a53cd8e115..219342d1c39 100644
--- a/addons/web_unsplash/controllers/main.py
+++ b/addons/web_unsplash/controllers/main.py
@@ -55,12 +55,23 @@ class Web_Unsplash(http.Controller):
.....
}
"""
+ def slugify(s):
+ ''' Keeps only alphanumeric characters, hyphens and spaces from a string.
+ The string will also be truncated to 1024 characters max.
+ :param s: the string to be filtered
+ :return: the sanitized string
+ '''
+ return "".join([c for c in s if c.isalnum() or c in list("- ")])[:1024]
+
if not unsplashurls:
return []
uploads = []
Attachments = request.env['ir.attachment']
+ query = kwargs.get('query', '')
+ query = slugify(query)
+
res_model = kwargs.get('res_model', 'ir.ui.view')
if res_model != 'ir.ui.view' and kwargs.get('res_id'):
res_id = int(kwargs['res_id'])
@@ -87,20 +98,21 @@ class Web_Unsplash(http.Controller):
logger.exception("Timeout: " + str(e))
continue
- name = key
-
# optimized image before save
if mimetype in ('image/jpeg', 'image/png'):
image = Image.open(io.BytesIO(datas))
if image.format in ('PNG', 'JPEG'):
datas = tools.image_save_for_web(image)
# append image extension in name
- name += '.' + image.format
+ query += '.' + str.lower(image.format)
+
+ # /unsplash/5gR788gfd/lion
+ url_frags = ['unsplash', key, query]
attachment = Attachments.create({
- 'name': name,
- 'url': '/unsplash/' + name,
- 'datas_fname': name,
+ 'name': query,
+ 'url': '/' + '/'.join(url_frags),
+ 'datas_fname': '_'.join(url_frags),
'mimetype': mimetype,
'datas': base64.b64encode(datas),
'public': res_model == 'ir.ui.view',
diff --git a/addons/web_unsplash/static/src/js/unsplash_beacon.js b/addons/web_unsplash/static/src/js/unsplash_beacon.js
index f8e74a3b759..179d566cee3 100644
--- a/addons/web_unsplash/static/src/js/unsplash_beacon.js
+++ b/addons/web_unsplash/static/src/js/unsplash_beacon.js
@@ -7,8 +7,8 @@ var ajax = require('web.ajax');
base.ready().then(function () {
var unsplash_images = [];
_.each($('img[src*="/unsplash/"]'), function (img, index) {
- // get image id from URL (`/unsplash/xYdf5feoI.jpg` -> `xYdf5feoI`)
- unsplash_images.push(img.src.split('/unsplash/')[1].split('.')[0]);
+ // get image id from URL (`http://www.domain.com:1234/unsplash/xYdf5feoI/lion.jpg` -> `xYdf5feoI`)
+ unsplash_images.push(img.src.split('/unsplash/')[1].split('/')[0]);
});
if (unsplash_images.length) {
ajax.jsonRpc('/web_unsplash/get_app_id', 'call').then(function (appID) {
diff --git a/addons/web_unsplash/static/src/js/unsplash_image_widget.js b/addons/web_unsplash/static/src/js/unsplash_image_widget.js
index ab900d6a03c..6eb393d3798 100644
--- a/addons/web_unsplash/static/src/js/unsplash_image_widget.js
+++ b/addons/web_unsplash/static/src/js/unsplash_image_widget.js
@@ -86,6 +86,7 @@ ImageWidget.include({
unsplashurls: self._unsplash.selectedImages,
res_model : self.options.res_model,
res_id: self.options.res_id,
+ query: self._unsplash.query,
}
}).then(function (images) {
_.each(images, function (image) {
From fad35964bf7931766dd0ff9726fd13e5db0aecb1 Mon Sep 17 00:00:00 2001
From: Aaron Bohy
Date: Fri, 23 Nov 2018 14:15:22 +0000
Subject: [PATCH 010/104] [IMP] web: backport of new asserts
This rev. is a complement to the partial backport 49e78f46 of
abf32b8. In addition to the helpers, we also backport the asserts
(like isVisible, containsOnce...).
closes odoo/odoo#28994
---
.../web/static/tests/helpers/qunit_asserts.js | 229 ++++++++++++++++++
addons/web/views/webclient_templates.xml | 2 +
2 files changed, 231 insertions(+)
create mode 100644 addons/web/static/tests/helpers/qunit_asserts.js
diff --git a/addons/web/static/tests/helpers/qunit_asserts.js b/addons/web/static/tests/helpers/qunit_asserts.js
new file mode 100644
index 00000000000..bce6ef2a777
--- /dev/null
+++ b/addons/web/static/tests/helpers/qunit_asserts.js
@@ -0,0 +1,229 @@
+odoo.define('web.qunit_asserts', function (require) {
+"use strict";
+
+/**
+ * In this file, we extend QUnit by adding some specialized assertions. The goal
+ * of these new assertions is twofold:
+ * - ease of use: they should allow us to simplify some common complex assertions
+ * - safer: these assertions will fail when some preconditions are not met.
+ *
+ * For example, the assert.isVisible assertion will also check that the target
+ * matches exactly one element.
+ */
+
+var Widget = require('web.Widget');
+
+//------------------------------------------------------------------------------
+// Private functions
+//------------------------------------------------------------------------------
+
+/**
+ * Helper function, to check if a given element
+ * - is unique (if it is a jquery node set)
+ * - has (or has not) a css class
+ *
+ * @private
+ * @param {Widget|jQuery|HTMLElement} w
+ * @param {string} className
+ * @param {boolean} shouldHaveClass
+ * @param {string} [msg]
+ */
+function _checkClass(w, className, shouldHaveClass, msg) {
+ var $el = w instanceof Widget ? w.$el :
+ w instanceof HTMLElement ? $(w) :
+ w; // jquery element
+
+ if ($el.length !== 1) {
+ var descr = `${shouldHaveClass ? 'hasClass' : 'doesNotHaveClass'} ${className}`;
+ QUnit.assert.ok(false, `Assertion '${descr}' targets ${$el.length} elements instead of 1`);
+ } else {
+ msg = msg || `target ${$el.selector || ''} should ${shouldHaveClass ? '' : 'not'} have class ${className}`;
+ var hasClass = $el.hasClass(className);
+ var condition = shouldHaveClass ? hasClass : !hasClass;
+ QUnit.assert.ok(condition, msg);
+ }
+}
+
+/**
+ * Helper function, to check if a given element
+ * - is unique (if it is a jquery node set)
+ * - is (or not) visible
+ *
+ * @private
+ * @param {Widget|jQuery|HTMLElement} w
+ * @param {boolean} shouldBeVisible
+ * @param {string} [msg]
+ */
+function _checkVisible(w, shouldBeVisible, msg) {
+ var $el = w instanceof Widget ? w.$el :
+ w instanceof HTMLElement ? $(w) :
+ w; // jquery element
+
+ if ($el.length !== 1) {
+ var descr = `${shouldBeVisible ? 'isVisible' : 'isNotVisible'}`;
+ QUnit.assert.ok(false, `Assertion '${descr}' targets ${$el.length} elements instead of 1`);
+ } else {
+ msg = msg || `target ${$el.selector} should ${shouldBeVisible ? '' : 'not'} be visible`;
+ var isVisible = $el.is(':visible');
+ var condition = shouldBeVisible ? isVisible : !isVisible;
+ QUnit.assert.ok(condition, msg);
+ }
+}
+
+//------------------------------------------------------------------------------
+// Public functions
+//------------------------------------------------------------------------------
+
+/**
+ * Checks that the target element (described by widget/jquery or html element)
+ * contains exactly n matches for the selector.
+ *
+ * Example: assert.containsN(document.body, '.modal', 0)
+ *
+ * @param {Widget|jQuery|HTMLElement} w
+ * @param {string} selector
+ * @param {number} n
+ * @param {string} [msg]
+ */
+function containsN(w, selector, n, msg) {
+ if (typeof n !== 'number') {
+ throw Error("containsN assert should be called with a number as third argument");
+ }
+ var $el = w instanceof Widget ? w.$el :
+ w instanceof HTMLElement ? $(w) :
+ w; // jquery element
+
+ var $matches = $el.find(selector);
+ if (!msg) {
+ msg = `Selector '${selector}' should have exactly ${n} matches`;
+ if ($el.selector) {
+ msg += ` (inside '${$el.selector}')`;
+ }
+ }
+ QUnit.assert.strictEqual($matches.length, n, msg);
+}
+
+/**
+ * Checks that the target element (described by widget/jquery or html element)
+ * contains exactly 1 match for the selector.
+ *
+ * @param {Widget|jQuery|HTMLElement} w
+ * @param {string} selector
+ * @param {string} [msg]
+ */
+function containsOnce(w, selector, msg) {
+ containsN(w, selector, 1, msg);
+}
+
+/**
+ * Checks that the target element (described by widget/jquery or html element)
+ * contains exactly 0 match for the selector.
+ *
+ * @param {Widget|jQuery|HTMLElement} w
+ * @param {string} selector
+ * @param {string} [msg]
+ */
+function containsNone(w, selector, msg) {
+ containsN(w, selector, 0, msg);
+}
+
+/**
+ * Checks that the target element (described by widget/jquery or html element)
+ * - exists
+ * - is unique
+ * - has the given class (specified by className)
+ *
+ * Note that it uses the hasClass jQuery method, so it can be used to check the
+ * presence of more than one class ('some-class other-class'), but it is a
+ * little brittle, because it depends on the order of these classes:
+ *
+ * div.a.b.c: has class 'a b c', but does not have class 'a c b'
+ *
+ * @param {Widget|jQuery|HTMLElement} w
+ * @param {string} className
+ * @param {string} [msg]
+ */
+function hasClass(w, className, msg) {
+ _checkClass(w, className, true, msg);
+}
+
+/**
+ * Checks that the target element (described by widget/jquery or html element)
+ * - exists
+ * - is unique
+ * - does not have the given class (specified by className)
+ *
+ * @param {Widget|jQuery|HTMLElement} w
+ * @param {string} className
+ * @param {string} [msg]
+ */
+function doesNotHaveClass(w, className, msg) {
+ _checkClass(w, className, false, msg);
+}
+
+/**
+ * Checks that the target element (described by widget/jquery or html element)
+ * - exists
+ * - is unique
+ * - has the given attribute with the proper value
+ *
+ * @param {Widget|jQuery|HTMLElement} w
+ * @param {string} attr
+ * @param {string} value
+ * @param {string} [msg]
+ */
+function hasAttrValue(w, attr, value, msg) {
+ var $el = w instanceof Widget ? w.$el :
+ w instanceof HTMLElement ? $(w) :
+ w; // jquery element
+
+ if ($el.length !== 1) {
+ var descr = `hasAttrValue (${attr}: ${value})`;
+ QUnit.assert.ok(false, `Assertion '${descr}' targets ${$el.length} elements instead of 1`);
+ } else {
+ msg = msg || `attribute '${attr}' of target ${$el.selector || ''} should be '${value}'`;
+ QUnit.assert.strictEqual($el.attr(attr), value, msg);
+ }
+}
+
+/**
+ * Checks that the target element (described by widget/jquery or html element)
+ * - exists
+ * - is visible (as far as jQuery can tell: not in display none, ...)
+ *
+ * @param {Widget|jQuery|HTMLElement} w
+ * @param {string} [msg]
+ */
+function isVisible(w, msg) {
+ _checkVisible(w, true, msg);
+}
+
+/**
+ * Checks that the target element (described by widget/jquery or html element)
+ * - exists
+ * - is not visible (as far as jQuery can tell: display none, ...)
+ *
+ * @param {Widget|jQuery|HTMLElement} w
+ * @param {string} [msg]
+ */
+function isNotVisible(w, msg) {
+ _checkVisible(w, false, msg);
+}
+
+//------------------------------------------------------------------------------
+// Exposed API
+//------------------------------------------------------------------------------
+
+QUnit.assert.containsOnce = containsOnce;
+QUnit.assert.containsNone = containsNone;
+QUnit.assert.containsN = containsN;
+
+QUnit.assert.hasClass = hasClass;
+QUnit.assert.doesNotHaveClass = doesNotHaveClass;
+
+QUnit.assert.hasAttrValue = hasAttrValue;
+
+QUnit.assert.isVisible = isVisible;
+QUnit.assert.isNotVisible = isNotVisible;
+
+});
diff --git a/addons/web/views/webclient_templates.xml b/addons/web/views/webclient_templates.xml
index e5c5bd22979..8a519b0d309 100644
--- a/addons/web/views/webclient_templates.xml
+++ b/addons/web/views/webclient_templates.xml
@@ -434,6 +434,8 @@
+
+
From 06b91b7658f1d24ccd0cf6310b2dcbd1d3694601 Mon Sep 17 00:00:00 2001
From: Aaron Bohy
Date: Fri, 23 Nov 2018 14:58:34 +0000
Subject: [PATCH 011/104] [FIX] web: benchmarks: add missing test_utils
Without those, the benchmarks suite can't run.
closes odoo/odoo#28996
---
.../web/static/tests/views/form_benchmarks.js | 17 ++++++++---------
addons/web/views/webclient_templates.xml | 10 ++++++++++
2 files changed, 18 insertions(+), 9 deletions(-)
diff --git a/addons/web/static/tests/views/form_benchmarks.js b/addons/web/static/tests/views/form_benchmarks.js
index d664859ba2f..b3edb07d0bb 100644
--- a/addons/web/static/tests/views/form_benchmarks.js
+++ b/addons/web/static/tests/views/form_benchmarks.js
@@ -1,4 +1,4 @@
-odoo.define('web.list_benchmarks', function (require) {
+odoo.define('web.form_benchmarks', function (require) {
"use strict";
var FormView = require('web.FormView');
@@ -38,7 +38,6 @@ QUnit.module('Form View', {
this.run = function (assert, done, cb) {
var data = this.data;
var arch = this.arch;
- var viewOptions = this.viewOptions;
new Benchmark.Suite({})
.add('form', function () {
var list = createView({
@@ -76,13 +75,13 @@ QUnit.module('Form View', {
this.data.foo.records[0].many2many.push(i);
}
this.arch =
- '';
this.run(assert, done, function (form) {
form.$buttons.find('.o_form_button_edit').click();
diff --git a/addons/web/views/webclient_templates.xml b/addons/web/views/webclient_templates.xml
index 8a519b0d309..100b553b09d 100644
--- a/addons/web/views/webclient_templates.xml
+++ b/addons/web/views/webclient_templates.xml
@@ -679,6 +679,16 @@
display: inherit;
}
+
+
+
+
+
+
+
+
+
+
From 04a3d6195431105d01d249e76761d3cb21412fea Mon Sep 17 00:00:00 2001
From: Jeremy Kersten
Date: Fri, 23 Nov 2018 13:24:43 +0000
Subject: [PATCH 012/104] [FIX] website: settings - related field are now RO by
default
Following of 3f4f77f and 52a8ed3c0c72b2
closes odoo/odoo#28997
---
addons/website_sale/models/res_config_settings.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/addons/website_sale/models/res_config_settings.py b/addons/website_sale/models/res_config_settings.py
index bceea238fa6..a3613339aed 100644
--- a/addons/website_sale/models/res_config_settings.py
+++ b/addons/website_sale/models/res_config_settings.py
@@ -16,7 +16,7 @@ class ResConfigSettings(models.TransientModel):
return False
salesperson_id = fields.Many2one('res.users', related='website_id.salesperson_id', string='Salesperson', readonly=False)
- salesteam_id = fields.Many2one('crm.team', related='website_id.salesteam_id', string='Sales Team', domain=[('team_type', '!=', 'pos')])
+ salesteam_id = fields.Many2one('crm.team', related='website_id.salesteam_id', string='Sales Team', domain=[('team_type', '!=', 'pos')], readonly=False)
module_website_sale_delivery = fields.Boolean("eCommerce Shipping Costs")
# field used to have a nice radio in form view, resuming the 2 fields above
sale_delivery_settings = fields.Selection([
From b6246b3a4613c38946b9980b6e7223edc2314c3a Mon Sep 17 00:00:00 2001
From: sri-odoo
Date: Fri, 23 Nov 2018 13:29:22 +0000
Subject: [PATCH 013/104] [FIX] * : add missing app icons
- Add missing SVGs files
- Add icons for new apps
closes odoo/odoo#28992
---
.../payment_adyen/static/description/icon.png | Bin 2074 -> 5538 bytes
.../payment_adyen/static/description/icon.svg | 1 +
.../static/description/icon.png | Bin 6954 -> 6290 bytes
.../static/description/icon.svg | 1 +
.../static/description/icon.png | Bin 3118 -> 5943 bytes
.../static/description/icon.svg | 1 +
.../payment_ogone/static/description/icon.png | Bin 8748 -> 6060 bytes
.../payment_ogone/static/description/icon.svg | 1 +
.../static/description/icon.png | Bin 6278 -> 5876 bytes
.../static/description/icon.svg | 1 +
.../static/description/icon.png | Bin 3561 -> 6035 bytes
.../static/description/icon.svg | 1 +
.../payment_sips/static/description/icon.png | Bin 12578 -> 6028 bytes
.../payment_sips/static/description/icon.svg | 1 +
.../static/description/icon.png | Bin 2231 -> 6019 bytes
.../static/description/icon.svg | 1 +
addons/product/static/description/icon.png | Bin 2295 -> 5400 bytes
addons/product/static/description/icon.svg | 1 +
addons/transifex/static/description/icon.png | Bin 3279 -> 7344 bytes
addons/transifex/static/description/icon.svg | 1 +
.../web_unsplash/static/description/icon.png | Bin 1981 -> 6629 bytes
.../web_unsplash/static/description/icon.svg | 1 +
22 files changed, 11 insertions(+)
create mode 100644 addons/payment_adyen/static/description/icon.svg
create mode 100644 addons/payment_authorize/static/description/icon.svg
create mode 100644 addons/payment_buckaroo/static/description/icon.svg
create mode 100644 addons/payment_ogone/static/description/icon.svg
create mode 100644 addons/payment_paypal/static/description/icon.svg
create mode 100644 addons/payment_payumoney/static/description/icon.svg
create mode 100644 addons/payment_sips/static/description/icon.svg
create mode 100644 addons/payment_stripe/static/description/icon.svg
create mode 100644 addons/product/static/description/icon.svg
create mode 100644 addons/transifex/static/description/icon.svg
create mode 100644 addons/web_unsplash/static/description/icon.svg
diff --git a/addons/payment_adyen/static/description/icon.png b/addons/payment_adyen/static/description/icon.png
index bfb5111fff8f0bd0d31bc459a25e20a5f270649c..40cbb9e27b5f46998607c99141cd576b5777b41e 100644
GIT binary patch
literal 5538
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
diff --git a/addons/payment_adyen/static/description/icon.svg b/addons/payment_adyen/static/description/icon.svg
new file mode 100644
index 00000000000..79ba689e91a
--- /dev/null
+++ b/addons/payment_adyen/static/description/icon.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/addons/payment_authorize/static/description/icon.png b/addons/payment_authorize/static/description/icon.png
index a4d905166aa59e6a166c8470e20722e11ee5deb4..235f1adbd412989a95451755bae3311140abb7e5 100644
GIT binary patch
literal 6290
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
literal 6954
zcmV+_8`b2AP)Hf2)~RNNpUDDH|lfHDfs;0QJ
z?>V(sovONpQmMqdd6-!Ns0Etcy@l@4JvtcG??MLX4Gadh1$F^;1%?9`0S|A6d+G@c
z0^V}>Rox`Ji7|zlRRg1eCU<{r6Wq_&flrGmdTM{wK#Le-b7P3TfwO__fca*2fxADn
ziLSK>R8{!7#obHmFh7nqcW>Qfn8M7efOCOQ08`EE(;H)fYdK25YM>~lh~LG}=EM+#
zfD3^gwDzIEg=Ti7yU*VQmwXKHMZrF$i)P?z;GPcV9|(L0=%M*3z6wAM@RXT--`$%w
z6;1IT;CNslu)Cz!%uNX^?tU3?nVFpfd`$@2T*ofJ))|K05_m7LDKbT~B>gCvdxhk;
zv1Yc!-6yv*e>Kns^aDmDLJgo1n3rL;O@b+o0s1EkKjL4-6lOL?l5=VWwLDYn+?<)>
zEuaagOPHb+Sh^`L*4=+^X7>Wy0RJt?AIDJOA~QSD-Dg&qKN&c}%z6VS0cXVki8SWr
z>myKNX1##jfEV0-sm!*~GOuU3dwsE!H`)R?Op>4^W;(>oYW@WbaS-r3-~wQa3YQh$
z1^(U(!2Ob-$S-;ncxqE!u)CMs{biZiOEY-b4!Fe3hIDX`6~Jx4A_=u+z}@SKA%+7#
z1Fi=S(bw+-&I3*dzG-HIJ1a@|1I8v2t0Z%3=ZzVKF|*TwUjpNRUY&5vHrpX0I7`U-
z4e;;4SKNK&X0ZHMMbw3aUXbZ`v6aQC*%{aWI873LMS=2G(AV4#<~&s$HhE(p#o
z>mj;W0vdq6$^WZ>&jD`$m$WmtN!K?ewAUUkTH9Igj&lA>nYAHPyiS(TW5DdrXo`;l
zLx34_e8wi6wylWu@f;!^C5ODft{V=F1peyoztwg9^nD%SY+*Zb>mcAtcb_h&`WXG5
zns0r9ubEl2xhK2(+Y*Nm^%*mh@x*p_4Oh%dyx=wd^V3k
z%&b;XyKQAc>?)t(A~V|x_=dilV`i7Q`wL=#-h$6gnl~CaN0FE~&X#bx7g*kbKUDx;
z1nx_jPlUCLaJ`e@zue581#WWpSzTm`HsDS<-DxDPC-8MMd&S-FYKJKRR_77BnZ;=6
z&RXvZGn)?F;_lBSg70YH137Rw#LR|?N#_CAMB!fD0TI*+PzB&VF~`;k;Oj&rSz;V3
z`>nqoTCKlT;_Bb(x^sYIli%WXExfv*Z4Lu9x1)SUiib~kX1
zBw0}cW{jEr8Q4pq$pKn#55eV<$P_~QuD}@Jv>eS@%IvcMJPAAyiO$Rh0%uB4^wZv|
zw4V0^A2YLyfa}&)BkFmt3eT78{-s2yoo8kX-2KU%xo_v0$!6AHepWmlNY}eBaIBeK
z=I&Pz4s*XH*roJS1P<4yARp#wU^blyS^gWay(G|m`ZQ*2#Qn{zZ)V<`lAQCUU21e~
zNt=k{K|<=qDlu5K78$RLDsPs6R7il`sPAV0(`i42qX>LSVdSbrHOJ@F0>=TTy8^gba4jaEM&O2c_@!vfHS*O4$Ui()j{QnKb2#t=F-=!S(cS+j
zW^T-wzQYxf+CFDqYer*4Q}GI|afr0-SAi=N`WOP7X=a}m)64~4PXt7S<7=XwnZRFw
zg(fyPpc&o?(^<%=ywphiLIB
zQ!J1cI|w*f#862~#3+^dt#~qOQNs-7j|cS?>ND;KxbW
zv?vLGzEWZylId_}MwpbO9rjM(5)oD}MDL$yzDg2$H%Z?&fQjyYlDmJ;-G3;euFK5-
z8*oRWWqu-UP$lB|qPzbd_^wRKRH}a~NBFJHxI%)mEu+200hfy4^TO)QT5mOQzHnVF
z{D0ZqZ+G`|fV&dG(py%<&)j`qF-<9B)?F$Xe-Jp;-IsUB6lOM3liGlX-Mvi{AIog4
zR)m{3meaXY$oV-;k%lH$S0MIgcW=_C)Q$>o1%B@C-*xvtx%)km{Btu5K0=>3P7&e8
zYgPg`WbS{5)NUb>Mu!523uY^2vSgF_`TBCrUbJKcS5Ja5oGQ-L-%F=M+DNoxhZpPaK4GNIZFl>A5q
zL2#VRohY0hboUpN-*1q%NQL!YNi^&o5i;TD9X?BYn&JpTT0sMFZ}R;;vZqs4gXPV^&ANJ78`nJBX|_gM-2J)?E%M3iZWvNb1`|0Q?7
zL?Q3fqWQHJ`+8EU|AvGi>U6%*FIjh+9MGqAO&>ig65%S~Ni*whX8ncB>P#rKT4vz7
zgqYuwZ}v(CH_^ubfdUL`;7);n&nKF%37BkVy|mtu+RN$;ZIA8BI;$&ai5f}&8WGcY
zMP8z2sHc3IToNID5V&y@j-BT*(dwMvB2rAzvXp5SOGsqL3nKdJAp&w7b)k{idaioTT+oL-qQQOsEFogvJCZR^@?`pmBc(BF|(Vx5TV#q
z$IdzMX|7-nzML`tq8&astD)8*-ru2Sl;Aogquo}?bX<}Np!CSt*wMLNt-pa!g^qght2F_`JAzSv^zd7k`?^~My(D}2}_
zq_*aS_J#_ukqIV0N7{sqZdObHmD!NoGIced8srcZly8>KEY
zg>2~qw9w~(kBjpP8O?BuBu;!-e?r>Fj4mK{Q`9bbj(-dEZf}Xt-z!4AS#D>?v?GDX3idFW|vnen=Dn3vR!qwH+25fEXoH%Ba
zW?@|T6UD2ee3;gre=(Pk0lXv!hH)=bDCa-LbEgx`Y`YH3$&R#H$4sH9#BP+2
z=bvw9Gp`Wh>?uL@Rv0r4MP|zix6(mOI!5IXNvR#JP?E$Rv7U&kP$8o9eCD@Wg%0za
z@~Y%st0eu_mJz$6B}{gCbs|k03FjSI^Wr0fY~u;i7Fj>zS~HuF5|kL}<7Rf9PWQh~
zIdx@g!s+svnS1q>)+#8%)RE);SHi*E${bu2>#Z@fV}R?-Y(fS6
z7Apw1T&6fh8)^gok)HBZ7`MwAPtBqO&1{z>gt;QKnVkr!!`qqJK4$g{A+^YwxhaEE
z`&0ILmH{W4Sr0QCY-YPBMNc)IG!+XK7!V}~UaIF75(#yrnT<-2P@VW-asDH~pE6pl
zy0en19sEF2Sfyv5ML8cU?&oj7O*zbSrmTPm#k8#%A7oF$VdSl5c7d7wOxD6B5}0VO
zHHmXu1sssk7Q-l)8Vt%D%2i^F>ws$|NY@DJhz@T`XpJPea~p7{nO$UNmlE>2E+-ra
zMqg@qCd69=K5S;&ii!3}Pt>cm;9-OVq@xlb_0u6vgQ}rY02gH|_Ra}K4knyVo-G^o
zAA}s2LK1d6RT?EG$Gs&fTujvYS!VVb;2w9s9GFH(nJ6Y3`vl?CvX|8BNy@`NJn?lR
z0lweN?sE4A*~7yn>Bu;62P*4zsk=XDW|tFE26`tFYLc0qAzOE%e5+{3PXo?&_ZB^;
zFCkB=R|ZbonAyRA1Iv4ln5~;+A2aS${a-nKSoG`OUEkN+D9l`xtHSnAJ(25
z2nVn)iwXA22(sgMgNn;OcV*pU=I;84|^vOgTn|Z
z9g}hZu>OPWuL#L~6EbtE2`zjcA(VW6nR3Q&yrx$7yHc>d
zNa4$oy5VN!HXIKa7Ie(LcZxV6M$*jASF!ahCUna{KubJ6*n)M$K43>K3V-;|)b-rZl%+_NOhWr0H114V;R5fVwCP9tcAjoCI+S(aM}I1O0W0;9MXy
zKr3~yUbK#;PVTY4nBuLxdl%mAy=1#b_gJTMitf=px<@xtbdT=Q%@p0Edvr5J_vjwo
zOwm2MM>kV+kM6Nv$3}gVkP1p6FNn=ZGg4*({r{Y
z95}8bluFLr*k>b~>QGw8j)Y8r2H~+~E#}t{^0s2%+3|$KxE8^=;a$xXW;T?NqOiM&
zEatDY0CUakdUt=m6Svx#(8H+*Asyg+x>$?b&RWL;Um$cWjO{Vo#KhCh?CR{P>HpI)
zj*xm$M@UsakNg_;EPSiP07nYGlL!ZaClj()8wp8>Q{J`alTHyQ5)!v!G5jhqL^UA^
z>R0j!^&Is_WVkq)bp>(UORFy1Tb26=9^F9gAmP*Ba-G_}@oJ6If2j)Q!n%+a+4;
zVXgH@LiT70s5P@XcVDHHZELic}8`yWF{J(x?VX(cl*+@6pk6N%^9Sj421i1^~mfqK?F;JHl0f-Lio7asfQ>xIBm?*2vw*D)t*B_VHY
zdIrz2-ldP3?J420ijWsoB4jf6kp`Gc$Y_l%I{OlmPp1oi3$*@4T0^Y_)Ocy6w+XF@
zUUc_n;eMR%HA65mt!tWKuvX^vTBUgi_{S46PGfdvyg{>w=bCIMZ!S7!Asu_R0CbYH$pS)B*b+jopnU~Y*QR?4Nl;GfUP@>S`G}eAM@UZ}mT1H_LN~pe
zgoJbT?BznlVBMpYa-Y&=TFZPwvfB(`k-M)@-N;G6R+O`OTl9<@g}ih1`%1zaer6Jy
zg6$$ExRy|3@&WB{i5RAdkgPVAkbGC0?4w!m`X!+l>=;6#TmM9JM&`LX`}QE2FP{=I
z#pIPA+39rzB@qA6utJ^}nw8fhn)aeIm>28y9>6~UCG@lMEjNlI)^
z(MLk+Dne@aD}vW>LifQVMBvK_buo*@0Q>5hd8TWc@||tX6Z_dVB)`RuF-w#Akyeh<
zI_k8yr?r;&X03x+vscyjVvbe%egK)4t{Z|W8VJ>Bmr-sP8M7s00Z~WghuJRDbrES&
z$xleS^c3Q^r`%|Hx_}b_v6xUVFiAj-MNS7&Zr#671U6m3k8c{?IkT3(66zjqB{Y)0
zRA$~1%8h}0%G{Vp=)pQ#_gFwkss4#1W=TvpfzFkkM)RYn`R9sI$5ZY${s-Ovr()XQ
z3RZhkZdfo!+Q}(*?cR=1u#}EA%B8}C#CZJ`xVT+r$3EI`8}KK0KaWt$uv)O#opzcM
z%@LVbG45pl;6rZ
zBvJQU5!$iGIT0Bt^EMH3>KE&sY&&UhlVt{tksTa6?+vG1mmQluFA@PQ6eGtJ^K6ZJ
zi8Y%BkddY{-Tf7Xg!?Au(hQ|JFEF#~R3lJDxk|1ivvNYBjav105amKI1graGcJ!tE
znzk10^KQyzug!$I5C}zHjlw~%gdk~0V`N8bLJzT!sUZgrJrc9HNj^l$%wDG4jj^A6
z!8l%Z_jzVEFWLJBceHmPlz{e^DRZlA(~@xZJA=IBt)B#H(!!zBo(@bYdkH2HZjIAVuo7E1@86I
z5-4i1j|i=wxc(VAx2e54j8M^6O0>jcnL@kDgzA?_%^1~LNV&Ctws}G9Iu{x8G_`Tu
zDslD}5~|F06tRvWbhv0yBm^<$Q@SQ1_Bb)*u#A(LYLVDDVWpWpulv;iN9nCc!zG+*
zWF}3Pps1r<;@eNAMYE*)@|=+9=XKpOnZgU@yVVM}FG%B61BdH1Z{rdIe=Z~8V;7S~
zF;*?1T((+FmlA4ove#jRve+pZEwfzD7$XMzteL%!ay!!&MXLtnXr*-u)32>hF;m=%
z7~yn6LHvq@$==~p=!J&A7GtzZ+6=b@|FV+
zxVy_dSSG}uNa$2DUJ_>wXFmm^yDuP=J4WASqlQlbtL_9u6xy#4!#9T|Y!F&m?f*5FDF?xDUo6NYW
zdgf^PKEnjhzYt2Ii#hNsWIh{CQ>cFSa&2OOi1k?^WXHt5&YL?=uZeoEB+?dQki|m$
zOEK)Lw_~PnpP3^fK>xm7l5)0yzq_uTDuh9(!JZ@S)Gsl4p3|oK*XPdP4nha$Yc0
z&uY{)Q)6QScYoZ>UQ^UXM{?gjv1dy@$-x
zUb<#JFeP>^H?!*{aNd*H;fo|mXXW5xshM3SGij>?7jMQnvfr=O|92GezO8*tb@yfR
zY3>kw>LrwJ6b+0Pyq^$LZ6!K+Q~Ua*;I@T`{AsOqnBelNyDw4On)pVoIx+K1t)a=x
zrc!QN_hKScZx?;fqjT>_>DoC(CTdhzmk#3<-t;+4=ODF`90LWQYxRn#ifa+FOI`WB
zqkWRR$#h-Tu&y21JF}0j>@^P;>$?8VUcWZ?T^}&qpiHqLhM8@tgPx({?s(#RvAZv$
wdvuSDFse7P_0-Ew9+fz&le-zBdu+_{zjwt3pB@4U=l}o!07*qoM6N<$f`s&L>;M1&
diff --git a/addons/payment_authorize/static/description/icon.svg b/addons/payment_authorize/static/description/icon.svg
new file mode 100644
index 00000000000..c2755ee6bc7
--- /dev/null
+++ b/addons/payment_authorize/static/description/icon.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/addons/payment_buckaroo/static/description/icon.png b/addons/payment_buckaroo/static/description/icon.png
index 16d9fffd10d53153f7d332346934f27a7fe58701..b7ad04c3cfd604a0c06be74e09dcec81898b4ae5 100644
GIT binary patch
literal 5943
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
O0rGOnvL&zdeg6j+VUH#N
literal 3118
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
\ No newline at end of file
diff --git a/addons/payment_ogone/static/description/icon.png b/addons/payment_ogone/static/description/icon.png
index f82747245290cfb9037ce32929c0b6217259405d..1d0d993cba4c9cc00ae480a28c41b0598eb6197b 100644
GIT binary patch
literal 6060
zcmXw72T&7jv<*_E3lbp^P!U8>lx~6*P#|;=RC@2lBvJ$fLT^%pfYPP+7K&0dA%xID
zx|BdbItbExdGUYm&Fp?Vd%kne-h1xenVpT$)>LL;nSQD)cuO_nvR|t_8yAXZl!G_Z2Z`?EW2zrj*;@1QWkF`;bKIAhdNL
zTFKbXF*H%p(AL;5&NClp6O^E0Vs8Sr}p<-$evvJ$n+0}LSat`~XLn+_F
z`D=T>s;Rxcd$5+3i;A)RGXtCI?|8?s#8(KvwxJ0-&w%2u->pzFChtOzj*pGJKDcF6
zyTs+e%$yDmkG^#bXxYAVfoj_mC1Ygi-JHnsvjCaYSw5PuFCxxAa6Tl7!L
zZ|ds*NnUjJ4YdwVL=|Eai)*d?<6hdo{oc}{=Mf&2Q}O5TX5TN8wSTN-K)i*UUwvE8
zyYM*M_hF8Kv6jJ~{fh7rmBiTUR^Or~pTee?s@9n5R#Y)Qw46YBVZtg}A}U%!$_W0&
z_{d74Ur|$FX>)9KTU1qRa2er4B{8V9*|!KER7!YXfQznb4J#)^VTcixE$<7PK46F+
zYuW-zn!O8}0!k=?En(#?A?1XR)ouPI&Hg3$%C6D4nl_)JrYKD7_x{PyGD2i!OLg~n
zd~JK+zbIUIMN4BJDW##Ss%tC~L#*u?e_x3E+B@FRH<61UI6XZpA`W>K;Jos2GmER=
zeom}y@9pj%po;MLVRAre^V!)MlBf9-WfBD3UTEq9{u*s&B%QK!7#Xkiwmm6W%kOjA
zT-hW}e7s{`CjGrn#-@9}1^x&ZD3v1sb->qXScR#=0o}H7E!&}~m
zTe7YdW=}`%ur~BRO-lu@;~vP$dhHVS$v*pTKiSuOk%)JhqI8P_+?;9zua6h6t8D{f
zsT%sN^s7*u;m2!stlmBwdtd8U)@~nfcluy)X+Iacj%?BgS8Ke}HA@ICiCtw|`QKH$
zNYW-1kwlBl2G8^k@cUt8t@qxaF$4GUH{S{dXJ?lSWqFvDa;PG+p)tReNcIP3-HW}f
zmt@1ZxZaArfty_;rO8#lL&RmOR+Z>^^o8GBbR{ki$vfEGX6m=CRe7!6p!s3d0$C>b
zD{nRa^;T=%ZQ)^u{8@JC9{GHGHs!c$$1FGrr*4{ML_V|$^yAd~=b@J_jAZ>;F!Rq|
z^kX%B@%*U(IvY7~sfg>~u!Es--sZ2&$kiBLSKmM*@K{TMlyQ-(|L
z`I-qb$ebwXT~xU%KaIF~YoWp>J$Jf(D9O9eElL)g9T+N-zg!9Z{)#h}svuW%uv$cV
z%}SS<$DLmV-+XkL
zL!LXjqHPKULS($WS-j^aP2@&IK`1r>ToRScKQ6QEM{E}^j4-O;`(WCP&!bl*19Rk)
z`ET>9*0ywO2Q^<4T=18CGMMQvKb^^}lrJB9N)JMS2CcwDV!Z<2v=J(uAtBF@a&fuq
z4@u}!XU&!9=`=_dX2+6}VFlU5RqgRDY#Tqe%@PN-3*a;(Z{G
zSF9}b5WFcM`Z4_B57B}Q3x1KB7o3jFtW{>Im!X!-KeA+ASg1r^P0hT4a4RyWvj23`
zoorbEu1lh3)j8#7%AjZATM!kK5vjV+W=H^~Nk2}c{hXc+Esi(LF~I1p75|pblRYoO
zh|Q+nfD?JhzX2TPnpxVq@aycECVL_yY2u4mNP5+Va}DIqn1}*T`50W*s&%{7N*BDV
z1R?oFDk6h{EpMPzKadKT&{?676cN_e>)M}cLUSIu%P0l>`35C|8JJvK_$I8z5SzBD
z(X{r`7ht9A@EZtm<@e02(pcv@_JjO;ai?$=*K4X8c>)Pw&hI*P^>$M6UN`Z={u{g@bcGADC^<@7N6WfV^)Z{T|Tj64?1Nw67T)#-epwl?%<=4`-(fo0nQdG&
z_D#zZnvfdW((v1gHcx>C(MD5uc0elbxr}Axb;0LF$n?okD)$(B#)8dyCJz_(x9qZw
zxlKBBu~Z~!Qdqh8vHF6n~lmRRFTRL}(e4TkHv_r{J>JB+=JzEr=*sdV`
zF3}6E!0F$AXJA?Cj#no{A-|pGYEy?C84#TaU%!S^G#Gis(j(r?lcge&T6sB_EN}l*`
zm3mrSP9({!)jV__)(5ej9e#@1m;+Pk%OMQR)osyB`g*{}<~@?D!?XxGO(4RSTdj*q
zVhQYJKRZI5;Uka$q`lB&m4c82BVL2sNZD-d#{xO<5pjH
zLES={PKanYfQ|-A#nH-WS3I4vbgTEEZC6Eg8{u17jhY+LKHM|b3QJ9di6<2f>x@_#
z^Oex?jg~>ZTE9?|%F4~n4F|-1?MR}%ZL#^`>Q503t;cttxZMqNLaT~jb{+``1rVnJ
zj5%XHx|-&mThac)i0OKUOsRsGxYsn7g)tgT4jf^w$WHHR{;QvZBHvQW3o~;1Q8Nz6
z%{QI&py4zCDmWs4BPFK9RBXW9>!d*1r5-Dqnp;<6atRzdl`pI+ZjhV<_1l0yVl`7w
zq*)Nu!m_K%QPt3u{46Oh{%j0PnRRl(i1Qc;trpy3em2Ogp`~;sH=rc2H-KB25C6cE
zhSu!jU0Me9E0n-K&Xeh7-8IwURW6a30(4eX;#Uvyu*_VOWd69dB9fYk7jzpC0ids%
zrefW~*b6f&W931Cf$ptuz6r2qdMfrmRR}BiZeo=Um6EXpYLmKo(r)Kc+02^rb%f4z
zKt`L~GJ7+qImLLdOj4n|$Nscb>1*l<-h{xGulYDnd?@~B&~@Qvg)*wEO*&!DdQN$R
zNICAOUtssct5P{ZQZ=_glm=TLE0kdf&m*RLn|rk(y+8L%mlAGrJI8H?@$)23zRxcD
z-2njvJ@8;r5q0`wukq~INAvPh!@D2P6s)Y{;R&A}H*NfZ2lH|U%LBD<=uJNO=(JD3
z^s{oOD5-05w~9aQR>?SJ2@t7#$jjPD_`P`{=Ju;#g_Qd&>vM$;g=Tar3^`k7ejo~`
zIZX*Ds&-pb&&XtDVfL=kptIBQ%49}I>38u;xh;(wk2)?9s&VYXA2__K@;sPL6uDH*
z9sth#m9vJ2G(Q=F@jkQHDi*_LM#+F~WWgY+?o8n*EPSn>saRx{Z|i7L05gOEVcN=BO;BEm!A+&GGzwi
zROm1whb)P(Xpn#JKQl(AFZaDyK%kvR*zSt+q45f{+C6-q;5?US4NIaOm@~lB+;b>9
z&pk-sV8m3VQx!sgbj`567jnvVmzvIo;TqP|@852--)ANZ*e__=2k&~%hrjN|m@X~z
zM!1>c>agg;k<^=8mw)y75cV$ATBv8$ik=fIi>)vqme-Gt!T5Q>Dd==2s5_$mo>BQ%
z(NC$!$>`p88Q6t^W`Ere&{vlyJC=ZnFfConj3R}xB
z`%@G3mo#)JP3uABrf4_;)qtU^IMDHj3>7s=q&b_UkfR5k3jF}P6kAkBun$}H#!83|
zga;8Tmlk#l-F9a}Sx3%sWu@LrL|
z2y5=ohPk`v_SU_7x3{^F9#LOkPqa(jw}U_7=H?-em%juJ7ws0sKFag#=-9p9MHjI~&m1awDp6u;)s3V#P`A@RP7VQ8nK_32k@D
z6lTA+NryxhkDjpvXi_U5K~j_n2i@dCr~-`y*L~rSg-=gtD@>GzkeVgnQ<
z96_j=O$hD4y(pblyE7$r#W^aCQuO==geU)#WZ%6kX}N(%Ur~b!A+0Thrc-IkxK5T+ZnRN}XI_foxvd4}8L?
z6}xgQC{<@h^|2{qi2+??{Ukj8#W|f_$nTx5>_=9xm&33iV+k#uf4PTP1m9&B&_Mp#
zfpF#*ps10-dD>x4%+0`Syrv@5vr?#>ctLe~4lAm*WjM3CnHl_C$VKk}FQM2CR`jLo
zJO#7-$6*Ul4{5%DQte9PX|x~b
z32Fh5b&cm61qGm&su&nJ>P|Hl+xcf3ex5{k`e(uQU@oMy{8}IAr+He6S&Bd-NZbUu
z)Og}CbJsfIA4ChBnYq>%{022xYzBS`?ee^3wwsKT@3B@&309<->a=_0W;dIyoHoxN
zfIfG2%QrgwP7%Mr1a+&57iOM36LR={yaz{c;_dQJ@C&Yv4{@7A6gO=;HY$M<
zUq1>SAEe4~srb?ttdSECjF;0g1H?_YA-BQzZigz@e8F{0yhm0>SRO-Y87>_&nl(uL
zg`je(MA7Q*tF~q+^xPfY^`w@JmZ@8YCD$G=e#m03>8R`u+1h|a@vuHcRUb9FZ!<)%
zL^dDParN>6Z@of
z)+zOfVpUuyr=jq@=UJm3x_xheq~+d3Ms|qbUlP}Pqifi^MM>B7_wP<;Nv<=qq`z)!
zVz#XI+7NvPLvLRJM8g1td`7CpC5?TxI=(o+S*)_O8y#N0qw)PcN}`&NBy^q|$T+eJ
zW}jS2C0?97{*W9EhzTP>sbWmY;e9Kq#Q``_GX4fIJ)-wPLIdZ
zZck|hMK~?Avo#BRb4SBtHfDFQ^})83m#r@>U%rlkG5lcn5{qI7{bDVl6Wd)
zO$TMTBwB?vsCmN+H$bBac2hT`6v)>T_KVz7%r|r$mz0L1PKe#LUVSXe!|g|O;yHI$
zBX?&kcg%N(9@IYJuzI9w
z2&Y3Xh@VzDwh<`T>*+S@HqMs!)Prj3lk4)jM%*0wQ_ja5b|0GuW0!ZH(B9BP)}hcQ
zGTU5Isns;^Iv)zJrgAt93jF%zH%4mkc;_OUjS2#X3{T;bC3m<4r2MmXJXxP8k3iJs
zk6?MmVrEBGruP(g;0S$~y3x7qdR{Uv$&pSN=uZ`$3x}#NlX@8bIG!uDjDoOV&ooFw
zX5CJq_aEHR8i7!CFTZ7{jFJulQI>nwQ;NYQ)r(x15gxVnt(G=@s?ROTsjhevEB2JP(Af`VK-^*2V58f3Xyy5wk?edf;|6
zG&Z?b7Yjhz#xVqr!CSuDhsD3eMt*8xm~H5u;}ciV*yIbghJL_of{!%SK~$&>WeBw5QS_zEFwQ#0Wa9hk%W)(8_zW8^Mwxo
zrF3R@?V@!`ZN<+NB3jE$(459H@<(EYKJ
z`bVV0?8LBJ%VD>N?L%464YwB*ux?JQ_42kZkFV|r%w#!p@(@!ozR8!iMu18A*FF`x9eLFnBFSMg|wh
zw3e0dAgw+&*8A*=M70d(w2jNox
A$^ZZW
literal 8748
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