From ac99b09cdc1da0ce191124603dee71c6a2c1c4bd Mon Sep 17 00:00:00 2001 From: Thanh Dodeur Date: Mon, 12 Jul 2021 17:20:53 +0000 Subject: [PATCH] [IMP] mail*: add audio and video conference with webRTC MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit *test_discuss_full,test_lint This commit adds the audio and video conference feature to mail channels and integrate it with the groupDM/guest features. Adds new mp3 and ogg files (from task-2554674) for sound effects. - Adds three new tables: * `mail.channel.rtc.session` to manage the peerToPeer interactions during rtc calls. * `mail.ice.server` to provide ICE servers necessary to establish peerToPeer connections with webRtc. * `res.users.settings.volumes` to hold the partner-to-partner volume settings, each partner can create one new setting per other partner to configure the volume coming from those partners during calls. - changes res.config.settings: * Adds new fields for the Twilio credentials to use their STUN/TURN service. - changes res.user.settings: * Adds 4 fields for the push to talk and voice activation. - changes mail.channel: * Adds a new field `rtc_session_ids` that represents the active participants in a rtc call on that channel. - changes mail.channel.partner: * Adds a new field `rtc_inviting_session_id` that represents the rtcSession of the user that is inviting that channelPartner to a call. task-2366708 closes odoo/odoo#66611 Signed-off-by: Sébastien Theys (seb) --- addons/mail/__manifest__.py | 2 + addons/mail/controllers/discuss.py | 87 +- addons/mail/models/__init__.py | 3 + addons/mail/models/mail_channel.py | 185 ++- addons/mail/models/mail_channel_partner.py | 24 + .../mail/models/mail_channel_rtc_session.py | 131 ++ addons/mail/models/mail_ice_server.py | 57 + addons/mail/models/res_config_settings.py | 13 + addons/mail/models/res_users_settings.py | 35 +- .../mail/models/res_users_settings_volumes.py | 23 + addons/mail/security/ir.model.access.csv | 6 + addons/mail/security/mail_security.xml | 22 + addons/mail/static/src/audio/call_02_in_.mp3 | Bin 0 -> 99566 bytes addons/mail/static/src/audio/call_02_in_.ogg | Bin 0 -> 30742 bytes .../mail/static/src/audio/channel_01_in.mp3 | Bin 0 -> 17560 bytes .../mail/static/src/audio/channel_01_in.ogg | Bin 0 -> 9859 bytes .../mail/static/src/audio/channel_01_out.mp3 | Bin 0 -> 18812 bytes .../mail/static/src/audio/channel_01_out.ogg | Bin 0 -> 10476 bytes .../mail/static/src/audio/channel_04_out.mp3 | Bin 0 -> 6918 bytes .../mail/static/src/audio/channel_04_out.ogg | Bin 0 -> 7587 bytes addons/mail/static/src/audio/dm_01.mp3 | Bin 0 -> 20690 bytes addons/mail/static/src/audio/dm_01.ogg | Bin 0 -> 10751 bytes addons/mail/static/src/audio/dm_02.mp3 | Bin 0 -> 7544 bytes addons/mail/static/src/audio/dm_02.ogg | Bin 0 -> 7776 bytes addons/mail/static/src/audio/share_02.mp3 | Bin 0 -> 32584 bytes addons/mail/static/src/audio/share_02.ogg | Bin 0 -> 19673 bytes .../chat_window_header/chat_window_header.js | 18 + .../chat_window_header/chat_window_header.xml | 8 + .../tests/chat_window_manager_tests.js | 16 +- .../discuss_sidebar_category_item.scss | 8 + .../discuss_sidebar_category_item.xml | 3 + .../rtc_activity_notice.js | 39 + .../rtc_activity_notice.scss | 33 + .../rtc_activity_notice.xml | 23 + .../rtc_call_participant_card.js | 58 + .../rtc_call_participant_card.scss | 160 +++ .../rtc_call_participant_card.xml | 93 ++ .../rtc_call_viewer/rtc_call_viewer.js | 152 +++ .../rtc_call_viewer/rtc_call_viewer.scss | 114 ++ .../rtc_call_viewer/rtc_call_viewer.xml | 73 ++ .../rtc_configuration_menu.js | 93 ++ .../rtc_configuration_menu.scss | 97 ++ .../rtc_configuration_menu.xml | 72 ++ .../rtc_controller/rtc_controller.js | 45 + .../rtc_controller/rtc_controller.scss | 84 ++ .../rtc_controller/rtc_controller.xml | 121 ++ .../rtc_invitation_card.js | 58 + .../rtc_invitation_card.scss | 95 ++ .../rtc_invitation_card.xml | 33 + .../rtc_invitations/rtc_invitations.js | 27 + .../rtc_invitations/rtc_invitations.scss | 13 + .../rtc_invitations/rtc_invitations.xml | 14 + .../rtc_layout_menu/rtc_layout_menu.js | 38 + .../rtc_layout_menu/rtc_layout_menu.scss | 55 + .../rtc_layout_menu/rtc_layout_menu.xml | 118 ++ .../rtc_option_list/rtc_option_list.js | 38 + .../rtc_option_list/rtc_option_list.scss | 51 + .../rtc_option_list/rtc_option_list.xml | 23 + .../src/components/rtc_video/rtc_video.js | 80 ++ .../src/components/rtc_video/rtc_video.scss | 18 + .../src/components/rtc_video/rtc_video.xml | 10 + .../components/thread_view/thread_view.scss | 4 + .../components/thread_view/thread_view.xml | 3 + .../thread_view_topbar/thread_view_topbar.js | 22 + .../thread_view_topbar/thread_view_topbar.xml | 8 + .../channel_invitation_form.js | 12 + .../src/models/chat_window/chat_window.js | 16 + .../static/src/models/messaging/messaging.js | 85 +- .../messaging_initializer.js | 20 +- .../messaging_notification_handler.js | 126 +- .../mail/static/src/models/partner/partner.js | 12 + addons/mail/static/src/models/rtc/rtc.js | 1132 +++++++++++++++++ .../rtc_call_participant_card.js | 197 +++ .../models/rtc_call_viewer/rtc_call_viewer.js | 424 ++++++ .../rtc_configuration_menu.js | 124 ++ .../models/rtc_controller/rtc_controller.js | 113 ++ .../models/rtc_layout_menu/rtc_layout_menu.js | 67 + .../models/rtc_option_list/rtc_option_list.js | 65 + .../src/models/rtc_session/rtc_session.js | 473 +++++++ .../src/models/sound_effect/sound_effect.js | 87 ++ .../src/models/sound_effects/sound_effects.js | 55 + .../mail/static/src/models/thread/thread.js | 176 +++ .../src/models/thread_view/thread_view.js | 22 + .../src/models/thread_view/thread_viewer.js | 6 + addons/mail/static/src/models/user/user.js | 12 - .../src/models/user_setting/user_setting.js | 318 +++++ .../models/volume_setting/volume_setting.js | 95 ++ .../media_monitoring/media_monitoring.js | 179 +++ .../rtc_activity_notice.js | 40 + .../rtc_activity_notice.xml | 8 + .../static/src/worklets/audio_processor.js | 95 ++ .../mail/views/mail_channel_partner_views.xml | 1 + .../views/mail_channel_rtc_session_views.xml | 65 + addons/mail/views/mail_ice_server_views.xml | 43 + addons/mail/views/mail_menus.xml | 10 + .../mail/views/res_config_settings_views.xml | 37 + .../mail/views/res_users_settings_views.xml | 36 + .../tests/test_performance.py | 6 +- odoo/addons/test_lint/tests/test_eslint.py | 1 + 99 files changed, 6736 insertions(+), 28 deletions(-) create mode 100644 addons/mail/models/mail_channel_rtc_session.py create mode 100644 addons/mail/models/mail_ice_server.py create mode 100644 addons/mail/models/res_users_settings_volumes.py create mode 100644 addons/mail/static/src/audio/call_02_in_.mp3 create mode 100644 addons/mail/static/src/audio/call_02_in_.ogg create mode 100644 addons/mail/static/src/audio/channel_01_in.mp3 create mode 100644 addons/mail/static/src/audio/channel_01_in.ogg create mode 100644 addons/mail/static/src/audio/channel_01_out.mp3 create mode 100644 addons/mail/static/src/audio/channel_01_out.ogg create mode 100644 addons/mail/static/src/audio/channel_04_out.mp3 create mode 100644 addons/mail/static/src/audio/channel_04_out.ogg create mode 100644 addons/mail/static/src/audio/dm_01.mp3 create mode 100644 addons/mail/static/src/audio/dm_01.ogg create mode 100644 addons/mail/static/src/audio/dm_02.mp3 create mode 100644 addons/mail/static/src/audio/dm_02.ogg create mode 100644 addons/mail/static/src/audio/share_02.mp3 create mode 100644 addons/mail/static/src/audio/share_02.ogg create mode 100644 addons/mail/static/src/components/rtc_activity_notice/rtc_activity_notice.js create mode 100644 addons/mail/static/src/components/rtc_activity_notice/rtc_activity_notice.scss create mode 100644 addons/mail/static/src/components/rtc_activity_notice/rtc_activity_notice.xml create mode 100644 addons/mail/static/src/components/rtc_call_participant_card/rtc_call_participant_card.js create mode 100644 addons/mail/static/src/components/rtc_call_participant_card/rtc_call_participant_card.scss create mode 100644 addons/mail/static/src/components/rtc_call_participant_card/rtc_call_participant_card.xml create mode 100644 addons/mail/static/src/components/rtc_call_viewer/rtc_call_viewer.js create mode 100644 addons/mail/static/src/components/rtc_call_viewer/rtc_call_viewer.scss create mode 100644 addons/mail/static/src/components/rtc_call_viewer/rtc_call_viewer.xml create mode 100644 addons/mail/static/src/components/rtc_configuration_menu/rtc_configuration_menu.js create mode 100644 addons/mail/static/src/components/rtc_configuration_menu/rtc_configuration_menu.scss create mode 100644 addons/mail/static/src/components/rtc_configuration_menu/rtc_configuration_menu.xml create mode 100644 addons/mail/static/src/components/rtc_controller/rtc_controller.js create mode 100644 addons/mail/static/src/components/rtc_controller/rtc_controller.scss create mode 100644 addons/mail/static/src/components/rtc_controller/rtc_controller.xml create mode 100644 addons/mail/static/src/components/rtc_invitation_card/rtc_invitation_card.js create mode 100644 addons/mail/static/src/components/rtc_invitation_card/rtc_invitation_card.scss create mode 100644 addons/mail/static/src/components/rtc_invitation_card/rtc_invitation_card.xml create mode 100644 addons/mail/static/src/components/rtc_invitations/rtc_invitations.js create mode 100644 addons/mail/static/src/components/rtc_invitations/rtc_invitations.scss create mode 100644 addons/mail/static/src/components/rtc_invitations/rtc_invitations.xml create mode 100644 addons/mail/static/src/components/rtc_layout_menu/rtc_layout_menu.js create mode 100644 addons/mail/static/src/components/rtc_layout_menu/rtc_layout_menu.scss create mode 100644 addons/mail/static/src/components/rtc_layout_menu/rtc_layout_menu.xml create mode 100644 addons/mail/static/src/components/rtc_option_list/rtc_option_list.js create mode 100644 addons/mail/static/src/components/rtc_option_list/rtc_option_list.scss create mode 100644 addons/mail/static/src/components/rtc_option_list/rtc_option_list.xml create mode 100644 addons/mail/static/src/components/rtc_video/rtc_video.js create mode 100644 addons/mail/static/src/components/rtc_video/rtc_video.scss create mode 100644 addons/mail/static/src/components/rtc_video/rtc_video.xml create mode 100644 addons/mail/static/src/models/rtc/rtc.js create mode 100644 addons/mail/static/src/models/rtc_call_participant_card/rtc_call_participant_card.js create mode 100644 addons/mail/static/src/models/rtc_call_viewer/rtc_call_viewer.js create mode 100644 addons/mail/static/src/models/rtc_configuration_menu/rtc_configuration_menu.js create mode 100644 addons/mail/static/src/models/rtc_controller/rtc_controller.js create mode 100644 addons/mail/static/src/models/rtc_layout_menu/rtc_layout_menu.js create mode 100644 addons/mail/static/src/models/rtc_option_list/rtc_option_list.js create mode 100644 addons/mail/static/src/models/rtc_session/rtc_session.js create mode 100644 addons/mail/static/src/models/sound_effect/sound_effect.js create mode 100644 addons/mail/static/src/models/sound_effects/sound_effects.js create mode 100644 addons/mail/static/src/models/user_setting/user_setting.js create mode 100644 addons/mail/static/src/models/volume_setting/volume_setting.js create mode 100644 addons/mail/static/src/utils/media_monitoring/media_monitoring.js create mode 100644 addons/mail/static/src/widgets/rtc_activity_notice/rtc_activity_notice.js create mode 100644 addons/mail/static/src/widgets/rtc_activity_notice/rtc_activity_notice.xml create mode 100644 addons/mail/static/src/worklets/audio_processor.js create mode 100644 addons/mail/views/mail_channel_rtc_session_views.xml create mode 100644 addons/mail/views/mail_ice_server_views.xml diff --git a/addons/mail/__manifest__.py b/addons/mail/__manifest__.py index 08583e60bc5..fe5779b668f 100644 --- a/addons/mail/__manifest__.py +++ b/addons/mail/__manifest__.py @@ -23,7 +23,9 @@ 'views/mail_message_views.xml', 'views/mail_mail_views.xml', 'views/mail_followers_views.xml', + 'views/mail_ice_server_views.xml', 'views/mail_channel_partner_views.xml', + 'views/mail_channel_rtc_session_views.xml', 'views/mail_channel_views.xml', 'views/mail_shortcode_views.xml', 'views/mail_activity_views.xml', diff --git a/addons/mail/controllers/discuss.py b/addons/mail/controllers/discuss.py index 7492c2c96df..c8c971350f0 100644 --- a/addons/mail/controllers/discuss.py +++ b/addons/mail/controllers/discuss.py @@ -6,7 +6,7 @@ from datetime import datetime, timedelta from odoo import http from odoo.http import request -from odoo.tools import consteq +from odoo.tools import consteq, file_open from odoo.tools.misc import get_lang from odoo.tools.translate import _ from werkzeug.exceptions import NotFound @@ -297,3 +297,88 @@ class DiscussController(http.Controller): except Exception: return {} return records._message_get_suggested_recipients() + + # -------------------------------------------------------------------------- + # RTC API TODO move check logic in routes. + # -------------------------------------------------------------------------- + + @http.route('/mail/rtc/session/notify_call_members', methods=['POST'], type="json", auth="public") + def session_call_notify(self, sender_session_id, target_session_ids=None, content=None): + """ Sends content to other session of the same channel, only works of the user is the user of that session. + This is used to send peer to peer information between sessions. + + :param int sender_session_id: id of the session from which the content is sent + :param list target_session_ids: list of the ids of the sessions that should receive the content + :param content: the content to send to the other sessions + """ + if request.env.user._is_public(): + guest = request.env['mail.guest']._get_guest_from_request(request) + if guest: + session = guest.env['mail.channel.rtc.session'].sudo().browse(int(sender_session_id)) + if session.exists() and session.guest_id == guest: + session._notify_peers(target_session_ids, content) + return + raise NotFound() + session = request.env['mail.channel.rtc.session'].sudo().browse(int(sender_session_id)) + if session.exists() and session.partner_id == request.env.user.partner_id: + session._notify_peers(target_session_ids, content) + + @http.route('/mail/rtc/session/update_and_broadcast', methods=['POST'], type="json", auth="public") + def session_update_and_broadcast(self, session_id, values): + """ Update a RTC session and broadcasts the changes to the members of its channel, + only works of the user is the user of that session. + :param int session_id: id of the session to update + :param dict values: write dict for the fields to update + """ + if request.env.user._is_public(): + guest = request.env['mail.guest']._get_guest_from_request(request) + if guest: + session = guest.env['mail.channel.rtc.session'].sudo().browse(int(session_id)).exists() + if session and session.guest_id == guest: + session._update_and_broadcast(values) + return + raise NotFound() + session = request.env['mail.channel.rtc.session'].sudo().browse(int(session_id)).exists() + if session and session.partner_id == request.env.user.partner_id: + session._update_and_broadcast(values) + + @http.route('/mail/rtc/channel/join_call', methods=['POST'], type="json", auth="public") + def channel_call_join(self, channel_id): + """ Joins the RTC call of a channel if the user is a member of that channel + :param int channel_id: id of the channel to join + """ + channel_partner_sudo = request.env['mail.channel.partner']._get_as_sudo_from_request_or_raise(request=request, channel_id=int(channel_id)) + return channel_partner_sudo.channel_id._join_call() + + @http.route('/mail/rtc/channel/leave_call', methods=['POST'], type="json", auth="public") + def channel_call_leave(self, channel_id): + """ Disconnects the current user from a rtc call and clears any invitation sent to that user on this channel + :param int channel_id: id of the channel from which to disconnect + """ + channel_partner_sudo = request.env['mail.channel.partner']._get_as_sudo_from_request_or_raise(request=request, channel_id=int(channel_id)) + channel_partner_sudo.channel_id._leave_call() + + @http.route('/mail/rtc/channel/cancel_call_invitation', methods=['POST'], type="json", auth="public") + def channel_call_cancel_invitation(self, channel_id, partner_ids=None, guest_ids=None): + """ Sends invitations to join the RTC call to all connected members of the thread who are not already invited. + :param list partner_ids: list of the partner ids to invite + :param list guest_ids: list of the guest ids to invite + + if either partner_ids or guest_ids is set, only the specified ids will be invited. + """ + channel_partner_sudo = request.env['mail.channel.partner']._get_as_sudo_from_request_or_raise(request=request, channel_id=int(channel_id)) + channel_partner_sudo.channel_id._cancel_rtc_invitations(partner_ids=partner_ids, guest_ids=guest_ids, inviting_member=channel_partner_sudo) + + @http.route('/mail/rtc/audio_worklet_processor', methods=['GET'], type='http', auth='public') + def audio_worklet_processor(self): + """ Returns a JS file that declares a WorkletProcessor class in + a WorkletGlobalScope, which means that it cannot be added to the + bundles like other assets. + """ + return request.make_response( + file_open('mail/static/src/worklets/audio_processor.js', 'rb').read(), + headers=[ + ('Content-Type', 'application/javascript'), + ('Cache-Control', 'max-age=%s' % http.STATIC_CACHE), + ] + ) diff --git a/addons/mail/models/__init__.py b/addons/mail/models/__init__.py index 616d82f72f0..b2d16600dd2 100644 --- a/addons/mail/models/__init__.py +++ b/addons/mail/models/__init__.py @@ -28,10 +28,13 @@ from . import mail_template # discuss from . import mail_channel_partner +from . import mail_channel_rtc_session from . import mail_channel from . import mail_guest +from . import mail_ice_server from . import mail_shortcode from . import res_users_settings +from . import res_users_settings_volumes # odoo models from . import ir_action_act_window diff --git a/addons/mail/models/mail_channel.py b/addons/mail/models/mail_channel.py index 73d44b1f5ba..aa0f362cfb4 100644 --- a/addons/mail/models/mail_channel.py +++ b/addons/mail/models/mail_channel.py @@ -69,6 +69,7 @@ class Channel(models.Model): channel_last_seen_partner_ids = fields.One2many( 'mail.channel.partner', 'channel_id', string='Last Seen', groups='base.group_user') + rtc_session_ids = fields.One2many('mail.channel.rtc.session', 'channel_id', groups="base.group_system") is_member = fields.Boolean('Is Member', compute='_compute_is_member', compute_sudo=True) member_count = fields.Integer(string="Member Count", compute='_compute_member_count', help="Excluding guests from count.") group_ids = fields.Many2many( @@ -288,7 +289,7 @@ class Channel(models.Model): }) return result - def add_members(self, partner_ids=None, guest_ids=None): + def add_members(self, partner_ids=None, guest_ids=None, invite_to_rtc_call=False): """ Adds the given partner_ids and guest_ids as member of self channels. """ self.check_access_rights('write') self.check_access_rule('write') @@ -316,6 +317,8 @@ class Channel(models.Model): 'channel_id': channel.id, } for partner in guests - existing_guests] new_members = self.env['mail.channel.partner'].sudo().create(members_to_create) + if invite_to_rtc_call: + self._invite_members_to_rtc(partner_ids=partner_ids, guest_ids=guest_ids) for channel_partner in new_members.filtered(lambda channel_partner: channel_partner.partner_id): user = channel_partner.partner_id.user_ids[0] if channel_partner.partner_id.user_ids else self.env['res.users'] # notify invited members through the bus @@ -337,16 +340,18 @@ class Channel(models.Model): new_partner_name=channel_partner.partner_id.name, ) channel_partner.channel_id.message_post(body=notification, message_type="notification", subtype_xmlid="mail.mt_comment", notify_by_email=False) + new_partner_data = { + 'id': channel_partner.partner_id.id, + 'im_status': channel_partner.partner_id.im_status, + 'name': channel_partner.partner_id.name, + } self.env['bus.bus'].sendone((self._cr.dbname, 'mail.channel', channel_partner.channel_id.id), { 'type': 'mail.channel_update', 'payload': { 'id': channel_partner.channel_id.id, 'memberCount': channel_partner.channel_id.member_count, - 'members': [('insert', { - 'id': channel_partner.partner_id.id, - 'im_status': channel_partner.partner_id.im_status, - 'name': channel_partner.partner_id.name, - })], + 'members': [('insert', new_partner_data)], + 'invitedPartners': [('insert', [{'id': new_partner_data['id']}] if invite_to_rtc_call else [])] }, }) @@ -379,6 +384,167 @@ class Channel(models.Model): return False return True + # ------------------------------------------------------------ + # RTC + # ------------------------------------------------------------ + + def _cancel_rtc_invitations(self, partner_ids=None, guest_ids=None, inviting_member=None): + """ Cancels the invitations of the RTC call from all invited members (or the specified partner_ids). + :param list partner_ids: list of the partner ids from which the invitation has to be removed + :param list guest_ids: list of the guest ids from which the invitation has to be removed + if either partner_ids or guest_ids is set, only the specified ids will be invited. + :param inviting_member: if specified, only removes invitations if they are coming + from this channel member + """ + self.ensure_one() + notifications = [] + domain = ['&', ('rtc_inviting_session_id', '!=', False), ('channel_id', '=', self.id)] + if inviting_member: + domain = expression.AND([domain, [('rtc_inviting_session_id.channel_partner_id', '=', inviting_member.id)]]) + if partner_ids or guest_ids: + domain = expression.AND([domain, ['|', ('partner_id', 'in', partner_ids or []), ('guest_id', 'in', guest_ids or [])]]) + channel_partners = self.env['mail.channel.partner'].search(domain) + for member in channel_partners: + member.write({'rtc_inviting_session_id': False}) + model, record_id = ('mail.guest', member.guest_id.id) if member.guest_id else ('res.partner', member.partner_id.id) + notifications.append([ + (self._cr.dbname, model, record_id), + { + 'type': 'rtc_incoming_invitation_update', + 'payload': { + 'channelId': self.id, + }, + }, + ]) + self.env['bus.bus'].sendmany(notifications) + + def _invite_members_to_rtc(self, partner_ids=None, guest_ids=None): + """ Sends invitations to join the RTC call to all connected members of the thread who are not already invited. + :param list partner_ids: list of the partner ids to invite + :param list guest_ids: list of the guest ids to invite + + if either partner_ids or guest_ids is set, only the specified ids will be invited. + """ + self.ensure_one() + + guest = self.env.context.get('guest') + partner = None if guest else self.env.user.partner_id + + def is_current_user(r): + return (guest and r.guest_id == guest) or r.partner_id == partner + + current_rtc_session = self.rtc_session_ids.filtered(is_current_user) + if not current_rtc_session: + return + + current_sessions_channel_partners = self.rtc_session_ids.channel_partner_id + notifications = [] + invited_partners = [] + invited_guests = [] + domain = ['&', '&', ('rtc_inviting_session_id', '=', False), ('channel_id', '=', self.id), ('id', 'not in', current_sessions_channel_partners.ids)] + if partner: + domain = expression.AND([domain, [('partner_id', '!=', partner.id)]]) + if guest: + domain = expression.AND([domain, [('guest_id', '!=', guest.id)]]) + if partner_ids or guest_ids: + domain = expression.AND([domain, ['|', ('partner_id', 'in', partner_ids or []), ('guest_id', 'in', guest_ids or [])]]) + channel_partners = self.env['mail.channel.partner'].search(domain) + for member in channel_partners: + member.rtc_inviting_session_id = current_rtc_session.id + if member.partner_id: + invited_partners.append({ + 'id': member.partner_id.id, + 'name': member.partner_id.name, + }) + elif member.guest_id: + invited_guests.append({ + 'id': member.guest_id.id, + 'name': member.guest_id.name, + }) + model, record_id = ('mail.guest', member.guest_id.id) if member.guest_id else ('res.partner', member.partner_id.id) + notifications.append([ + (self._cr.dbname, model, record_id), + { + 'type': 'rtc_incoming_invitation_update', + 'payload': { + 'channelId': self.id, + 'rtcSession': current_rtc_session._mail_rtc_session_format(), + }, + }, + ]) + notification = _('%s started a live conference', partner.name) + self.message_post(body=notification, message_type="notification") + self.env['bus.bus'].sendmany(notifications) + return invited_partners, invited_guests + + def _join_call(self): + self.ensure_one() + session_data, session_id = self._update_call_participation(joining=True) + if not session_id: + return + ice_servers = self.env['mail.ice.server']._get_ice_servers() + invited_partners = [] + invited_guests = [] + if len(self.rtc_session_ids) == 1 and self.channel_type in {'chat', 'group'}: + invited_partners, invited_guests = self._invite_members_to_rtc() + return { + 'rtcSessions': session_data, + 'iceServers': ice_servers or False, + 'invitedGuests': invited_guests, + 'invitedPartners': invited_partners, + 'sessionId': session_id, + } + + def _leave_call(self): + self.ensure_one() + self._update_call_participation(joining=False) + + def _update_call_participation(self, joining=True): + """ Updates the call participation of the current partner and notifies members of + the channel if necessary. + :param bool joining : true if joining the call, false if leaving. + """ + guest = self.env.context.get('guest') + partner = None if guest else self.env.user.partner_id + new_session_id = None + if partner: + domain = [('partner_id', '=', partner.id)] + else: + domain = [('guest_id', '=', guest.id)] + current_channel_partner = self.env['mail.channel.partner'].search(domain, limit=1) + + if not current_channel_partner: + return + current_channel_partner._remove_rtc_invitation() + old_sessions = self.rtc_session_ids.filtered(lambda s: s.channel_partner_id == current_channel_partner) + old_sessions._disconnect() + if joining: + new_session = self.env['mail.channel.rtc.session'].create({'channel_partner_id': current_channel_partner.id}) + new_session_id = new_session.id + elif not old_sessions: + return + + session_data_by_channel = self._notify_rtc_sessions_change() + return session_data_by_channel.get(self.id, []), new_session_id + + def _notify_rtc_sessions_change(self): + session_data_by_channel = self.rtc_session_ids._mail_rtc_session_format_by_channel() + notifications = [] + for record in self: + sessions_data = session_data_by_channel.get(record.id, []) + if not sessions_data: + # if there is no member left in the rtc call, all invitations are reset + record._cancel_rtc_invitations() + notifications.append([(self._cr.dbname, 'mail.channel', record.id), { + 'type': 'rtc_sessions_update', + 'payload': { + 'channelId': record.id, + 'rtcSessions': sessions_data, + }, + }]) + self.env['bus.bus'].sendmany(notifications) + return session_data_by_channel + # ------------------------------------------------------------ # MAILING # ------------------------------------------------------------ @@ -615,6 +781,7 @@ class Channel(models.Model): if not self: return [] channel_infos = [] + rtc_sessions_by_channel = self.sudo().rtc_session_ids._mail_rtc_session_format_by_channel() channel_last_message_ids = dict((r['id'], r['message_id']) for r in self._channel_last_message_ids()) for channel in self: info = { @@ -650,6 +817,8 @@ class Channel(models.Model): info['custom_channel_name'] = partner_channel.custom_channel_name info['is_pinned'] = partner_channel.is_pinned info['last_interest_dt'] = partner_channel.last_interest_dt.strftime(DEFAULT_SERVER_DATETIME_FORMAT) + if partner_channel.rtc_inviting_session_id: + info['rtc_inviting_session'] = {'id': partner_channel.rtc_inviting_session_id.id} # add members infos if channel.channel_type != 'channel': # avoid sending potentially a lot of members for big channels @@ -663,6 +832,10 @@ class Channel(models.Model): 'seen_message_id': cp.seen_message_id.id, } for cp in channel_partners], key=lambda p: p['partner_id']) + # add rtc sessions infos + if rtc_sessions_by_channel.get(channel.id): + info['rtc_sessions'] = rtc_sessions_by_channel[channel.id] + channel_infos.append(info) return channel_infos diff --git a/addons/mail/models/mail_channel_partner.py b/addons/mail/models/mail_channel_partner.py index b12024ef771..c9cf5275982 100644 --- a/addons/mail/models/mail_channel_partner.py +++ b/addons/mail/models/mail_channel_partner.py @@ -27,6 +27,30 @@ class ChannelPartner(models.Model): is_minimized = fields.Boolean("Conversation is minimized") is_pinned = fields.Boolean("Is pinned on the interface", default=True) last_interest_dt = fields.Datetime("Last Interest", default=fields.Datetime.now, help="Contains the date and time of the last interesting event that happened in this channel for this partner. This includes: creating, joining, pinning, and new message posted.") + rtc_inviting_session_id = fields.Many2one('mail.channel.rtc.session', string='Ringing session') + + def _remove_rtc_invitation(self): + """ Removes the invitation to the rtc call and notifies the inviting partner if removed. """ + notifications = [] + for record in self: + if not record.rtc_inviting_session_id: + continue + model, record_id = ('mail.guest', record.rtc_inviting_session_id.guest_id.id) if record.rtc_inviting_session_id.guest_id else ( + 'res.partner', record.rtc_inviting_session_id.partner_id.id) + payload = {'channelId': record.channel_id.id} + if record.partner_id: + payload['partnerId'] = record.partner_id.id + else: + payload['guestId'] = record.guest_id.id + notifications.append([ + (self._cr.dbname, model, record_id), + { + 'type': 'rtc_outgoing_invitation_ended', + 'payload': payload, + }, + ]) + self.write({'rtc_inviting_session_id': False}) + self.env['bus.bus'].sendmany(notifications) def init(self): self.env.cr.execute("CREATE UNIQUE INDEX IF NOT EXISTS mail_channel_partner_partner_unique ON %s (channel_id, partner_id) WHERE partner_id IS NOT NULL" % self._table) diff --git a/addons/mail/models/mail_channel_rtc_session.py b/addons/mail/models/mail_channel_rtc_session.py new file mode 100644 index 00000000000..faf7f9b6639 --- /dev/null +++ b/addons/mail/models/mail_channel_rtc_session.py @@ -0,0 +1,131 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from dateutil.relativedelta import relativedelta + +from odoo import api, fields, models + + +class MailRtcSession(models.Model): + _name = 'mail.channel.rtc.session' + _description = 'Mail RTC session' + + channel_partner_id = fields.Many2one('mail.channel.partner', index=True, required=True, ondelete='cascade') + channel_id = fields.Many2one('mail.channel', related='channel_partner_id.channel_id', store=True, readonly=True) + partner_id = fields.Many2one('res.partner', related='channel_partner_id.partner_id', string="Partner") + guest_id = fields.Many2one('mail.guest', related='channel_partner_id.guest_id') + + write_date = fields.Datetime("Last Updated On", index=True) + + is_screen_sharing_on = fields.Boolean(string="Is sharing the screen") + is_camera_on = fields.Boolean(string="Is sending user video") + is_muted = fields.Boolean(string="Is microphone muted") + is_deaf = fields.Boolean(string="Has disabled incoming sound") + + _sql_constraints = [ + ('channel_partner_unique', 'UNIQUE(channel_partner_id)', + 'There can only be one rtc session per channel partner') + ] + + def _update_and_broadcast(self, values): + """ Updates the session and notifies all members of the channel + of the change. + """ + valid_values = {'is_screen_sharing_on', 'is_camera_on', 'is_muted', 'is_deaf'} + self.write({key: values[key] for key in valid_values if key in valid_values}) + session_data = self._mail_rtc_session_format() + self.env['bus.bus'].sendone((self._cr.dbname, 'mail.channel', self.channel_id.id), { + 'type': 'rtc_session_data_update', + 'payload': { + 'rtcSession': session_data, + }, + }) + + @api.autovacuum + def _gc_inactive_sessions(self): + """ Garbage collect sessions that aren't active anymore, + this can happen when the server or the user's browser crash + or when the user's odoo session ends. + """ + sessions = self.search([ + ('write_date', '<', fields.Datetime.now() - relativedelta(days=1)) + ]) + if not sessions: + return + channel_ids = sessions.channel_id + sessions.unlink() + channel_ids._notify_rtc_sessions_change() + + def action_disconnect(self): + channels = self.channel_id + self._disconnect() + if channels: + channels._notify_rtc_sessions_change() + + def _disconnect(self): + """ Unlinks the sessions and notifies the associated partners/guests that + their session ended. + """ + notifications = [] + for record in self: + model, record_id = ('mail.guest', record.guest_id.id) if record.guest_id else ('res.partner', record.partner_id.id) + notifications.append([ + (self._cr.dbname, model, record_id), + { + 'type': 'rtc_session_ended', + 'payload': { + 'sessionId': record.id, + }, + }, + ]) + self.unlink() + self.env['bus.bus'].sendmany(notifications) + + def _notify_peers(self, target_session_ids, content): + """ Used for peer-to-peer communication, + guarantees that the sender is the current guest or partner. + + :param target_session_ids: a list of mail.channel.rtc.session ids + :param content: a dict with the content to be sent to the targets + """ + notifications = [] + target_sessions = self.search([('id', 'in', [int(target) for target in target_session_ids]), ('channel_id', '=', self.channel_id.id)]) + for session in target_sessions: + model, record_id = ('mail.guest', session.guest_id.id) if session.guest_id else ('res.partner', session.partner_id.id) + notifications.append([ + (self._cr.dbname, model, record_id), + { + 'type': 'rtc_peer_notification', + 'payload': { + 'sender': self.id, + 'content': content, + }, + }, + ]) + return self.env['bus.bus'].sendmany(notifications) + + def _mail_rtc_session_format(self): + vals = { + 'id': self.id, + 'is_screen_sharing_on': self.is_screen_sharing_on, + 'is_muted': self.is_muted, + 'is_deaf': self.is_deaf, + 'is_camera_on': self.is_camera_on, + } + if self.guest_id: + vals['guest'] = { + 'id': self.guest_id.id, + 'name': self.guest_id.name, + } + else: + vals['partner'] = { + 'id': self.partner_id.id, + 'name': self.partner_id.name, + } + return vals + + def _mail_rtc_session_format_by_channel(self): + data = {} + for record in self: + data.setdefault(record.channel_id.id, []).append(record._mail_rtc_session_format()) + return data diff --git a/addons/mail/models/mail_ice_server.py b/addons/mail/models/mail_ice_server.py new file mode 100644 index 00000000000..1ab3a674432 --- /dev/null +++ b/addons/mail/models/mail_ice_server.py @@ -0,0 +1,57 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import fields, models +import requests + + +class MailIceServer(models.Model): + _name = 'mail.ice.server' + _description = 'ICE server' + + server_type = fields.Selection([('stun', 'stun:'), ('turn', 'turn:')], string='Type', required=True, default='stun') + uri = fields.Char('URI', required=True) + username = fields.Char() + credential = fields.Char() + + def _get_local_ice_servers(self): + """ + :return: List of up to 5 dict, each of which representing a stun or turn server + """ + # firefox has a hard cap of 5 ice servers + ice_servers = self.sudo().search([], limit=5) + formatted_ice_servers = [] + for ice_server in ice_servers: + formatted_ice_server = { + 'urls': '%s:%s' % (ice_server.server_type, ice_server.uri), + } + if ice_server.username: + formatted_ice_server['username'] = ice_server.username + if ice_server.credential: + formatted_ice_server['credential'] = ice_server.credential + formatted_ice_servers.append(formatted_ice_server) + return formatted_ice_servers + + def _get_twilio_credentials(self): + """ To be overridable if we need to obtain credentials from another source. + :return: tuple + """ + account_sid = self.env['ir.config_parameter'].get_param('mail.twilio_account_sid') + auth_token = self.env['ir.config_parameter'].get_param('mail.twilio_account_token') + return account_sid, auth_token + + def _get_ice_servers(self): + """ + :return: List of dict, each of which representing a stun or turn server, + formatted as expected by the specifications of RTCConfiguration.iceServers + """ + if self.env['ir.config_parameter'].get_param('mail.use_twilio_rtc_servers'): + (account_sid, auth_token) = self._get_twilio_credentials() + if account_sid and auth_token: + url = f'https://api.twilio.com/2010-04-01/Accounts/{account_sid}/Tokens.json' + response = requests.post(url, auth=(account_sid, auth_token), timeout=60) + if response.ok: + response_content = response.json() + if response_content: + return response_content['ice_servers'] + return self._get_local_ice_servers() diff --git a/addons/mail/models/res_config_settings.py b/addons/mail/models/res_config_settings.py index d9686cbe4ac..0ca94545fa3 100644 --- a/addons/mail/models/res_config_settings.py +++ b/addons/mail/models/res_config_settings.py @@ -19,6 +19,19 @@ class ResConfigSettings(models.TransientModel): config_parameter='mail.restrict.template.rendering', help='Users will still be able to render templates.\n' 'However only Mail Template Editors will be able to create new dynamic templates or modify existing ones.') + use_twilio_rtc_servers = fields.Boolean( + 'Use Twilio ICE servers', + help="If you want to use twilio as TURN/STUN server provider", + config_parameter='mail.use_twilio_rtc_servers', + ) + twilio_account_sid = fields.Char( + 'Twilio Account SID', + config_parameter='mail.twilio_account_sid', + ) + twilio_account_token = fields.Char( + 'Twilio Account Auth Token', + config_parameter='mail.twilio_account_token', + ) @api.model def get_values(self): diff --git a/addons/mail/models/res_users_settings.py b/addons/mail/models/res_users_settings.py index e219397859c..e76d1eae1a1 100644 --- a/addons/mail/models/res_users_settings.py +++ b/addons/mail/models/res_users_settings.py @@ -12,6 +12,12 @@ class ResUsersSettings(models.Model): is_discuss_sidebar_category_channel_open = fields.Boolean(string="Is discuss sidebar category channel open?", default=True) is_discuss_sidebar_category_chat_open = fields.Boolean(string="Is discuss sidebar category chat open?", default=True) + # RTC + push_to_talk_key = fields.Char(string="Push-To-Talk shortcut", help="String formatted to represent a key with modifiers following this pattern: shift.ctrl.alt.key, e.g: truthy.1.true.b") + use_push_to_talk = fields.Boolean(string="Use the push to talk feature", default=False) + voice_active_duration = fields.Integer(string="Duration of voice activity in ms", help="How long the audio broadcast will remain active after passing the volume threshold") + volume_settings_ids = fields.One2many('res.users.settings.volumes', 'user_setting_id', string="Volumes of other partners") + _sql_constraints = [ ('unique_user_id', 'UNIQUE(user_id)', 'One user should only have one mail user settings.') ] @@ -25,7 +31,12 @@ class ResUsersSettings(models.Model): def _res_users_settings_format(self): self.ensure_one() - return self._read_format(fnames=[name for name, field in self._fields.items() if name == 'id' or not field.automatic])[0] + res = self._read_format(fnames=[name for name, field in self._fields.items() if name == 'id' or not field.automatic])[0] + res.pop('volume_settings_ids') + res.update({ + 'volume_settings': self.volume_settings_ids._read_format(['id', 'user_setting_id', 'partner_id', 'volume']), + }) + return res def set_res_users_settings(self, new_settings): self.ensure_one() @@ -38,3 +49,25 @@ class ResUsersSettings(models.Model): 'type': 'res.users_settings_changed', 'payload': changed_settings, }) + + def set_volume_setting(self, partner_id, volume): + self.ensure_one() + volume_setting = self.env['res.users.settings.volumes'].search([('user_setting_id', '=', self.id), ('partner_id', '=', partner_id)]) + if volume_setting: + volume_setting.volume = volume + else: + volume_setting = self.env['res.users.settings.volumes'].create([{ + 'user_setting_id': self.id, + 'partner_id': partner_id, + 'volume': volume, + }]) + notification = { + 'type': 'res_users_settings_volumes_update', + 'payload': { + 'volumeSettings': [('insert', { + 'id': volume_setting.id, + 'volume': volume_setting.volume, + })], + } + } + self.env['bus.bus'].sendone((self._cr.dbname, 'res.partner', self.user_id.partner_id.id), notification) diff --git a/addons/mail/models/res_users_settings_volumes.py b/addons/mail/models/res_users_settings_volumes.py new file mode 100644 index 00000000000..f65df2c84f1 --- /dev/null +++ b/addons/mail/models/res_users_settings_volumes.py @@ -0,0 +1,23 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import fields, models + + +class ResUsersSettingsVolumes(models.Model): + """ Represents the volume of the sound that the user of user_setting_id will receive from partner_id. """ + _name = 'res.users.settings.volumes' + _description = 'User Settings Volumes' + + user_setting_id = fields.Many2one('res.users.settings', required=True, ondelete='cascade', index=True) + partner_id = fields.Many2one('res.partner', ondelete='cascade', index=True) + guest_id = fields.Many2one('res.partner', ondelete='cascade', index=True) + volume = fields.Float(default=0.5, help="Ranges between 0.0 and 1.0, scale depends on the browser implementation") + + def init(self): + self.env.cr.execute("CREATE UNIQUE INDEX IF NOT EXISTS res_users_settings_volumes_partner_unique ON %s (user_setting_id, partner_id) WHERE partner_id IS NOT NULL" % self._table) + self.env.cr.execute("CREATE UNIQUE INDEX IF NOT EXISTS res_users_settings_volumes_guest_unique ON %s (user_setting_id, guest_id) WHERE guest_id IS NOT NULL" % self._table) + + _sql_constraints = [ + ("partner_or_guest_exists", "CHECK((partner_id IS NOT NULL AND guest_id IS NULL) OR (partner_id IS NULL AND guest_id IS NOT NULL))", "A volume setting must have a partner or a guest."), + ] diff --git a/addons/mail/security/ir.model.access.csv b/addons/mail/security/ir.model.access.csv index cd3d0673ac5..97d586ea12d 100644 --- a/addons/mail/security/ir.model.access.csv +++ b/addons/mail/security/ir.model.access.csv @@ -17,6 +17,8 @@ access_mail_channel_user,mail.group.user,model_mail_channel,base.group_user,1,1, access_mail_channel_partner_public,mail.channel.partner.public,model_mail_channel_partner,base.group_public,1,0,0,0 access_mail_channel_partner_portal,mail.channel.partner.portal,model_mail_channel_partner,base.group_portal,1,1,1,1 access_mail_channel_partner_user,mail.channel.partner.user,model_mail_channel_partner,base.group_user,1,1,1,1 +access_mail_channel_rtc_session_all,mail.channel.rtc.session.all,model_mail_channel_rtc_session,,0,0,0,0 +access_mail_channel_rtc_session_system,mail.channel.rtc.session.system,model_mail_channel_rtc_session,base.group_system,1,1,1,1 access_mail_alias_all,mail.alias.all,model_mail_alias,,1,0,0,0 access_mail_alias_user,mail.alias.user,model_mail_alias,base.group_user,1,0,0,0 access_mail_alias_system,mail.alias.system,model_mail_alias,base.group_system,1,1,1,1 @@ -49,6 +51,10 @@ access_mail_blacklist_remove_system,acesss.mail.blacklist.remove.system,model_ma access_mail_guest_all,mail.guest,model_mail_guest,,0,0,0,0 access_mail_guest_user,mail.guest,model_mail_guest,base.group_user,1,0,0,0 access_mail_guest_system,mail.guest,model_mail_guest,base.group_system,1,1,1,1 +access_mail_ice_server_all,mail.ice.server.all,model_mail_ice_server,,0,0,0,0 +access_mail_ice_server_system,mail.ice.server.system,model_mail_ice_server,base.group_system,1,1,1,1 access_res_users_settings_all,res.users.settings,model_res_users_settings,,0,0,0,0 access_res_users_settings_user,res.users.settings,model_res_users_settings,base.group_user,1,1,1,1 +access_res_users_settings_volumes_all,res.users.settings.volumes,model_res_users_settings_volumes,,0,0,0,0 +access_res_users_settings_volumes_user,res.users.settings.volumes,model_res_users_settings_volumes,base.group_user,1,1,1,1 ir_actions_report_access_user,ir.actions.report.access.user,base.model_ir_actions_report,base.group_user,1,0,0,0 diff --git a/addons/mail/security/mail_security.xml b/addons/mail/security/mail_security.xml index d48bbbf5f2d..5741befbd94 100644 --- a/addons/mail/security/mail_security.xml +++ b/addons/mail/security/mail_security.xml @@ -87,4 +87,26 @@ + + res.users.settings.volumes: access their own entries + + + [('user_setting_id.user_id', '=', user.id)] + + + + + + + + Administrators can access all User Settings volumes. + + + [(1, '=', 1)] + + + + + + diff --git a/addons/mail/static/src/audio/call_02_in_.mp3 b/addons/mail/static/src/audio/call_02_in_.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..d9b53962c92335549b48590a25ce3f4591d30491 GIT binary patch literal 99566 zcmd?Qbx>Sg*WlYg<8DC{TmuBx0FBdFa1Fs4cY*{6(73y6aEIU;f(Cc@K+s@G2om&6 z=Xu`w>&{m-->o}Uw`x{(?bFrg)YuY>lL(M zEu2qh5+o}kwe%6)HxItH3KKZ6CMK<buxYn9oE(R~mWhS$M8^EjW9%1r(WsX*BnM zd$G-{(@tX^XS8HG4OMPBOa{z+32t)K9+%fgHNKj+_B38JorX8TrOOoAxznyK7gSS{To^PVf zR11vKuks9jjw7J?d*{E92ZW6?EdycQ#weTx^dMhqEU!$=gESdWjf`tRbj*YtAENS+ zKbwso>5pnyXr~E;i+os1MwKGbkjCKd!=VL$@tD`30w5eWziv3M8$c;_;|4uVM$sYz zfm{Dja(JS7Jr9f@mbl09Bt)@E?iogdpz#N6!Fp)PQ_N9AOl^qT@RA)CI%wKSOjd=n&jaCghP>I%u^YW_4mBWFY8d@}liZRw{yt zKhHXuUD({Jo%?uT2epTs*6Bp_5OtRp`N^{O7cYVD$4+BOk6-MBIrbLdsrn7_)I1%P z=6xWP66HoQB)+nv`%)&#(y`7#E73Zr7HMPU{QQc)fu-u7mByz|WWP!p{*h z5aPPu@Z(W`Cr)_h+Bi~`Gshe8YdtxxB!Fw#ee>fyzdDJBv3R{>j>TFEi5`u&Q%op@ zXTN~J3Jo<$t9-x3H$aMi=flUOF5uPug&>Ld+lDEkTmV(3L`oe;iE_7Yi#^{)EZm&9 z&V~{fuF|xcMnB@9*1my+g?YEkm}9QnZb;{4(5X#;l>PZ82l=bBB->&1oq*8DK2IF~ zG_f0;n0D{6>1zQj?uzok?`81KgmJq{O;1(SIPh?YuJqNw(F6dhdtPzf0|5Z=z~nQ9 zxaa}E0pu@nf*=$_i}_>UY#YtW(Mnz{hXlF!SG8`c1%A}W{6iH^nNCb3%V~|6#+{^U zaVasFFOb}9U-Hh1#HdE?9k2|ye|u(C6!MD{iJ~u%F$klquC!OPhA2lj_#OsRP;OAdt+*dweivWO(UWa9f-c?$__-Q5hdEN`n^P< ziNT4hH8vL+>ZEMfcjn0Dnyt->y`;@z(ikdSFxdi^SbU3e<*TnImi{`y{~lL%auQvb9T2R(1bxQ0UFNd*@|Jm4lwx6 z`^L{Q++KOFRuM^u4!?rQ#78ZOC3IPk&Ed0BR70Q+6HUi_lCJ6sR0pO-me1W&tK*Tw zXRTPU_CN+4KYx(_003(M@cScT^#2Pv49nE)(NGn@#`8pe&yg}YAG15`A|Zp%a?EAg zFGz@%(IIKg1UIzGefie%E<#LygDL;P_ki(d)FR(QsqqKBN6cQkzWc;J{Kcp_T>Jd& z73IqZwZgjAXELrQCsR^>3x;dJS^WCiV^;SKfh7(6FLALTR4th1aZZtq16x$C_^D%} zZK8~tlVjpG&-aUaXagIRF|M*6$$fDy7zIfet8(ehSSFtq1_37j2_sIbqV@h$1=6^5 ztm4+M3Z9}dubNTHI48A(h{dLKse+^o_U!TecW^&k-neDG&h0^S<1khnY`xH$P{iN} zsyZCeK#42XP^}RCC>?iK>T>80(%HA3ks39eSW#}NybSnQKZT&=AMG$kp2gBtb~|>( zvr>tif8$Csg^M1Q!)MO*+ZLpeDwa}OH9z@`-!Vo-uO?@`P1aUUJkIO-Z3W;lJW#NpJTZQ z!rG3Ezbp%@PZ6PGj?{b87dnjxSve%J)jFx5x1e)Ow-BXJM|}`XAi36k1OOhrd_#l+ zbpya+0HTrqQ&u#k_uwtZP9If2(+3BB&p1|d`w+UWQt{f#HNDfWaKKI&H}RtxqkB|L z7gql#>#_^Ha! z5lL1fq8OskwdtL5E`$D)Bg$7DX;tqj|4gC=>_rM+Lb@43*t8TcU47|hH2Vo7s0|}qGBzG98-7_6>6Pg6R(+VJ;IwC zv}Iw&zu?HB>e||B&96YZdDg$Eej$c4%6Iw!}JDMh|0zv)OMIkqo} z%5C>e+EAbz!ID4-7=5*YH0P0gpzrBqhEQvDhG^fQ-|@jJL6jlu(rN;>{Pableve>B zT)JwHgea7!qA-5OoxpH@@(9WgE#Q@^2s-0Q_zjay+kw9HJfxm)`q@r`M_nO!!o^BCz}VaHj`( zs6w={gOnLCt3IN_=lncJ^IbEg)LcY?pjF$+nskQ9ikY8`j$H~==f8>7J={ZmMw*2u zQ2isJS$%Q;-P^1PNVCh3$;5W`J*8fYXuZ&oV2K0wruQgQ@M!F;aaUNw!qcv^W?;#G z)39dmSCxs_T6WP?^U3Mzv#BX@daIabu`OO@#t=B@C$cPYE;A)D*x803Nj-=bN;w1Qu)a%CEw;M``hwA#L>bujKMi_2W^kJ&J93TFTxW)727$^rhc6 z;ZR*gn1Rw1L=Jy-QkVs;{s5uaZ)er86T6#|?9nct&Uz`9nkyGB2P)*gj3+C5J$S@T zv1?UY#EYV-D09GEOTn5IYoUeg9UB`%k|d8wA1pqfGT!rg%UX_5hB1bM(l${iw?VmN z$+GjoS@xrjSlW1$^>G<+&Pi3DJzbNv%GUZ^ENH3dH-RzHv^KQ46!VvYt<%SWF`wLh z{x6wF(_1BTW##)Fq-)w05) zX{5|+>W1nV7^bFnZajY&F}f9*Ud&)T!NXDJAVVJnhw)4i1SfM=OEjd?E+u9(^03?d z!HCJ#HPlSin&zO$M(22@%Pt&hSMRg*2fECaojvt#WP`3z`tHg%?RCHZ?8&U;D_0$~ zrvB-#Tz2mhUxdU@W_^Xxw zr4%xSepPA>s4F>f=c80D>l*^~qzsQv}zVTc^gSjU6myxuLeQDs+Rd|FnEo;a-#}%8u#1(^3+r>2O zKlRNA94I+jlN%W&Ymq^@ zH)QEd2Wai7JjdaC>a7!fEUQ0|($cicjj%+Fe%RxF%d6y@IPT6}`86k-eOEVG<#tkA zW*qH3#_=j>LVR5Etn>t5+_2iP`Q%p(R8n>GI;a2C`FW>x=v3NhrQQPPO4aGOnfa6F z)j>P>J|qo;0|5!A7THSl?|h$$)z%3agorLfwD{HG6b3mJ{<^c{bU|{48aVzEpI~}S zZ`OyFi2<3+Lg+A5dR=; zynFE8f=s_Rqc$g9#?k#^*z7nllFwYSM)CXIPPo%`0C0cbopJkN@apD@r}GFh*w>sY zxD0~Rsq_5D#$Ag|A7}Ng2eTL&TZlND zM9St9Jth+x_<(^oyt0@m!@h(uLF1kDL0X2kyh*67)6OaU%UmvWPs%@;!s*7LK78$^ zK)gU?BHw*@QMk;&kww2ZCY4sWz%JJl3`uU7F{Q9&DglwJo ztkgri0;oN0N4jr>pS%6oGcw+nCKwom`6N1h!Kp~=p!kHmeT`tSVsGt)L;_s1fL?4A@g4K;5QBbA^x2)VOSARjnI4}(3CXPQldANnKZ4!*){FN5#vm}Z^GbRU{-}4GCQ_%y1J#PB?11=HY6$B z#1rf2qOHjIAoneOTUdC^uXY!y5;sTQncsYTgJ89+)#wJmZ=v0ff3q%L{|u@<~WiLg@zgpG4O%eL!^*>eW<4hQ!2Xmnyih}7y{VGy8YB@%;C z2=bf~%`lG)z@KGc}&-%8htxlv%ohhm@h5+3u z7|z=RsySy7c+F(Xo5$Vkh(Tn(LmNc+_6eP}0R81whS`|lG7)^i0hA!4n8_fozMW`F z(1m>@osmUVZ_~p$(&uVRAC-9=GipPg8Dok=`XZTCRK76Jr^O=5^7N8xtg|}kbB(ur zz<-CU|BYw!VP+<;Tb4n-{B)EWvS7FBNX)qfmO(GtP66SSd9(omoi$rbENO$!X-c-= zb^7RN3UN9dhP{Y%`%UsB8+u8UX#894bgS@$2p0KQFE+CG?7v<;Yj@;}uVDW?=DmGm z+~uYaC;7>(|1SQw-&bGY{^3&&KY>FdZP9;-D-fKu&o112hqh`gsc$r$(f-%Qxn5+m zJ;ZK1n;BE5$%42J%el9{_n4BqREi;i>;wvWT67at_@`$Sq7~q&g}UUT7+BtDkU%LV z_O=89I>x}7jp9<}fhtj{;w9^{;Bs@1iehMhB`LOc<~gMuPD8up0$!zjjbnHFt5M68 z#?4c|o4ex?jp0_$Y&>xR2mS6i{k`it0*s@?iaTA1N+t93>_#=n@S&%UO9o;c@vIOD z%eZA$@XdF*%<>-InP$|q6k*ve{9(q}K2NhSw-bdSNZcnLWrIRm!SgiAxo<=nQ73X$ z>!X*^?mnc?>tDUfeVR9C(mc-O)@rXo@J+w8ac#kVc{CuP=F#ZUITJC(Ke8W`6u*k& znTa6hi8$DR7)hkrg{ff~+mK>$%a2O)*zjo53|i?Qe3pb}?roOtawiQ1gsvc3Ms+OE z6MW?O4pM7NHLaLWamCQQVI+ADF;xvKjtaXaFuA-|0ZoO#o7bmxMQ{c0xf(oq-Yyy4 zFYoZuy6g!InH1}4YIZLk9%zeBA4lHR2UeCROK&vSfsQf_HCo|MXsihWkw1M&Vq$VU zUt4c0MlvN(ga#p%Qay&H2wBRD-}s%3lmrLF~qxTxxd zAww?Y+yeq~1Iq)&u*8wyR!qrMK}z2IIyES;Im3k?CdVHQj5loWJ(@5YpZY6k@{sR&zcx4U=@Rc2md=MK z5a>(f`)$EZ^Ud7gw^b$=#rKdpDdb)DW6Ku#Gq$22RC3bL{BNd2Uf%}mO2(}}OH!sn zOH@$D6ra0i_LGN7^#@Mo9^&)_RfzvnP@Yc(G>$ORGJZ;8+x&xo)cN*(n+2HVdGLdRu!I=C zp}Gz2$=Kc|O{SqvRxl@B(#0>l1W41k=V(?xHBh9$EdkgKvMDp@S_W1VF$f+bPTK_ z*_arTj67JeF-saEnLmoJVPL)P%=k-OAskcJa!%JPAG{dDo;7p`id%^{HtvA)ylUVO z%E(7!mmMj^gG@(4;-h^=O6t~j7uSlcbaZsB8Q@!O>jQO9UXOy{8^Nz5AZT{RFE(BZ z;rB_9uOK<#9Xt3i(spto zqRA3)Br^T`t+$g&%F%7Wrxg~ z+c@WXSP`PaLMJV*a3<2@_oa0BG7H~r?e^L(vburwqd7G=|_ zfnDGe5PdCSVDM8%wtCVc6>)Y7&A?1iJpq+@n*=RQ;Uw~D2sR29R?l=|K2OFL4kIo$ zuSi+W&WWEPGgDFTpJ4BB!d5``H(sJ5mE@EV031VW6m>bDBQ$%9VwgNLXHi|${{1KoF| zoB;6I7K5MC$)?=(E8>mjLehc&Fd~Y0Czqmpa#kW%f{H9!6z$7xR!bII8%@uQ>w1L( ztt{vpJh|5BQtos0k(0sQxciWfnfGSpcVlk~IuG)B8lH4GmE2!HR>v=Vx@p^Wd>}zW zeqhQ?ePGt;Oa>{keAs1T=?1PF8A)6Vl_$t75uJKqx=lxvCWyW;wnVwYBW2kXZdi;t z8FugnX%%yHVeaQCEwAR!KQ^(^u;6PXH55u_x}Q@GDo)!P`{^YXmw5bgusNk*WsYyj zKTMJpO>{2*`6yrIXAk@(&H|3oV=-r+oo!>`;8SCE>X^h7uX^UBTF}VLc5&U@aML?< z?gt?17kI!29^(7F3POkFajF4My$iv{G35M2Bqz&U1VSb9j z)1(=`c+>)^3*S&+rpkcpvTz1$N8TVmiYb4CGqoV2rW#LC^NwhjvG0u6g?}hihu}8Y zQhvWbX06u6oyMgwpt3^d$dm|5Zb(ZqqAT%qpC#nxx8SYR#=NR-eDMDWC{|rWe+7Ug zgr7f)qR2wQCMGwukdNZ3<@$cIL^^(Es!-9J#V{46?k7xg&XItkmpnki$j4=a#_?$Q z&t(nZ>1Yi+9?EM91YjHN6s_5BNa6wYb`n9C zBw`$Ld>}y@ZQzt7SzRes{$iKQhy+SU(KH`9dhBnnzinmJuu~Us%x?Q8YD*>&G|RzTGW2nA>?3f@c{{^{XbvLpdi>Ajzb+aK z<)D~O#x3%~ew7$Y^qs7EzLYdZFI^}x+_JPX5)IFXO3WKwyFhv4g(RuoAq5hwtdehP$nhH)pbS0rHEDQdIL*r%^v7xbwK^;R zL=x23@woLm<6+d~5qNl|iAV-VlrgoeG~>zb1l_+lT6FkJTrM2d8>T*o$N+msX8BnV zIV4H(Kx@uolaT7ad&I~!#GKe*$WroRficj+a}~Z91Vw|$y6#U(HshCUzefs2UeK&v zcoi#zpsC|i(Gk`Nk)QeYvMhhxOAFu(lmkJ=iKyrHiYyK*pikqQi)EDx0wGD#9xB&t zs9zxIiZkVf*{2mLp(_d)bwt&&*!EsLUg??Iw_O1Mze%APVmPxf2T5XBm|FH-+v(}# zDa=cJ7Zb6yz->>V%SE3a_$>*YDf(=6V>*S@DbLNMggPi=ML%e#pREmfI1n)1b$<}L z@x(#C&(n}FhUGfA*FE7k)uiwew#!NxQNaa&au69fu6W)VP}qM6d3!P6A9*%@dISKo zw`>4#g_z0v5nDOIsKk`@j@8tW4pDyI4Sp=NFwJf5F>?+uWSan-B5cM{5GD=kd6Lkj zENe2@bSElMu~RG)H(nWq-;52l=zje|J`g$4tKqZ0{TS%C2m4-kt8oHSA+okaR-zrJ zhAT7UR75^HuJBPA6AEvp{s@?4GN49Rjxk9{)I9~~1ZNu==KcJc29Y2v%!7(g$G-~L zu)R&>dO#=uLKBD|gIrPVu|%3zQ3hW^L~sQA3p~cH{kMFpFjam^SE4JaQ_~|oSN1t- zrazD`S*U$@pH};pU$CyEG1i}9#PDak&!+G~Bqp!D)Pg-@9Vtspe@=4j2vE7<^+XQ#xIj_c=Cx$afBz9%6FT2K1WK0m7F^QU-24aY8U}ckvLxq`|YRlNCa%Ak7 zNitD%@Uodl3>sLCULDyY5;?Gk*t|?8y#)CWm{0xPnNEpQ!DE&uL0 zI3}T%vNa=!vt4d5DpV~b=FuvmqBWT$4yDK}Z<(Zgdh9>Of^6o$fX-i88Iav?@HLV7 zC(R(^V5z)KVUUucY=<)M3mg~DhE*yKe{|UvD2Xbugv8RGM&!Ude>bto$md z41rSTO$|a!ikn=L7fcx(F{BB{R;zf37Ej6+Vn>*kJg&X!gXkANv|hhBD_;iAG1 z0#2{)pG4LyJ9VZhALVUn&08o%C37AzHRy3be;{eK8&z54Bq*($d!591Z6e7JWABdk zJ|AC*SB3td<+h9QY(^-Mw$8N zVYQSy+|qCudP2yW3DjjyNF+hrn^9;OGmJq4#b2N3HSxX@`oOCIu`XR2Q>&L^kX<0GvOrRg6(w zxA}`~*GjK0tm;oh|Em1tXBy5WrvzmzwBTe+wu5q{+51)hiTL%ah(CjBzjC&ldsIff zA~eEPGNiS{GLYTZf2B5b_zLHEbqwf^qEv_g8MwFqj=)WZhY^~O697z9NVP@ zn`5@kzr3jzR^KN_u+y*CGk?_52>>3yDEo}^j2Inb#eOO1FnI_7fS!c)$mAjVxZUwL z^!xQz2}_wZS8k_>8^5mss%{H*HG|f$_7_eXLP{uBkx^5*t=^XafH-S(2LO3~ePw)8 zlHFQqd~x!oENa@fLri=IvK4!ErwKZ!mPDFni}0C2B&vZIbB)iMX?-)_8lpuAd!p10 z8mRETVunEb-hFyQKd1&183~ODHiPuQx%uaCa4?8LTQ07l3}`fcKKkr@aI^&O-S)Ki5iG~)dFYgBiMDblX9WO z6+)RFx)D9!=mr3bqr+ALMMgHG@&4MEmq$DOWo(Rn*&)`nsYjUyRT9cX z8s3f!b(gypem(d6`d|$pwxHQBpLzkiZr$er0BvGotA{*`O_%fzJVF1ZgDiGVT1Qor zEQZbx4O;E~Hew`H%^NQ%qKu+7P7l+zNA-tM)_#{PeSS}oZYzlq^#+AEo81p;Wwt*b zR7V+_J; zA;#YZ$LDbM`rnpS)@#9#T1j^pV(gOU98(RLIp%G+CK(En1sIjV;SHE>#ObTHr?D-v30 zT#PJYX=lIjQw5!@s|D{r6(iAtz(*<%??;p^`ofXISXN%AkTWq7=$3GWJB=z0fnz{6 zzjhPNHBYqUC_B0&0S)1@{l8~v5tuy|A+G960F25B}8LKnbjfmCw%AXMCR7#}w`H*-vEV_}n% zs3YgSt+GzMf<^mBv3QJOP|r^}yJTFHH^-}s!Zz+`ZMN;sS_I-P)o2MAKl7R;F6SG{ zO%ga<7FL`o`w3!<7}MWWiTkW&!Dlu7t2@VO8gh?x^1dFa{6LokfJE8is5ImeTh?W} z76!4Ks^odDY|oT$Q6I$>ke|Is8hS^O40UE(ITD?GwUlCU+x<08!Bx6^ZNGHAVkyGK|oO(<8vn%|?gDFicbL6~aBa`B4wtp8^kKvdhU| zk#}#`cTz#1@+g>H4<^VIRrZ8K$r4qn0A4+?%-9cc#{o~kMz1i`A_z-6Re9EBC`R9j z+>JIkWj$Tz17l*EH2b{0J|uJQ_;EfTiP!VYb-k&2H9> z-2h956_JbrIM;sYu7>QVtTcy(TZD!vpMCg;nFE@CF8^N_51W1j7ZY(Jk4JSl&i4HvNll>gz?2`#m$OE#T$T;f4Z%1TH7i* zk`*t1*HqG^<^C)aR=<3rq5s# zgs=q9eMk4m{EmZ1C9J}vInB)SirQn{X0cLu8oZrAzD2-eR1z`qAJ;1`1OACe2e54@ zC{#P;`jY96(5k+Oywkx!nTc5U;j+fQVT%mG{Hl&h=J!JtO7(|5&#r~2RaQaYj^^!0 zgT_~t&FW_I4)z~vuM|lcbc;X_ej?-X<2lK^b0*$_Y!V z?FN9`bi|ShI9iavT1H$`)|+1E9V!yWPVVm$VYVgXsNy6bm!P4b1R|p~S5VN>2A$F! z$g@7V+XAe0M=6e+aGK3&{MAr%@&&=%+}4|H0a))_K9P~GyYxTjNqGR9(%1fg9cf0c zPEtndo9t>gb0X=JGqE4TRGgdV%Ql;)K*LbJC$Qu<>H&x$0E`g>@j&wkR2T0d+VuZI z>ZnXdN1Ysmo~h@DbWBL!IId{QhTmn1e5yKazIwStHAE>~s&$(6)@M^^hn`tC<#U^+ zbv4g*V9gy{%vQoQ(#-=SFfA;*(Zi;`Ec zY=lLPzN|*f*TWC1svj*;dfLae1%*3m`Z#fd-`LVmdO`mZhel_C*mFRf9jW$ll*DyN znqc~ScBFod*{iFuL>#WKdM^+15~YRLUBIdf$%9XDQAIN#zzG{cXM<<}V3?OFbVI3r zg~>MuobJyT(GEJ2CAy6}(W{WH85ewkd)dJ|!i!vZRY)vkzfX#Tz1+&?>x;vO{nIC{ zzBF|+a}WblX7Iu(m#O@XJLVIu(vRtbtXlQnPFc+zwMkcUjJoik4yP8bY+h%%?xQ1hb&ei+zCcZcZb@1l{%P@~6gfCDj*K)4j+ z%gdoSTWIJB7ZVBGQg%8PCtvv7+We6sMtE-*RGMyWPxV7gH_bB( zv5mw>QWh+0W&l6qxwoSCx2Tf9BLtp_rB9M>A6ih>6LS7MY4pz*ZfSHYgG3uYP>FrqYT9MW@$bgSFZR?4vU> z)1(g~S6UHJm9k>8Bs0rMBZVW)q@!g3EV08~1Ys)~pl zP)O?8pYy;$a8sld+xnC~x^RWas+ya0Ta7|vR#s0i2Kj_LOxT z9F2&3*v!?ep95uF^eH#I91Ia)gY@q0*p$YTknrX=^#wHwUa2Nf@Nh$!8En9oVFbh( z+<1&g_H3j5C9eAZ&4g|QnuIu#L2wtI`%kQ5NK*UABoq;^N31{Y_i{&am=hUzz zO10G;Q0|wwl0MwY38*c7OG$fr_s1|x_uvXDjwCaw=b_ad`lBw;X+)8U+qbh_ zb3E9j4%gA%)BR3j9P1Ej2#<#&koT% z7%m~OOJGMFrfwLGm@Sb|VK;KR^Sd)MXsjro%*d&&22VQ4lL&lOfIIH{15=f{rR(hoQ7 zX|o`rFENt2)DeY>C$PqZSGKN|e?0}DEPsiEfWTf-I?hh{7$#A7;s=Px;Y+k0!jCI> zn_pFz-t4J?jH719XYd^#v9v{GPe*DpmOz`qTJq!2-+ zrQ0;)Hzk!qQ52CD>C?d=;XT}Gc?GF3Ro3Q;HB#%tvTnbJ?}?l??L^pIs4R)hh7WcR zhw=MR zH{x>Z*T>qO;nc;FysY)Ye-mT0@Rsy@QZrg;|Di;2u9^yue3=FO(HD?$;G!G2>D{j_Izpt*A7~MI7B1v0$A}=bCyJnZU!h!59kHiE%@6Np#otpH zMC9Y5W{5<%@7WTlVjp(OkwvH~KIikD`MS_cj@`nPZpT4RQoKEDtzb8QcDWA7my@a0 zzxRx%)wZGf74o|6yQo^>+QLG)dXaRQAn^=7l&rQrNAu1@q zI(=mFb7mh=BYMrmyymJHg3NHUl=7FjAQ1S2h0gKoA_p_9V_b1N$K;wwt(tSk`W=Q! z#Hn*nn&0HE^a6EXYLk@oKWjS-7)*yIWRM)XX^z-R^&WUW^R)i(dcmNu=DV@svWp9! zoF-?eJD7qysh3eJe%D0n<`}rxm%Xi^jGKo1q@WW`M0#Fq^R7@+YCg#=NGDCEw>Z(1 zocORKPhTnx2Fq?YGR#?$6Enp`?t8ukG~%~?4KpPMS&?KkgrNp zky4~J6JZojHs=@#|3QT}*1L;tJ3}kjGwPhOtgR>XBi>}8T6|Y`PcmZDBE*C@7aHeX zEar7G7eA@A)4Kp>{EvXEM-8fp8N_t|M=*U-oNUJ&^K*=pAqu%Q&$6f(CPtR)8u*Bid5s%0s0!g-<`wVR95=A@p zX$OX*uBH@UjYh-fs??&MOR0?(j*r4_)tckB&gf|OqM~wDO)hDvOv5qMeaU1l<2tUrN$FwZA zkU9ouLYUV;CN${9LK^kSs3p!V#WRpjl9#RuGP=X^oOKE%wMxu!bAiaC@DDCymMA7H zMSST2;yUIATS6$=B7a64Nqd24W`*DvdQv&=b+lVE^=*t8Y|w&oac1NtqwB0z?H#2< zsgW_Ub`puOexGRC=z}Q24nLM%AVTVL@6Tm5$xMvnb7^ZRPB0;9Rq8y}RZVo420fd$ zb-(G3=)3Y--dMJGG1zai(t=Jwn=IeGCUp{w`ca6!dA+KJ72=fTrrB{QD9C+@)$5+p+W9l(`qLcr8g- z9R~|TirhdQ{Z^J%_SqyM;@k`BW0(rb#7pHCb7`|bQRY4S=>pLYPM~ZIl+tZ(L2{>5 zn0s%K;zYaA4Q^6!OcWHR)%D^A>N5px*SErdBuU;iYr9lfe;T8FPc_V%#hO-DuOa<@ z>-hyK>(1n!!107z-$hB|&-(_Ftgi-Dwv28A8AWm2E=LPBmd1Tmty-F-6e2a0~w}gl4a}|jFbd>{ECtm+S{Fv z!HT?%0vd)BfFl}v(f;Gd>6p(QBZv!Dq&&5FVVuGgty6QRT7O4dh5lM7;&)d^0}qP zDlvg1{e7{^jqn==1@12b1IwU&oi^0=!q*`)VnjPPpC6&yd z_drJ{5XlLIn^gupeoizg7!B!y^67E5%sdZf)yM$*EV{?h%5Yzosga)SAPqTR=Z;=< z^rxg8Iy&izA<4(}w4{?o0&{36!CObjefmc%YI*iVNX%eIXbT6VC?zJ(&I7q%KbgK{ zgjmUj=OIQ`#(rE+bEV{BrA1SvIIYaSvpj)fUPZQ)Pv(u7$6~pD$Ox2AfwKWamOi$A z#}`Rlu&3uO8X6G_21sTX2@li*(W(d^e#eg@jt180U|=`>IM0_wlp-79-=DiYV4F=| zCm8voxHM^wf~PK3*}B4H>G8$-*~aMI7TdQl3jSD}=puSlv>;9t*=Q2%!T!9+hz}~t z-=7IPz}`qj=I1jUDK5JO+e1^5<~*eYHj67u_*LzcPl74%x1*BvR#p(C{gs=4FCpzx zh@oo0St;mBgIc8iuARJ0@s>0+D($Z04kib8tg~>EKpD{R!Y8O#eJOY9V&H8YmFN#XvowY(s9|(SnpKw!C4Dt{{_NwfUcsLpT~I9=Y6^w#>(# zx6@R&ud^s5SaZEgLk{_b?1g0?@hB+T!~JU2m3Z}8QXCpE*7`1G@eQ=?-=JiswK52d z{X*{R8%7-#2~n?BXTsj^*Owb;63|)S)_y_26)eRw%&Zdji&_ym;#GF~1eP6Xeft%3 zWwDUkb=tT5NUZ!J(Nk^ISgGaMP98?+plB*0#nsB$fK{&!B@<hI;HaZ21cA>Cw2v3f=nN0LPrsN}N=NLQ}B zbF3C_yr#FG5-1u+6ET%4`e620MU~Qjqu&P~-oICcp0~dq$b!;;?+<#zpVp)b)dXd& zFf}p5TXyk4vU2v#sFmH1h}B z6c|rl=7&vLGzDZ{iH}vQkVt2CMX~dn)t7o5PszsXx0|831l3=vwe}4Bf=BbBwQ&_i zidSrTM|Q`gZh|l!J(F%F7aWzQg`Rpeva$s$vZ(a>va7W=yLd)~QjR z6>(pjEP1lQWV2y(d5K4ft0HY#!dARykLubB8PT*DMxTVpKEvauM3**$*!)EP4{;U< z8}~ZfA$S-;9FK8wI|{%H7b^a+^ zL?~<;ai*IEhu=1QY$M0CX%$I`>*QN+AGRVjj5?PhjbXH~1Dnt-;^(jS3UBVQo>xi7 z%)=G>SsaC;Sf$wfZr=klVW(E;5W-)MP8#^7PC)X6HW%c~82Hl3gU1r1CzRz2EhMa$@C79%kCam+ ztX8BfbD;t=Gs$UnL5|F0gUaXV_<>&Sfdn2h0o615ya;DN17juxlJkuWaL|=&Q{d}! z^W!PtjAxK{YD5I8;p4z?D6yVdHtdGNCM*XP$O#Ncaar<`#Ur&-XP+39$m( zcw4={;>j6l{k#afeCfC17gojR#DX(w6gB*cJ!zFoxx|%)sP;}snJ(3EYz=GsjwWRu zJKSyPW^+%E%k9V7BDrO3z}eCD_5G$~MH-w+<6NHtbOsvZy3+^8P5R*ugk?T>vJT}5 z$A`?E!d`UN+dnOA)tu-56HgRY!aqH}f>Hb`TEL!d^L795Q#cu$EiYwdh-TxhxjfGs;6VU}F;Xxh4cI1AE zmAJO*#*s`K779NrI{ecxyPAoCv9LJi&-=#;?DIBael)bC?hqO2eg| zi)p&jgdUSj(sp-G19AUa{;IIa_RGSXN6|%~+3N;)VD@`369;Y|y$sKM?-Gtwcw3a0 zOZ?UzY$)4xh*8P3+_!X-F~MJo=6L&x?sXUT#%Q`?I`p4lDUl-KT60Nq|O$$ZdLlC(yIMZ&8RiL<$pB{x-%EiR_-nAhZ7RRsH+v zd|ioA#l^`3^t`kYV;wftCArH>zo;5T_?VRLNXsIq10}S84vVD^ONCL^Cv>z42bJ8Z z6ki2S$OIR$)fI95!bEFZ-9!MHWk~Umg*~q10+z0=vg3q0kwTG z%36nv;jtvaJ^kCWmRlUXQVbj3-qbINUB87@tMc}r`_nEiYmztU`D<_3|H$rHzbN}+ z>ucf@v{Pk)nACf*uYc$Eza@7_>qu#;R|yz3lBI0{#b*w&M#SsSby$8r&5Cw3`l!r% zdg7YagZG`6$H)bD4Mng2qeBO(F9m`4C>rHfG;I`?H|Y!fpqs#VJxHmjiST}Nm2wl> zlAh0yr~2kGJb5pY@ES*6AgS)p3iYwUqy=P!>2_D?t z-4k2}cXxMpLKxf$?j(b|JA^=RcL@%`AwUu!1Om*RoOAAnr*55F_o;e5ocHYyQ?vK3 zn(4j!w^w(sUhChM;Q+Ri-5PE@ve-(yfvgdNNbYb9>J&d{(-igGbMi=h!YDwU)jq1x zh+{xB2_WTdI4?d(haJWLOGo2g(pv>Oq$)|u6n}#d*fv|5!H29vCT^6>0>LbDS5DCU zbZ}C`wJ~VD()m+<)U5aUwA)=6_As=3t!hsNt2y5nn}xv=1~MU+NT!T`6hUmHmlhOh zFG*pg)x`WeSv#$1B|j1*J9zTKiuD(sUV!3%zQPq+C}`nIe6$jxb~#4(xH0pQCqM(r zEL0rXvt0r4>B6IdNQ-^VvBI`KZvOkYK>;RDaavzLOdO)HFSR%a{_5bFIY|6&I>z*x zUU&80;{+lWuMKW*1{ixl=|=1kV+cfR0npYVeHVvVBw@QLVGeyvVC;_E+a$6M#FNrW{>N8VXvc&8)H9SanQq+;4*gPj%pt-vE2B;htbQS=3d0Y6@=XA!&^+A|b&844HcUg}sgtTRf}6)@I%m{cup z4gGHs*UxZ}d$HpPNcl`=3kW;KI69zDi%*D#d}0$M^TF!~e)P;V8OBFd0OW4l-qg}} zji4KH2RXEu`;VeRm@x1y7k;?B7_uA9K+V;}=jB%0r$iUWFRGI4lmb+FU^l9#0#jMY zGU8FR*a(y=w7pUTdDF|2+zxFrjvI7CYaN0LWENP*= zj%mtJhjv>pfEP92sl5$~tVo;^#EVNv65oogX1%C{^=eG>onv#fS|o1A zG!4ff=D%v^n9^1_-chi}$gZ6;o_&2>*%rFvnCBZNqiEGr_gxB@u8TI}tP8|8L*j&vTjm*M!J@Z+FmM`@~5$;iHpjl$lbM-l77S&Wd?&_I~)ox5e- ze#{l@_G!oc2Z6vdYuPY7)vAg3@Pj;S!XAH&6@KXn}-Q2_?s*}@iQWcO&NbC7CYkj zIzM8iv}N9yH3=mff>NXAFOT>kYZ3w^U?eq$`Q*#A#8DiJAq&umC*~|)?a(|Ponj^g z62#k0RPK|ptU?Q%;zt5UQtxsP;3N)ca5}Z={}2*;Y4`o0cQjcJ6BPsjgoQ!7ApPMw zOk^w@_X z)e_6riKVYnbGN{vlXmLcorowtgQqb#skhG{^4dmq{Ga1Ev~07*6@Mu5hRa0vv;`p9 zV@*8MA)nSd4P<9Q}}E&F#7uP`l?=ccj4=#u4gfC zs?#@;>UU|O*kByYg#f7qd z-GQxT!pa+-!KBhZ!Jw$X>e)FKuF3NW#X3h=oZ-lE1`c>7%vToFe)#prPho2a(Tg0D z(s<4=>b40KSfxX8-@Sr5%n{y}D>7N@4C?SNiycOAC-Uejyf1wemu(-{oM|)SX^cdA zpMaZ}^$9zvn7UE%8d-{$Gt7E5DXmhYKTOC}yp*u8Qc#G{vQtxOe?E(V6F9$+fYim26mHGR+_VfVP3kV)M2D# zf2U;*JF0mw|7WQ63cLz_r3)@1>X~{z0uLe_ai^w%dag6xeKcFiYU(o!GS%!e8^u=% z)91Jd#qp>rEB__V3eLKX?*5y67mFCyCu=O@RLggoNpOE$ zVgY=vD&Y1INvq6Ij3Q}713RA-E)T=zwMLLYZDpf$KvlmwgiSF5Z>#pNu=gv2yMzMx54cg7FhC_p`( z9Anivt*Mh7ZW0o5*86VBA})S5iA* zu)DvWaoB&aG@3wODJ97>IQ!`4<-Bgjbn0`ScVYDZoOkGa#ooS>ntRedli+aB?38XW zVYi@H`t3s1$ylyI`KQ&fJ*R!r2}rv*k7#X?sA3AOHEHLDfHG@B?rG!CqU3vOY-i}} zZFo~Wu9+R~JpF+eL}dWB0SPDk0lyN5gyVzr;ZS$UtlO%%Q}^l_hW58p}0J zAXUHa(zO|}ne8@FphKK1eAa9iKzL9HHQM&6BF8r~#KM5{{=7z3kGkG9BPAo|;dO9m>dr%46US0SkXGmQm2FLB z7syrac$@A>To-`?>^)Z0*5%1#rgz(cdl(=7B{Xxyg`SoEO3kpc@O$~N3-AgZ;_xNO zHy*kf{mrXhGhZvuCN3;}`Nn90W?vP6+(h<>Un zb`BOu3k9zjbAG`MoL{HfWzoc5S-xwA$N!+z*|jXZVc!)5(e2ymh^*H+1n$M z(YuX`;X*K!0oj~&8YDxqSc2$S*~-jD`iGDcr`xvoq%&TQ8^FZjRt*8UZN<&K<^{!k zBs8M+4$o>vhVav<+^K2JrLl!NKb1~C3%fBw47IZCcXN!UI+Q0hehuzhpguu(f7Sql znVddJ!2aKgRtNrTwYAFL+EE`uVSY0E)WB*#wa7wE{~r%xLOgcKx6yhg+a|I5NiGWw zEopCf$CIxE&^bI0cP>r0P}NL@Z26|s4aDnk_fo`u0{fE_s&5vq8tMvV`$dT9yAg-c zH{jLqahl_S3ppLK8Pkl(ELAWhMZc#8kkE)3@8cn)vv^N6Yq%;$No)PHS4Dnlqx%oy z#`CfM5;u3DS$D2_MmQtT6XIsRJksl0zmG>P$HdukU|*DB zoVZj$|3PA<{U~SPu@w&3d-LpkYOhT{gn-Z5<2BO)jk)wZn%(%~3Q!ZM6CI>WW5IV(5^@1%fd=S z=%=tWcCLaxHPmd$o5NsBkrU(ZE9h60h*0@Z2Z;$@mGR+lsN6ho18BEV5sATm%O<+t zxREMqJ-oDBm`YUM;$Dd3vrv7e#Wsn?vY(Fxu|=ftq7at-*5C;4`^A74^m7Hh!0Xdt zoxK?^j@DyH5^V2#-A`k8ookO>VJ504?}m6#ep!6W{nBO!T0ut^#mdiTckymXfJG4} z=$8a|)7MBpm@`xYp0L03Pu|uq8U10fQyv0sTt%CUJ|miX!te!T{=n=wo!g36*8x6) z3=EATyuYndhAkMuvfAWmrJ9(Z96UbSxERt#v*d=MV^-xcM!(}{8g5MCq@7lcjc1Y- zk7d?Ln!;K->GeVt2%AyJ!>^)s>)>Q;E#yy|Dg>bdtneAgy2px|=lHn$o_C((SC5** zD+QJ|+`u;NTUD`cO{@Ek5qnZiPyqcP>BgeSR~`59XlU*~i9?bE>$h*!4Ywe84=pS;eAEar0Njirs0X#}?;s1DAzO@%nd;pi`cw7H6PYeEvRJHlfae5~kTbwur9_j!Z}A+f*c#jjKM zTNo@7iT1MV*`|2cQXqy$V-XEe|9tBa9+?G$jlzR`e|!IF;DHS7`cF~gv?Y~vaK6Q4 zM{>Rj?So(6xs!k$OTfR}-yOaqQ|CaC6-;QNAu5ij4xrF37li^)blUUN3^_W^Cf;qP zf0RMf9a9YDPxhnqlcA9+K%_6{r-ozfgR6`v>2)7^DA9*1D4q=;R$k9X` zBwHyPu>+bn z01*Dm{sj#DOik?+ZWA9(hZB%IxT+jl_I%^{>E(A(DI-*7UQquLez*^FZ*XykuIR(r zpDSAH_r{#4jOzGNKi_Q5<+J5y_dCdb%f$E6-z(0s=xU=t{ebrQz1wrjG@Pz{qNzrKK0oQ8mz;uiTeNIrk0!lf=woulR1+S>6T)Vy>rS zMhq|_&le+n#{8(zbcdM|DC9$t5XUdL`A~zs1!AbtZ@q=loSLNa(OlI|LVPSoe zEn{hGGSD{5P$%0qOZ@4{+0Y+m=vK$UDK=8a!BOD(mpE+zvXt`5s=EccIioSl-`J5V z7WhhjQc-#}o6nR$>nM9)z<#nsZH=0((cBj)DfRCf2KB3t8Wu%;JCEVvQlWdSv?_q= z-wB`}MDd}n+9TcxPqHqIP%sgde0r&xAg>YMxpJK-nEqTJ_8iX~_v5R>uAm@zRgS*z z^mVf)e_}Wk%Bpk1#*SWy{7wq$P{~RW+E=u#pur#T?IZ!O=Mc)UWKvJR*~)5nRE;cM zY`2YqiQdBUH7QN6T#?9v(~-7%qBPIdF5vRW=Vzz|>-QK#n7*dcoAyWIL;(a%F_L}O zq~SdmKi>DBZE!r!_*Cz&`Ke5wR7K@6Q)qCIBbmn;&$Z@zmCoMOFK1PU0G)JQ@18=; zZyTO%cyOPS5x&H<)+_e`R0(LbN{|CRoq#@dvyap!Qmzq2xz=mc8C#hXo=x2Z^B=1G zUm3bAT}#NYLFn}^&R>jw%X_#p%0U=rKt4n7=~dKQZ-6dX7(k<(414td+((3@u9=$O zufkwQ)KTV&`YM}!-;=bWsJKNSV?2W|60}*dysf6uL8*vQu_F(&_$abe*OzL!Ar)0F zy{+-~Co2VuQJHfg%(8#X#1 zD_M_#DOGqxbDC;4m|tt9r1-?dZpQd^>loI8ZTHPz;(P%hLM7e5`KoWxdn?Mq{{i_w!!_^N-(qjXXe7y$>x6rDhnQLoU_ojRmgC%d-i6EPbw$C3clEp$yrD9CblAauEA>Nsq zjazdueUKi(wKl?9lUg9YH%`t-+>!>L;@C1G!Bm=Io}X=J1uganuDBCO4cYYQj?$MSy~qdc~Xp}6T@3}Ta{s^ zbfcH}dN_M-PJ1qy6=Ws1V0*04G-VsSs->|ia3Sz#+yEiP1Mq^94)>M>ogYaQeAA@kwxcI_m1THg`KK6sL3{^5s{t$V@JDwwJGs5Ojt< zj}J2FyF59|ar1z&60x&qwWRoCzOtKfQy-=^H7%*<;Gt#@Ss((y1A9Ztwm5xq`#b|9 zRRz$t^4!HSzAqOkPOT*A`h6S^AwHQjETi~ZikPT>iGzCr50$jf-vqnFjVnD#@VlmK z{v{5p8J)qo^+~lIk^9T82c8w(=af7qa(u+dnyOw~Rl-bBYR$7Qjl&}xQm>bvmzOU} zqZwGTx!3z8;Ufe>Eq*J>$WNA;OCi7C)jrj;JFuigDHKbYns)tm>7I3VDP4|5cTfpG zr_Nhe87e&j^RjX_V-R4?WMhnFqSsnbHP18Cxbp5pyXTD1m@hJJeOFsdnX}>(1rt^m znWXgb%G$C+_HL8xeDMbU|NIKX$!O8v9K z%*2==reN{+w8Z#;HT32<1Zw(uk?^>fp~?@6>mAxL2wz)B6f)*8W28|&cZn|s^vt5) z*i6M!@cbws(6+^^S+?O1=cg`frOa*5*pkBm7G>e>j*ipp5nv{OuBj@!!!HBnt&Zff zjAVa0R9USgWM_2WHmmYFRWGiWEnj_NDVbW_G1sA=O3PYvYmfQq6cvI@QDpg(sc2P! z4KpE?`P`MIzm)KIQUZm!(6Rz1%cg5msv9RiMrZ>M&ZDV4cs?RF{PWKqzjL=D$!3?Z zyxim>@U$x2YT$X&B8BI__!bs0EEf(kH_lSUQLRcw#K!{>aJu;_`DUB!iKnqt(b<@i z7c9uR^ix5zJk<~U$j|6clRs0XW9ws|xxQ!h;jkMd>Y}C@YI$u@ z6ho8Uu=IosU?Hg_;{KF~qubOn{bgG>mxF1>vd3I+h6-kJEXX{cN#NxCagx$rzstJe z7{=nfpKfim7&zi?^evbTZ_;>m^U!rKTJLvWo&LAbT8k>Mk}_LU;{a~&4ey-IkhTmG zfh_fiJ)VISs?MhuXklY4ULSQO+wSSRW^xufqXqc1(fW6F4ua5L$;MXw0?sndmq5%t)-IV?RVTcq`GSvdrOB^w8O-hjnGY&Dh7 zL7(y*k*Zf*EZUtriPhcNMLyl#Dhq}7J@?%|_nE_|N3d1eDlVJN4R>ECK04C)F)3TF zSt=cY-23`%(X^9&3r0k&UTd4Zlb~fRyR9dw`F z7Cbh1=kDLUmY}>&Y&n7Cf|bPBo4L(PKtQ9v#N`4&58%b~f?&6(k@X8}L*w)^CiQyH zx@J}~*4xBWw;!33cKD9uwR-Hxz6RVT$izg*01J=LW8blg6^Ft#Sm%U;F6!0yHVxXE zCnolChNQ8%q3zLHo}oNUv#6+Yy^R>JJULz9eF#$bQkhzT?fNoTP{(N~W54P+ zi(U6Qbs&Ad8z8lIvRn1{cW*7q3A6@fT)^-NmA#zGKg*ax+Vue;cR^mo1Dz0@i41N!HpzV+4 zbXiPp0gK!SAs@Vx;b?nOo40i9#IfFrpIc2?(@Qn+HD!fcv8EzyglM2201Fj zz(zNHy2LCM61bauJ8kT1?$`Zh3|<>WD<`?laV37ysB^g6&iCO2c_5+V!Z!ucXAq(Z zsSOxv%t3J2600Zk4X5DV<8aA|-{|2OiLD$bI4%)fnzczxcHH& z7HC19-7am(&U0)i6?^yDgkSMX0k6GEq3S<~gCLPA>73{1yX2#Z7E1WIrh77J*Im># zvyfN&CLX%^X*2kw*!9A*CXXFi57JvqeN$*5I2=NW9I~Vf!L*-0yGhO&b5Y82Yaypu zIyihCs{luNgkby5=(02gW$I8hL3&46c6_5i*zMCm{FNWv=$N?%TGC^a2VHpNva$5o zJztiLoLVar8Rcqt@tZw8zAC5?SePQY1VpI-49EwOGN!e-u<^^~BTHTyWNB02BYT}} zrgkNix6VuPXRA$vePQOXXFq@|ix|h9A;L=GL?RgHvJF%k=eNpHHm`td?Tn^*K<3Q? z>+y9RtXxzDi_n;ik(bR*NXlQlPM98YwJ$oMK7{0F{Zi$8gc5`~zF?z^v9oYuVz5^q zJ+lpa&S;8EUXXSEkhC$V1bEjazSV+>Q3!xttgASQJYiFON~u#H$5XK!q$majQWdw3=c$dFtuW3 z1x5-RkOWqfFXES<^D06u;+Qps)6~+b=(nc8Hp!)KH!hadskh};75Xq(-%KOnIFs#; zGoZI2hP2-3Q(hvbqBNq86n_M&MG^R3Oee>p#P@MS3DpxWD^cf7_&%xOx!fv9@TFiL9b5y(TT-l5H zy%XHV`StSOZfsE_O42}Pic0ZPh6*K9h?l{f3zvX2l=K1sMs!Z~_;2bFoH&u^(kZP z8ws{wTS8h?L**OpM=JrR5y7U^y{M{}PS15ew~(p2>{G1CS9wdOdj~DhZ}B&-+MsWL zT~}n1$A~zyVXbeL$*t>A>S&DX)d~BO*iPN#URP}>aJhwnFab{W@zq1*-NDQbrig{! z+*)C%xQe%LeUV7!ROZKyct*aZc`T2+{zffDI&W z6z11bve2qCuzSeXRGNv5GwIN;FD>A=2$wsx*0KrYS$KJ{>%jruvw#agI^T?vNotf& z4e2n*Fa;IX(x3vPn1=$NJuTyWjJTA+QHbrGE_^p$nd8)BGl6@-6q?%ZxpxLnre0w! z-jv&Ie~xz^CGLM;_WkWg|4o_0I<2VRIR}InZGEiDRfuV%kHOT!I%uL-8%(BL&Vk6? za!))j5b-9?Re_}0NMzEh0Q{q*RAoG0afr67ta4D$1)qwRw-`g|ntIN-AAb!a-aBg( z+*{0$gYLvkc1r!YM-B1^5mn^&vz*nuI@r#+V56MBEXzM*m_ZN4^aYZDMyYzn7ZxDI zh^W6dE+2wqD7x$%G_eVZX05XpHJ;}mRsBmGQoiHO|WhkFi_y5q3mgrVWKR?PG3rvup0F<-W%L1^6F> zMB7C)D$X`l6dzjItW~_$Hl8s1rkzlF+49~yFA(9;hYe>>*mi0y&G^-w|EV|@d&gT> zK!^o1?q){UiErMi1>mAhcLDDGY!4TRFmA&dK&?v0A`9V(#4`TVOBN} zG7>kOx!5jA;$2+=5!}Y3VmpYc76uCBk@BAC6{$Ec6yfVysLZHAxU6v`7ZW{C<{x6A^rY;>-AGGYa zmbgB+ZkG@9?-uoQ`xJcvBC6}+o0wk77?0$c9q`E+l{P@#30fd`Jhhkqm9m> z$6|Ro!3Oxa(4%GaBOMnzt|})5^HP`j+qc7sRy~2YJI{Z%cUH;MTAIQ5iQ6-5fOdaX!yEVRo9|91*NWyHq4_m2h;BL@F+Qn>IKSFVr=U%9}Ss;Z3u1*^?~fG*qRDYDh9^72b= z!Z~l60&jun_!Q16fflhjCRQQ4(KLxTp5|)OTqxsO>A}X?oQ4^t4yY?IdykOy!fi^ZxfPTRz;FH3Gb?$epeW4{>$yxFZd6L=X-&sB1dGm!2J27Yapq^9-$o*Vk5H#xxh7WQy_ z2V>dERjr1{D*TTXh+w(d`V$nuuY5GSYgFE%m1vHS=Sy#`M{|&jDlsYr@h@GB0vk|3xfENL?HX5*61hVRyoOyV%IVbJaaJ1lyO|uWvL=t19ZdzX0Um%M{U5CX&)4UNrCps8pmrIbJIuDmm1b zpZf|YOvAYy>tmPgrcfTZ8<477>zX>LdWv@Rah_Cb+F%-}*NSX3u|blv&dy=LvhV5m zcqgV;+Ccv7MAbXo`>`+ zq6!611w)YSu#OIi5l^CyCzCI9lZ9(EJmY;(bS6$g&y>WgwM*h>(IfLup`4v-&*H1F zCs?H=L4YoQ$lU`31eBC6D_(-3VDTpB%^peYp*(l2(a6Z|nKEV#etm20IdJIiXRbI)irB?0CY;2zhOJ?c?9S zKKUd=JFu`AC^biUBan$Hy;A>a$G{Gel}!}OTHiMUdzG>h?JjfZMCa7NJKC!(fvSsy z9F-h@fhuWvVkBgg)1T|f{m%|G+JA1Bqrm&>Z6m-bEiW4vpO{z}O*GAdTLd38uYzl( zilcEKM>noP{8`d8Hel)lgL|FvQdv*<6#HwCdD;-fet=?y2akIXClI7Qz96mQi_NhO z^iv_7XHMUonHG$V5}aoi9cup8@$zfhHwi1z!GngJW})1N9+p28$HDL5EA+6wW7o$4 zONsvq$^YEZ18`YR@a_zNJuS4M_0V-bHL+5vozAK8NG%>BR&PTgdwve}fh^i!QbJFS2>qLqlaC5duu_^VQ1 zBi7T4lN59mL@hx2hjokeD`tC~Jby6(ZrMq`sRhJeo(1kGlWy_3r@Mx~}pA{K|iL}=6B0uNq zk02^Zo1v1EXn0Rno8WwOE)_*3KhYp*9c4ZxTDG=na)0je700%Q%I@GX@fcao6cZci zqzUXf6b@MEpW^>HuKt_9)Zbh9k9)rFD1s`zY|{oHHf7L%#?GcI#iRjnvAC8sr`tY= z2^_V=ju`iGT$T(edg+WVyO?FZN^Y{iYHLqs4cEl#3gBL6PA*?tLP5)1YjZQiY@;~) z-!=})qvLEevFTyQS|}lG{Eoa#`@&h-b0DW$0PY?6RxFUMnk#x+d24t0*!STdb^k3{ zi;#pG`7ZPU0^sL{r~-%`fGHdSELy1?C&ZpawDN8m2wGAs6LUmeoL`Va=r1_lS4?|a z^08-?7}zq2L?GDG3>#wRG7f7EO>uV=xuOmtx{=_XN!3(M?&%t?MP>;Evx+ll#Ro6D z?t@WNMPJk&{=VCJ=xMbjJ;A;sxO1-rm<0)5=tfC2ui=j&hS6}a-j87csePErsKZLt zUBdHe&xIyPh%=X5Fg(b}j_UDeGm98Wl2}H9^D&SGkGRODyL^*1y19qhM?BY5D-Wh8 z19UTJIn~E`a5y;2JqAsVeLqN;!|&CIv%hb{dkaon-M|1>93Ca5LT8RKKdl?9E_x*J zECb)VS8dofH~KRPwb25Gj_r0S=k0Gd4n(ULnEVWna^uDWUx;v<_}g!Vbl}o4Hntky zZsQ%(tO-&#J^IW8)Sa^%#~Y>x)ozK-EEZXeUP=7p@&4z0K+HR@`ko*N2Cy@1-^%O7 zdbFSgjFReE+Rtx*lN*-$M-NI=0j{fIh9*YprV}xrvp!gd4)o*#3nLkb+-d>j08?a;xpucw#Plu36712$@8R$;0V4~!4i~gA# zLsSwin7Jl%^H}uV?#kg~?$DV+XC2ph9B@vFa|-%8jdPyrE}z<4sH&(<5L7TgA_>u6 z`D(DT&?-;6;yS?)uoY!Gk(GCjRl`YyB(#(!B{l#XWn))KL26817CV}0Oz&o49@IUjT`l=S77dbQ zYU9B-mHAKNP@5RF{t{=yfL-6<_i<>kE`WA%B&9a5={2tt$Cj2$XRKBgQyP9-%xeUBbBuz4jBV(ga{Z=QxFZ$RXBJrC&6hOS0EsRopI zxLM(roaUrXH-8}kr+oYuaq>Lc&OybS_MnLnIB_!u`O0<2j)8UQtZyDKIA`s6H|jEh zL}eQ92X7nG7E}+TP23FjP-a~`ULm=DfF0uFT_mZuF9851xWM+QM8I$gHZ!OVE`~&u z;%K?6D9QU8n{=H#el=c3PRX{P4Yz+H3rfV991 zWnSR(iQZgxTLg@WLtZMzD~ zG36T^JRYQpA%NZ&4QQ&}w4WGGFH-C2N3o#G>#C`q`m=-+@@c3)ab#|;sA}yX3DxmapYnA|MiViDr28sb8Tq8H%_R zb-1Knmu2yk#^s#z8b{b&=`!s9vT@9C;tUte-~pnh)+EZw{F!of$1I+eX;r-+9XT(R zig)QC5cV%2Pw%Hc!~xm=z}|=YRs8G_oNvi|rT4w1qUFH{-ERBWIb2BGp%Tnr(%T!Ct%m%c%M6R+;fw~7lB}s-P!zopz$Ep%HF2+)%Cm3g)>lXY!X?B z1%Tm%UZYaWl1huY*FCePY**=3{{-$U5=pVi*9Nc1-H3XOo2Us)#nZ~P1Vw1j=#nU~ zN;H49(ODLcyrh3Y;2j6bhfqVUWUM`7L=ltvy$ZTM{wTZ0zWW%m_|0>YIB52?mZT(j z15Vs-8X8Va{!>#l6cSt16C1s0Zt2Q3uiNZIAWA?gz(@?buOigc71pC8C*ab%HV&QV z_i9Ebz`BS9E)t1W8ROSitNzfq56$Pd(!IXMmI$TTH}2Yb?CVZ4t1cq)_Uil3LhRqy zW(|}_h`S$J2S6)3%0)p~_oUr6$c}aRE&`<;EK(a_A}pX?_?1TP7-Y=d-(RKLZj-|8 zo&65aV`fbKw(=jbBNYJDa7In%fCUrB(&|uWQstzjT=3sSYHjI6G{ypdi7D4$R0aVazMkK(rp+Ywq9MjZgo`YvHdE*U!?e1#zs>@ZXL%fi4)37fzOuo7S8}R=_ zhv>S;1X@AWf&sEp?+|gs(ShM3s{K}Ua!_YfAeLvQSjxh0b7uin+zGQev^29TlHUkrfAT!HEk4bJvZk zQCbcZFTHSWJ(02@0{!4dqwjOfXG^7Vpq4dK`=Nmf`3{KPny3To`(`kbPP{^KHMD9j zBe!JJH08)G7NXmr0Xh5{-RpY8Cq?4R<{X+u`bYfI{JWm->TO-h7j*D5C4X)VOipQzN!=*(z_vWP&({kZ6J@94f~gk z>-tOFgo$lrwW_m-^3+YXLhU}-vn;LZsnC{-NYLJqNLO>uaPcQA380EfFfj!&R>vnm zV5>lWt9Rt$!^|6A)^fA5 z9$juwYWaosNzOf)M;Xr_>?ClwSu}Aoj4DBoiJAgQl&5lT;E9)PUf+atp4nMzjvF_8$}_+1NbRl|iD2@{&F-5R)50 zN#@Up4${yWi^I+GpPfi+wF^2taZM=W?ginLuOf=1!~5gho*BSl1YUyt#MFXLj=Qo8 zr;b{uzWm*$wZSvzTy4{qz03DCw5%sXH6_7YtpEU|n9vxgtMMYnf@7i3lBCF9Iwljs zg>e>&CQn|DflL+IR_1PxDcA7Q4Ul2rL6#eA!i@CWuC^FK;)!qn#RGAc5BqYT(JOde zWz<$38upyoYxSScO`zLesNVk{qwW9l27JY8>b+f&1dtUKbRh%L&=Rh5(3fdFP5_e+ z8r8$z|Jt(#&67dPS$M$AqcYg=Zh8M%Ik~k?PBMk;S z0|4)2e*l~ z0AV?@6xD0qb<(55EJlTt_a?Lax9nP5OQXSelB{}-AkR+M*P4#^P}6B0N?xf?aTyDH zs~`&A#u|3L$`ePMO!i{znRa5><__%nwr~4K%?)p<-bsyh@J1~FP(6MMdgp`adrf*C)HTHv&MQO8xY^m4L_iTBK-A%4?bpp+JZyb=ZPltS&AFv^2~`kvy^jcmj~63PjCBf8Rk_BO(VD%!9^oVP7R+_-p*r2R9(b|J>SE3lzAHY zUi4P+ywT0|$`5{{=(2eC_`?iTg?1koZYY>m%!>GDd-?^}@S%R<3qE^ljWYuewsnlk zz@cHu0{roSJI3pt_}>^WC<$d}i)kT1&`LsrS@KP>NbnE%{uN)2@9xam())xD*ffQd zt>H6=aJ$U#0_4|t3!};6UJ?>AOivPjS(^rP*AP{VO>3=B5!Oh(uDf418H56-N~XKUjf)7ui+kscM>Y z%h{oaTj%inQW*2&HcVa0C_Zn47=SQ=lZr*m5h28hh!ugEA_dIaW$hVk4dZMXE!W$} z!ZzCP^GZlwztl5AUGz~Xk&fb?VEjPrcxk6}>#e+Zj1&~6gZ)DO*|lq*UHdt4Qqo|L&lTcIebDphpgE;Ok30-$ z86PD^B4^&J+FlMH|2iZN6}fo*YjOL(0mlB-E?g_$pIOD)SOii=Ga?U@%s>8(mkWQ3 zb#l+N@17+~wYJ?&&2isMtR2S@XiLr^e7VCHp^Ye2*bABYoNUwd(mB0&rYqZpU^Z{N z3AKs-Kv>z>WA~skd^NyDb2(EAh@={lTe7 z+Ull@RY#CYC@}-nAE6V!oRkBhK7_(AvRb>tZm1B`aLM?3OG-<~03%x`w!RbWa2JKx zuGw9^s@^`SC$m5}+$JXM;jKU-nU0xXgC9>%uf{_$7>^5@mS4EO?pN6L`|W~7OF}M@ zedj7ooK8;=BsnsKQ-<5@QZlL@qq-VYo3uAruhX_Qi%mUPYhK|$!`Dx$ZiutA6=TX( zOO0&U@=W-4*&$LWg1NZ#!!(@Bk@j%>g*Zk$Qmu!9jW(dhMzs&^bl4Pf38Z}j2LrJg zGnwU`4X@9(B^uuOkGVer{1<@AKSnH%I(reyQnrikxmRpKD z$F};vb@|TaP;h}Yr_{`3RE7UI*cKujfC*YJ`TcEHZDO5r5s$xT#uBe>C#gBUpD9&m zhwt?$b^AC8#n-~x(RK&wBfLY8GWV!t%Rdf2l+k}lh}Q!LeHA?I)iY@*RMRXOj# zQLo=fK@_@kr$5y!rZv)x>UijG+z#jC{qlti7v(?OCfZMWIaWUP_SOQvS<2w!N!9%y ze|VgjfBgPc^3V@+cC}JNUZ;G(lL&yn>c2{nSeH)-d*vpfM@`I4e8-yfR>P<7T=z(X zeW?DZEuM69DWpwrTV4*Rv?ZA9&2+ zHt%_|dfgjPy7Kd{eayt$!ho0H6LXc2?Cgwu@V_lT;sH&Qz?!K3Ba@?DROvjqNAekf+3RKF1L1 z#_s=wO6lpn=lAFI7I)|Pqjs0~MCuX3d>7YEh8KVY>|N8R=h-1l_+xL@wuub~jm`w< zy2ehfUIY6|x)?E8jn^D)9sB@cJKRTIS@7GVZw`bE4|s?Gry5Fk&x_&1R`B5 zYNiz2pc;qQjR1I%`YJLz_1=5UV97q9?zfYDYw)@HG5$R_{9E;k|ik&$*J1sn59$WqUYsgBG!ftJsla;fb^U zE|z`CDA3zm&fsUFz0jYULQM!F1K{CzwjA8RP_Xeh&oJZrs6lHR{ppOkcOhkVN%To_ zhrV|b4p@uz{M3#XYEsmsMo?_s|NEf)qr4|?_#5Kx-+a3#F{Wi6SxsbTs2MNqB~`nP zFJPSZTqIGS*V)Z25rEVh!6;KUm~IAlRJ(*#f*I@vl_PNM%wZ-~O*OmreRPaBf6Vn?eUujeLJ_kcq{o&34)r9SUJz2X~zz4mXM;6_IqaC|G;@1RW)o~Pue zlt99$txo0&YAGLuk+wuTs!zV)@Y%_mn#c8us5J9?xY=5`ap#@6-Yd>t32%%~U&D*r zQ8&JG8fUg)D^t}Hr>+D$Sm;Y|li!8V=w%C&a^aT*%_a8t1-8(*7B3i>1sj}`#4XnG zm3Wu;#3BgUkdE8#syKoUlaVSOV`z~x-x?V+>BGrV(sE@Bdq)6-WcdY>j*3*GSMSvJN3#HNm$ znY}G4(KyB&7M8J%@~TW@y(6VP)$r0N15lZ1#Mc-WHUEQUeya2?94;W|G6eBCr8}=d zaAx&`!O5D@F)fuwFk2bs?W~-zuTRqmN2pL`D-XXt^l;hgpNjJz@90m&5t853!mb>& zbR(P!9>CS(wA`d>*LMU|)1J2`YX39D{UxGx{63u276hP#qGXTrP*v5ec}0boDkC!m|WDb|u))3;(G)wyG43?(%*5AizgwgE)vGRU>LXbwhc!9FEj z#O(^gqfH4^O4C#4m|^i?%AtZ9>e}m{bCv@+Zgl{#_Z}fgBObzO=2Y9g(JPXC$#!*G z>@a!H@?`4?OGrY)6{~blSuCD=FI;(@Qz9Zoml$Dcg9}p<{3Jt;7Io~9OEDZBELQKv zJR7Lf7yLb|F3+=&8vzJC7HJYN8YeS?7$8cq7Up_iT|~M_{|nD#eN2tl4BlDU)xMze ziIfgmGy5dD>we8k#>cEPi|;vx#~ z_oUw8+ghYklKYtc=&OjkFyB+kj+SoBVTf|eE&L+_rUsM#}cgdA{ky2?x z8Xx4QceJQuxz6>-$%n|u;_6Y z@j|`Ix`}E&m{ZweAm1oSi_vcpBoBkg;%+OzrpR$*s0c^lN$XF=j3nXBD->9SL6DCBz@AK82D8u?JNPn;+x+EBQn zJ2d6&DNr}fkjK1uADBvuzt9I^zs+t&TndMmU#y?d^OtU#QA#N)xG4-zP?0AIdhm z>hISFE`1KRHgspg{^ zFX_zf13-~Vlv7h03<(A+UD9+i4;=}9n(yy#E=PZsafbobc=W7(#N*Wl^FGae4no9& zS#qP>HaUFXiC&Y^f7E1lSrVS&Kz;MAV3gtVvz+EApHOf} zQ@iGb+DY8+Z|uYppQ_Xt{@GP2=MS?761V)3a{dK?kOvXLCMUXZs9s%AB}J5gC@a^p zC(NZ}vcRqU$fiM0ln&F>w;e(jPHuLApclxid3w@qs-l|$oL@42 zuO}2o9z9Q_V>7tfR*sIK-p46xA=L0*wLsOka^NOt9U112<b3rZMU>xcH zQQZ3{g+rVETXTIX0l(sQzdI9aBu4v!aS476lsgJbwJgJ$nLVL8`TyAy{{Ky2Vi_nO1eQTarSG%{t8z^LO263buL*|7dyKR9F9%E62c z>3JSdy6z2LpaVKnkN1m88KacZ3bzL%W)4{y@Fs6HR*v53qL|Hiwf9P{Nz~EMuKJ7R zR@b_fm87Mj|M$a8zDj5vEU@ucV$dytGlh2H(~3XN)T@3Uf( zx@aGgS;e2}?Kb8CRX=@ZI_!{DZUqv2wO7*KEkY!}L}n$!TG$i1=Kz3m;`)}9*@R0E zjfnOw{Z9Z95Ah+{)BGsfX2x>g7idzm!7pDrPwoWzz9jrvBj1kqfn-9h=6&O)o<_Z% zs>AA%_oIv|BvPdZ0BMWU;N;_cAtH{X&pS`3B_LN?BWtO;2x>xsn`6vUf>sI&gKI~R zP1@YraA~Az%@!>xI0{(#>#o-<|9&ByrKmGbnix)Iva6y*RF94q3XPZbAqgTq> z?kj1oHxAE+Oxd->~XFFni`|Q;Cu4@W1U9ej*5iS$ zy6S@6-8$3``z4I!xa-B=r{n%D0og%fgdVs#0s!wv2Sito6gt^&zjmnTX3mH$!ge7<~ZIB34?&RdQ5w0`qm#F{S)e!vEG)BM!|0GKgD#$_w3kY#_2 zi4MF$*wzXkG}dKoAjYA1EH=6sW1>52;;|yIqd^;x7CfK$ZfI?RB}xCg9j?FIA~OI$ z%YzNA08SC0m^_$5V4a?(=T5CvFuv zMQB4G+!#S)7X~ci;8N@YH3)sNs>V(*mMEyXjhUnH-xAC}} zXe-ZdEJ9}a_#CcM8v(#T6Un}30pJ1~W+?xWcZH5EI868?4lDX*wv80|BI)`%%da!O zuIRMD>dVi)g1?%re-;@$xSh;`4Vn5*uD6jXOT{UMFm4}GtB56bjs5cAGC}kPgr_vy znw(H2BI|RVkYAw)I9Wro;Q?}2KqN&R0F-SBE#YZ#-M% zhnhc`r*E6I;(~rAQdrx59qKJQ&iZT(B{V4#e?#h#=Jm`It;4rU9}g;&-eVb;gM)GL~XA;?8#g7?~^& z!x05-pCOpr$AWPHj;k+)nfsj?jZ`2b^S@l@zS%G`-ME%yFbtk9 zkh?Ll-Ybjxd-`xq4v-=mmDwJ;kVoL*l1h&1@jl&}A{xNKu30og|DGED=bXPo0)HXy z3{WWo06d){#{qyDg!O9hVx`Og0IWR#fb)0M^8eN;XaoSTg@^tpHR|#|sh8j0i2=yNR9fVG=O`m;J%~W*|>AJ3kGM z53U|7e+twNvc`l9f?8p)q4dXg1(<$jP$Mo2fb)$%_l6xVT8m#A1Y#iOrv&x%&|^OS z&Yx8qYJsJ#yyIU8*J;sJXa*q&AOKUBO>EBpzpZv_5_1)bWoXP|$_;Dq{>D*;FL8gF zznzvTZ}8ue|1~xu6N@-(irb-bEaGlh!v~A7ey6WI%aoGImlh1|S$1Zi5wX_qa)-EA}X2vxou3 z@{zY94{vkL9mo$$etojx&AKq`(>M^fD5OTCc(;^|U%~8A;Fv30r{W{?z{&Wzg3M8l zrqS8#m*|g2^QY9WNv1zNSh8VLDUG%bA$CBq&e(qv3_YK`_i|a{P4->1eEdRoHaco2 z0uL`Oj5hq2%=O=7{)pcO)C}pt~OvbK|sNU7_2lgXLjcwF{i&IM<2c+bg+g3PS31~fzKf8 zo1~!65P;sA6u9|2{uo=Xe@CceuC4^NXcf76B}tn6a9q-pLZm-Yzkd4rn}4l*$g+v* z$S*5V=ER)GR?UbtiR2ON0 zEh?pkq@-xDEr1+)pkr`}!5+W5t|-Ma=Nt`Koqo26Hk_L;H12qN?^q`Cit>x zoZhRvynHC^=A)JCqw?}-o66ZMUTpqt%w^LR3X?3pfw{_<*?1zB7=i62z1J{z(>U+e znO(9tMh=6y9f~=`e!$&yxc(S0Zb7R5jsbQfP4pmG(O~%LCJuhu=JB8T2&xqN%#gTAZM?s17wl zm^c7YbM+x^+B>h29+0NXcQ5}jN?>Yl@J^xOH8w))7Ge|C?@*hi?CzK1?8FdG@niE{=9B+BEbx~ON zMoxjB-++Hr#DGhq<7-Y8hyW&1I*MEzl;qjN)YYRi!vF#q3yMb!UrIU-4VoxB#>M)0&ptq_4o2i9lbcQxs^y=(-~9M>%Y1ce`<36 zc`4Fn{!Uqv9g~oQ`?SX5v14{3n;SJ!BZy~3vo5ajE)C_FX)8zXCvSy-2anL&VMWBZ{6+w(NO1V!s4p5zIOc2?hsI;)7z&)fguSb@ z(^LWCVrnN{$*< z?R~C3z8Q+yb??TKkOws?iNCPn~w#Oe^=_*tk5pcFcrI} z2g@#UxiR4Cw4#}`$fjNyxPupc@|0Jzeq?Xf{v(W_;**s+-_i;?3|_>D?lBeFi* zYV9c_x5lyKV1dEc>@rCo=S?^#quo+Y%n^<}oVUId+>YIIEmDTslZgo_?Yi%p1ax3G z!{bOkm^P2df2{NLYfaGMsu9JXh>OH#Y_Laen;4ZqPPJ^qFZ2JO6qGCCw%%PJ#)075<*_rb5vnxQqNk3^4 z6$+T=Ou_}eIOBpcQ7qZBFU9>F61)Kh(kP_6_|aV!G5Y$d1-_amI{VFj47u((^h8K#EnOnT&gjO-utHYZRFH;+ zVBysPdrjHqomQ(F47QQmaH7U?l!X5WsET>t)#$oVj>cQZ2$iI%TFqrLrddAdNV49e za;69~p@8Y1<+|);`X=Y?JEM*deW$g39_z{U~k9_2Cr>b=2Igz~?M{J(!S?1p|!xUS$ z^f@0TPON9oXrDsEXO#DC#@l1V;?TA32}Yi8RslXmmN?7Af@w>o62ny9DB@fh^}!u! zMN$q1_ZIp#huP|YinOW9Wi#}H*retiCR=k9iwWutjoIp>?xn9y$B!p?E#xr2yhvvW zObycyT0A7uOWN~JxU(cPwH;>ck-Ac>O`{$&8s(1h&D+mjuJn1+II#$D#J?T> zS|IP{erNfl!ScPr8dYk+(&Fkk{8f8`!x3wfBl~g@sL>TkF$T3;oHH|O_w1nYy4PY{ zrB*vlC?(nKTg})f<-@d5W*yXmR3;1(d*FVKy`x_4+|nT)@q`*OLeb&o-4OB?Ffm3?(azK=Y6I_pC<}Am2YueqOCsLl%nVrWxf4SPkrA zYt}rH4m;+1Hz~Vs4_-UGmN4&{k*Cv_pHIl%AA)|!>~T?U)23uPLASOfV%LXA#(j)i6{qO7@EttBa%EZo& zy|c2<2M<(PB0@ArI&gv;qQApnNTDdfDk|B;d zhjV^4ywjOaeK|d@drjqgej_dwz?s1!t|QMr__=d|9hpVC>w#wdAr}(Jt7=U|IZH%< zrm?p~ir)KSGzbo*h9=$uks5)Nk3~P|MNfs>r{>z!o|9AI5rWzp3BX|y27(W9d;4nE ztgA_7ImxK|ea}#P1>&CDe#ft$-4HxhZ1!ICt8FknG!l8;-@pNSuJ^=^s%u|mET*F# zN9OL!Q1j2GTc^#$nock z{v^i|ZRzY`V!Y8x5(I5jqD$!ew)5GyDGAf;dS*M_*vK>Zb@4!nFi;{6%0Xjn7``8K|CXFmvVx^DfM zxcPH}k6uh$vlz4mnHaD9I^U|Z5_9EkDfV@)^*l*->V^O@Cvh?(+X=xl)rl`Y70(_q zX_?pMANmkKPV_jvsP)5CFVzlLo3_6;t2sS@cI&P@RZ<1#;v6ReXhRAR&fPxm--vsL z#?_J1cj+9Pi%`WPj@BYg{7|{xgUjm|9X9jyx(5;1suTh>RAwWqWQWlb6|bY$*^s!^ z$`!F+VRE$m3^PAlo|>u+*3V8h@_ulIvZJR;8MbZpZ~70b3l&Egg}gj{S<}K8RJ@|gIN5HM_a!de^qFM# z5~>m(UZ=5+JA2G>-RaA1+q$rSRlB{R<+z&dhZ=t7!hcKpQqK7o=u=ybbl6}g zKOSBWx zlF@A6ht9Y$KYZM?XWQMpRW8cqq2Z&lcb>hhQ?{DgCO6wlF2k>qO}4k*oCf{L#NKt0 zqGP@-5l~o7ABy=8ml0g8o+ZkvI%|Bl1V!7{^dDo^0Z}&FqFL>)xQH*GFhC`=5gIwk zbkA{BZ@3E3`BkqY7EuU`_xH0M#)jk4?d*+-`0s8^80!C6Uw49hh|nX=j!5~wplrG@ z(2g^Oz97*n5xJ3;xH2VXTb1&`K1s;LW#$1U#geIf+E}o@e8mpni2VXo{ze=&yS}8< zluKUUTo820%1+24wdFvy-b2&tB7f&Namzylii`svjF57WMzPqSB@I30C3=)&gvudY z1HI^s$J+GXi`)TM=x{PKZm9^bqIN=|^{q)7C_b8XI;$XRF;zWk<^^9x;<~O%enrvP zN{vh_mPYw-%(m&&IArT`MIly*#zV{K4To(epG!wS?9tWN?h6d&kC3+6_LaSF!@*r+ z^E7|xKDGvJXR0dp5>L`~L{9}0%(T~kN#TUuvQV26*YJ9UGjP{M-vL2zmr*OmR8ec< zJ>y>60N14K&+cb7R&n`BV;lh(uS+SKFr)LS1bKavaO!=vL)_kG7^~}6OLV*%yFh@^?*5h%Axv0PPtd%RQ>99wPh2>%weZZ4Getn>K#RVH;vMned&dl!^X*9%% z&P3pds+T?YBG~%jZ8wH)|58!Bj!*=%=e>BD=9I_yEt~Sg7b0YlKkYpb<73B>d(AvY zfu`f>B|`~=mO0r4GCU$Ol?m&o!27Y zJwD8IMP-WphXMD$E-XUXSl!EA09-R43a#2Bq2&6~<2R_@D?`-y`NH!gv<$NihZGIzmF;=T+%Oz!YBmO^rnAbya+Q;t ziS}%C5Phh)dn|zaMmLP9^A5!1fmrW!xXehQ*a#6W$ z<|MRXsl+e10@Y?M0eYtC8Vgt#!Qm`0AZ$3YXCaVR@2rhu4$U!o`{Wy^DsebFrf9xnw{a5-~x72kkE}^bV^QK z81Sge)Ub8A7z|bf`@`YZQ{9Pi4(A8hd5TYvQZ3y%?IV4JZ5yBYiVLRmEM`J|r0-e7 z|ANnd^xY9iNlzrY)5RLhleI$Y=5U@_!S~I_$h>4^?EcSIl!JK_FCi{88ZV6>+n2yc zf>l{8BL8wf!yUklf2j zS47vS&{0j+*~B*AyEg*<}x^C z61{k@JOA+bs`mafE&o^()#Em7?p0Gfb|^EcoM|JOLA6a$yd90Uk{&&-Vlg<7uYlIR zE{zPJ-tWKXpHbBbS7M(lH~5jkQl_p)?8H@_os2WCVv5_ZwsrZmr5Vir{&K%Fz+DFs zj?U298()4npvbWl{J;m2f`Se>F{f9`EZFmA(uP{z{E`D&34DJ+CB-?Tf)pb4|@h?!Hb9@`EkcI zO~_1Us6&e)#ke!tXD&GmEzcRGvM9EY7_@mUT6NbCGQ+WS@-7Kwheo(n)~y7Jin~6v z9~$dW=T2gyCmn_13@q^`@-yHtI7JR=@uPcQ5#AyUdzwF`J&=Cu^szNDweYI(#2gHu zcT`g`gxfHG){ta?@Z{3Hk;4TufkTxDp?>5EOwXBeez1e$Tk7K94{C4fbz z%%2C&hdGnN`+5-3Xap(zxTKRWnVU(8CW-%Jz;rkwdvH%J<5}RF*4B^jw~qXG@5eR% z9Jcf>|2Vr-I69J-b=8BPTyeMpLHEK?CVJmy;v!0m>u}1k>N%L%k z4sLH4gX6pnzb~pJll@#84#ml)gd{gq0VZV8nsma;<`+9cA;D zSMvDl!!nkf)V#ArW~?Lr>UVNpo6BfoFh646a_WH_P`~D^gZXm^0iFG-7wYW0R|=%G z<_AZZZ=J}^dVSs+WbOkq56ikoThdq$pZAOJZoyU8<=O4J>fQ$$YVPn%lhv!YtB2RE zU3cYF3DI~=wN)%>7TP15ak%DjPL&&}fvqgQq)_{2!LA3lQ#l|4PIW;w-Ec)*{mA&( zYMvfL7D}(R*disqWsew64P0$S`0EJqtd6b-lRG^acB?Fp@j@)~^);mKV@Ppgz}ZoE z@=N;19IeK0Mat);k}(n}nG2!g3bzmvLlQuc(|0-AV<(5Y(;E#JPs257%&HTA01j1^;n?l(AD9GuAg@s- zg7BdG#s=KmXO~%juQ>>us441UIdeOSlZpr2PH2GXxF=I7kk%mI-a&R zm16Ch^TZe#md;SDU$YwJB<(z%8^q?AVai7j~CYA&e zoj_82W)Z^+S6->No{cIV*Lm&c#ZGw5kAlnaO2;BE5%k9QscKGH)v1CuF z3YnK#`Qh(seK>P9cXsO`>HM7dz7lIyRNvEHu#{9bsOGT6S08?PTyaRfgfW`xVD3Jy zy_w%@ESqF}K&ausIyQ$fAhLIHo~yIEh}Yg6$BO0LeFf|EJ;GoR3}y2E5Q^1nZvN`E zD7!DKc!05}Y2NM^CCY<(Ye4Zy@!fW-7z~!D@N5|KcbA`0n+|DZF2HNz?n{n{1LZHOh<5CtM$BW6J@Fx=2!Lp$JJeeE%t|XPtP+Ll}o2| z=gM8qzyG8jFf%=H$2Q?7%??dB=9r@v``+;6H{wzN+**6A9an1YqSaAgbKsUbnyUHL z-L1HvjpH~`q{&OoD1W**J`3~GehklAAM`;-vFDX0#D_GE3Myd8gA=Y@%qaMam6Glu ze*Mb>ntpC^RqubpLTC{aK|91&E&<@b$@KI zuMG2p!|&-NsIChu)pl?qJ6h+Dn+0O$Ag{EwQ$>}U?{&=|zcj(r{*6NBY}j55?3J)qwL-=8z{+u=}pB7!M- za;>KHlHm6bT3Gss--UunaBX`58pl}h0V->q~FD0M`S0bdf{PtmFuF5*cK;B+~ zbolK`4pAZzF&_O(MS*3E3rEp|3D39Xf|=l%nC4MSXL;SbNvw9(S7D=Xs+gY? zgI~C@`93@Nqa)>kleJ7EF6`m-lpULsF197|k2OTFFWBb<+kd|N{r@glUl}%1&)H1( z=7Ul>koS*p0Wmb4$L&a8e03teQ?E-WZD-ES)>MK`Z;5+8Moi9h#H&%}L#x-XBAogy zV8_wdDLkxCvP(t-^or}Gy@fcsTDaHqZ36bk zJgTKp;lAV(*W#x-W2KGG@^Xo^%C|=|)8-S_#WKy8+AX87Su8@tkG^rUSxk7W*P&99 zX3YXw&Eqq0*0=iRH7fB3cC$t`)S;VFY+Lx%cqOAE>Dp@g$~lZP@LnM!w&Fk1X5_6f zm=lj&?AWp>jf`bxvMeo6_FBt4nV`Tg;ycB2Er(b@>Po6 zL^F9;Hxtlk^wj?Tn=!XWW+30Va$%~T(zvOpU#Z09WZr0R#=OLq!9wkueW|E2PF3v- zeLr$AAr%kXdnFfWnh6(Mvk%jH8e5VdQ&OEdA^95ASnH06?_|!KxXSqyHTp*ZP}1A*z+~I+w9!3w z3ePK>@YccsPX;A&`Z9Pv11ZdsG?JW+sqAlv1KA^8u!wtnL&H+$hk52}A=TD506C0} zv#pQ;>g9msh(brC(s*>@$a$Y0EC|bJ0A0Y^EZ=8~PAd@UyodX$L_0-2JKQ&rG;rzF zmH_kNR{941o`S==jXcuD@}i=dJsJy)v?@~n zLn`?Q^M0cNn+Fb?jmi=wHIi3i6lfS!E`5)l&OU ziIwQG<@?U?pzr~nZ?Jqr&9XqMdJ*0<=$P8>{2c~I2d5Y5m1p!24VKM5mO$}TN&DbW z4D*C`n}X9tm&!?`CE+SKzpNTR5=2Luk>_%k3R~vPzvED^2}Zr=&%gC?W1)B7EnLI<5uN56TD^HYe&F-;cJY@@=G_-=NaLuzUvI;`Xy4 z8NHTYX4Q(H&6VKG!PZk6I@R+PP)_&=*jm3g2~u&JJ=-(UuB12|(bB<6nX?e9K!v3p zwz}!X%#jOJ$iw88bDWm=UnyI0l!y`nAO>ato$^enpC5fUe<-sd&}*jm#)`x43K}Sd zfX9E4k}!fIA`I_5#r%TfF@WJ}EZlhfXm&~*H!>Uo0NFHiyz)5IQ~Rq&_czHYZA4Et z10@`$rR){BWb?kKXG>JogyVN^*u(D0Ym-UuPOsp`mq>SSnOpIa`W)LKtR&bW!9It@ zgi^M{Uu3ezYsu2Tb~kIYoo|lqH~u6sZr9%Q)T`ocnmS7jp%cqe>eAQT)mmyLHo@=0 zSxy;m)P1ek4g(znhd6p#oa7DvLL9z?gZ{h^8fOkRRySb{B-?M9yzW3VdJ62jA_@Ms~cQH4bj&6g6ycbt6N{U3Y+PI0^(^0Iu|YT&tylJ2`RHB zr)DI2nr<#?VU5#7=725F<;%^i6}N>tj7cE|!=vLLL#rpMtI@s`to+U^|LJjCayLKL zT*SzAW4H>lET4`rwm+7UAx!5?Zhdd#{fAD53N{o5+jFeqS^X7S7ZQ3SG zmW*U6(o&2DPGSutHSLO_cs61FC|(<`DV zjJ3KHV>zmX?=$xOg6IMJJd|!61l$Y1cwYa6m*}ZuHrJa}E<(x+L_;y>^DX)}3HP|A zusu9a!`_WQJLE8!0&g@<37%Ix==kOb4G%cR&NqLi(B-I1!4M8xp! zve8I9uYT$9YB9jh6P~KiTIE1!g zBH!^{cdu4Te0@sKy^8sh3CS=K_jJj%1Scp&*$=D>m+9~(R3o>bh%=G>Yn(#D#P z>BP*ZB$bP@K6iU%4@}F0A`ZnBfus=rk*UV&8%U01Ylhy=J?K3M%aX9-E{QU9khShs z#aqq$j8lO33H&+i)mp7>K*yDNVK1@0H*L#f5QMSB<|kLtb5H9-jly}M2I&g zubt7ao?e4d!jPz}$9z=+WfmP)$~q0z@AaSeGiU~<4%xIIGcs6m`upiBtQ8cCejz`nrP)yyC?gk~S>ZB+y;WIOZ zO1Y(p<@@`uRaF|*9Ngd0v}nHfYbxNpxrF&S##x_}Duh)yvmO}CWGJ?c|B=#S@AO8) zZRnP(zvJlS%OR5V{WiKfjR97rthf_p{p(liG)IGRIEwR&aQM372%vQNoY;D(wh#h~ z-q^c1?n$aT(e+mY^}f){tj#rjHebdYLm|ojdamZccs#HYUU6Q^n)v|Ru4m^HayzA% zbQWw-L&jX&2MWFyXrkx8bzC_Bb+R{f>CAI=--&;NI&e!{{}XYkAM$rwF4f&@AL9Ua z>f}A?&pbPnzvF@EzDpDML4mf18V(935!yN?&Nrixyl+&mMjF%xlD`3_w;`l>4f}^` zQs)LD7S3O9wY!fqf;H72bcUFV`f3!r^>(OmqF9Q_Z$+3cvb?P-a4jzmA}ZO|qiz%~ zj>91rOlRj&a^`Yrl~cvc-w$bl$zgue2_HYR7az~fn5~tR(Mw7p5L&U$#Umt(L)q*% zol-+9Qlx}9mzT4&h%JrtAgY#KOx~naA4ZGY%(ZE&ju83jRmRWlvAo&7WakTli`)*} zWgE&YyGDw^f}RHj!dy8L2}Laws~;=4Z}5g|J!eGnt767aFh{HBAK4>PyC|2NjI_id z&e6r`Mfk^Lpj4SQHPy99FbsM#S)~=d48K)U@cr^42MX{w$)H zn}Hx+{>P!0@4wJuhf>q(C1zXK<=+I`iI!_SgN}HAu|-)d z_j-GTjCb&J!-{+c*Y=hQbZK3XZ4-@0a7!?3?|P}e*4n~>&7GN25$qT zFkP-~q=b0PPbac$%M3(iXn~Ab*l9mj}Q`L22 zhls~zp&j!RbBN+Zlqq0M zo>c5Jhosc&3TI(#d>k9HxG&7$=7$Le5^%JMn|+5?-6l$(ooL-Rtn`jJN6NxW7{AcL z<0o&zd26RD%R~8U)?0z&(hl!N^wwM{3ub$o!o3Ft)PTZvz_8+ zl@Y13wAtqYPT8?I$`!6};|VHsMVRlGzccY*IY zlIPHg0n(p(>_|})uL~b!QY`nPVYwUk|3}+f2DKG+ecvGjm*QTEy96yz!6_0b?i8nZ zi%XH%Qjw^vt}^{o&n1CTEyTa&q!JYwfl6f30oS zVI_3g9ykyg;Td$>s${Bf(lA9F6Iin_-GXj4TiHP~1Mmg2-fiHL^8n@I*y(!U{C z*eB0!NCL~-`{EP_aR4e*n$~-xecURHkY7JMCLEx2NBiw3axKwmWP7XYQF07*br+ik zT4(^;j|^z}Ezza<(!E4r#qBrWIEcZ0SfW;3ihsj&WQtcUuO#^C5*xy_s%2W@hRiQQ zVu^?kD%TNiQ&QF5k476A6`DceM0~FJBe`O>EutFW5{X!-ZG8uhi$0TO;yW>0D>D;8 zQI6u$;?Bn6F=4jexp2DvX<@lBD+!Y)4?T~cPE1kr3*1YgGQ5a z{6tZ7ERz2chl^5V{!=SO`1(td7^b6C%FSZ{;;*?}qWMtFh7_J{D!>=FAQ)7=j)hLr z91RK}%EF&T!;6UBwue67kY{@V93Eto$$MQ4>4n38rcW%voFTF0xZ<4TDQ0HDHrRqz zO6bwNSofGf5{yBXBxodg}DR^#0(F{gOqCli;|{ue<5Wr#*Z_*KYkc;YmAB;_H=F z>N-@fdEL0)V-%S5>wx%Zx6j84k)j&N%F9YNY{54kWKqymvFoR3Dj7B8DJW`%&yVyEP z-2pr#rcK31oN1|(Wks4n2H=kP<}tJxJWWYGtFNcYNaJr_7J#j;NMah~0FlH>rY47z zuL_cYX!)G()~8(cK4?Y_#*jEq`abbAP%}{4W-ItxB~fN}Ub5yomXgr?ikC;es$Zkj zBLOM-Ycuy&+%myle|L6H_D>Xm5@U41M#xi$x>E(%65x=(g;L>PyBbiY$R>G*ilYxa zi#XrsyHVwg-AozxAdVihv6Mt^T%&R%av>aa?~yNL3b`sKgXdJ)nUh8}jMuIC8bqwi z2LBOP48TdX);#xu1BR=(DkiJ|NjexhU1Ly2zsggux*5#XjTeWza5{}XIjI|2eWjN3 zjH%e*%Ew8A@yIT#ix)11mHd1{g2de~69JxW40M=1lF0qbM$xkDl688Tmruu37B0^X z8#{&DcODDV1E0k-jM}(sw)^vKEl)nJ-cR^dcJ_BD&mgXCpfRmTqar?;q!E8^b+h#* zpuQiU_aHYufa)c_($!SB5LcXXCa~|f#UC&}2 zf19rEx?xE3F@*$)ofYZ5wZsgIqY)6rq2QU$5C%1Im2vrIj9>$4DZKlblglHa9Jurp z46Rj zx_Td-rrYikE`{`jV*g?F@mAkEpVqA+Q!Q=Temq(%kJkyPENqm)jFKvuF{|(@>9f6t zXRVc@JAZW-I*goV>7(W!h`t&k=RkcNN* zav^Ke@!Bnv;v{(zA=zD#jXdT@R*j<^>SNSDy|LmAY)7d!+urWW~bnoCa9)p{vF0I$blX>5ELO_qaU;lielQ$YJ) zXAhOCMaE)uohacas2&4{DM~iJ$>i*hoein49x5Jk8Gq54SHJy(@;gXW1b?%G?g-rG zBuk8P51QjlA_|jZ-agk9{>;@KR-P7>5oyGcY8&KqZoIRYh2x?ln<1CerD`oa(=cqj z{f{^U0Q!K%;)zj_tv<)t8SAkLtUgYo`j=BuLg9%=M6+iGHs_nWhb;lT%e zfGD&y3K5l8u|;vt(TqP&9WH6fL3uW5P@+{XW%cA^-reQAb-dJb;n|sYSFdIsP%&T6 zHS*C+=Mqi|$H7r;1tpuG&-;wOOq1+Qg-0|5w%tx&ykl6Qqr-IKe_X^j7-Ap&eCHz| zs-?NmOn{!6FG|?^tT?KJLaTE{A8FL;E5rFf?RKWM!2bo3>cr`d%6pb{g~+H7JqmPAh#v9Il`uDyKOV4;=aR z&rnQ`!eBP?tvqDI%^HOtEY{G%JVMlDl~Ql(4C(5-tK)m9_=1EPUDkyb3yOa!TN+s} zwR8BhYM(Y!kmIbXHR%UpS|tg;^(B0as+bcJ_RwHTVEsBk6#U($0RgI-e;op6l z@fT0U--};<1No;DX_EqUB>ILSx*J(lVr%B4TJ{c3he?H9vVUkA%{OOM5DFLhkB!R) zU|?A+pw=85UCTSpUY(hw;>5f~5m$d$#4Qr5x?57{h~Oh3mMWAP32luH4xA;fo)SBuOT?7#4N5P(s+wn6(IHJkN(>n=*q;b5Z?N zJUmTBXJD92f{+oLrQ#sa!#B;)x@yd0R;ofVn-;{4PLH)3-%KiRB5cc6v07?+g?#Y` zbz7xG>RodN7lRFPon`kD8otZVIWR`md0XDyedOgo=&4uYO-4A)WDl@xsqzB| z1FHR6QIbVLVG>QFK+45tlQfNXqjTvjnbLxxBM;QF<}CK_Wpfj$YX+$Aji{m6gkaat(i zP<0NUY-!Fcc}-HfVsxs1#WmnC*f-rbdrDDygK2hEvqP`*CX&j9i*Zz32A+|>IT`g)30e3YcKMcvBn024mpKYvWnIu>~i~epr$YvunfbwjQGbQ{;JfEmDuClsdHUcGE(kKGxfz42FZeY2xu zY5UB{wjy&!PEhEpdDDteX*n%ZeYlcW)qAkqa)FU}T^7b5rF@d>%{6>PWq7f&utaz9 zorNt4aV1;>7y0;6bEvxUD~ViW1BDqo8e!93TqF~=bW@YiAEDobG?e`PSn620Ho?-H z036o=5OhK+@ue#noW9B>c1y)&LJ@$V=KDgrn2#a%Q?_4MC`QgIWtjNVIXkc_Y3Hr0yWQ*71GB~pdwLi>uQHgR^0;%n}? zip*gCqpuVGz0UTo7V+H{y0`gSgC4s(7hOec_&$$Lj$e&#{@#^7cK>ompfTdE|;u@FmDuSg5N(ux8F`hJ&Z2;z<{g*gri}@43Y)7v{ zuCDiQO%}ppG*J1th9~e!kLp*RpGN&<@iMvZyNvB129a`FJ3@SALo$N;$Yl?=Jf(T% z=ZZO8<)^?~({|So+8IT=k}vXx3RshJuIS_neQ)BXi3UjM-jHQsktpT~oAYC!Q6^ey z*bxC1=M8bSI2}$S?CrH`U=HqY1rnQr%)=|R9AUSCsB3qGTHjh?XJr{T=`<7$X2!t9 zdVx=VqL$FBElTCQlf0%6^3U&iK&c2Hot-`iRq|65&zU$cYWq@F zX%GLz_-U|`Y!WYShjvt3&}`NPilkY|G;yY&fAIX4>tsoFoBfrh`*Qcg&$#!JsLJ5l zW{KTYVlX0&A9?w>c~vVFrlc%n;M9OysuY97=b zIl@AFU;K`Y9fSK~bA>4Su?@F6Srzl#Fn!qU-x${(G#Z4gw6^TNy9=uPL3E8==ic2# zR=bsTbhPe0jmby;egq~v1h z)HvWZFfdg5=f3i49!ndn;-^F$wBkmtT4Pc}FUseOK(7beX>a!>e|Z;k=~-Mx&?f(6 zI_pqu&dH{&D;&URCS5NypiX)%9OG#aW}0_vZ%`RMHq05wt%2DX-Y}dmAIRsBbADo8 zeUKB8AMZD;@71+Q9+@inElr?sh!%N^{3U6KT_hD*Y1DcZ#FDhLm*kIUl@q{S%(r97XRqFvNUq1T(0N%jKLc*pE8;xucKZHk7T^*$3GD&A9;mcgqXaeED|`R z-ot;M@82DNVOwwgl)B(I!#wXS+1rAVCIt&4-r2J1Ur}TvHrYdGom&!@pLtItS5b2! zBvO$3XWng_m3WYlxbqw?l;v8tKSzsB-T9jt=$dyY2*jB|l~asMzhEGCk#h7!y|3vst}O>6o7J^JI8gsnOzKv z1-F?ecd0aPF{7MoOuwjfgllwvnuRi{)r1U@kFY|rl~TO=l;&q zIu)!6nztVw|G9&CCscW2z-ocuFCA3E1pfN%xw5VmSxXkx7eO1Tlrh!7<&nBnrslRa z&95WsB+@g5z_q@)60|)s{9UQE6?FtV7`Me#5q$>yBrB3jojXyB_&HDNY|rfAx$E%VcwM4(`(X83=fv!V zl3;5~1E5Z(mq%<`W~$BI8$hQP3`Obw=mj%(|4W>N#e#!hjAO(I&4#6rNwPfp+v*>9 z4eSgKBC(U6^mq!z`M4@n^T*jqPsE!X$-4vW@TQ$q5Jx3bMi*ot8`z3fw>8n%mu24g zK5TTJh4;^En*NaCejyPFP@jIYFI+W2_Vc ztJKgxg$=Vw|6u@qd+Dsp(8nV8MlnEPXTd~(vL7_#nMsuz1H2vO1ZjG4lDL~-yjp+- z_!!oH@X(uOAyf~YRQ7U0EG%kf-jWB@Y?agTa>&s4Rd5o5Rc?7(3c{d-$mc2+%uBhQtv5 zjzdS4^pv`n09-_jPv`(Z>FgLL&I}?cGSENbilG?9(mE%`eW!7UT)8M4mu!NeRegfj z@Pq;35j*Q?h9(AtTfvivaC8kvfR}3P=8U0lo=Ipc+Y@(qvbOX50ugzJ>wp%(XlpuC4?3sep8)cMW`cv;%+-M1P0d6vop z%3N4H*;Q0G(XSTd5TM=kkpG_bio)qOC(5oK4e#9yO8_b1bB1L$hHOUn!M_dB%9 z?y_3zo`-90vC#2(uYZ^Dim5-|iuubqsFy|VXgklWSMOzi|E>)MX7Or2l?zv3a8iiW z5Cs~dsTm_rFS??ow%mrQ(r43}jTEo*Eb6hEEO0bTV}TKN@mbQ7)(C&^E*P$LXMu-+CqiP*R%QjpVri|h4cP)z8qul zwh}M2T+jG@!eDdYz@NRv34}8Ced9}&kF2w|=LD~WO<|98yDzlq5G)f&`z6tZ6xV;u zXOrzyBOBXq)EcnhYdVxzJ}NwGRxIl{NIgN`H!WAQu4{H|UDct@G9>+nH~_}7)S`o5 z^l4Bz*W`OalcbyjooZAq*A1I^ zgD`)+(|tkWbXj9lo-6lL=fsu#ClF5elhW%dY#iaG2>wLe93`r~VdG5N$6Mp~tw}Y{ z@>9NMc)saRgQ$-mPcBvE=$@)CwC5QZRsMSM_oQ9^7xDo7^`Pf_55eQBhm~cFKNeK@ zZR8$3XJ$khON2g;+!LvZtL>)p_>x-$o6Vf`So`fdnUT_IT8l3*-j@O50z$7d$hihN|G#GWA{bJwV z@#Ot_;A>aegmdI$-NC`%A15c-rd6R`(OO22bAY`J#Eti4EZKK;COjRiF9SoEREBl! z_?T!|7LgZbb8oVIaeE^ZZ}Hm3hTl(ji-W1=TCA{Mj0(;_ zLP7NmuqjLqRcD}XVCG?%X)S;;KzXnUQozlOUq~6~6oKL4tP~ndtd@>}lwvhusbR?> ziMX6ZY@^=>SfNeC3&L2lW;gBi<)hhjHf(8GhR*BXTY7GP=pi2iYz(clV7zJT&PtA8 z?^e-|?p&Z!E^Gx#_6Xgligh3$em~!&svs1=8C*cbVStxC6v}9WDE#lP<)B=tg|iO~ z_#qrLxmD_Dr7oGO2Afb)lSZz}=Ww8JB{0q|fzcN`PFyrro}^bENFiPwB@2Pz#fkx9 zO`j|Y24MF#Vo3=R_BPy8#Lmf6eH9oP2wLyEi0sGp1C6o&0`@~i6OWZG6mWtgpU9~b z!>MT1#+0G@7h6oq19G0f`jpM;2+hp6D1aG0AyOAq#C_kLS8*;M5TD$g$Ok6=h61Gl z7d(dAv!-?OS952lJ{3AsYcT+OvsHd2Qv;R6Aar0a#(6Ra2DEhyt^A8I)K>u-76#cO`UaL~Tw%(lhDq#* z9$OxYWYbA6o}NEGKmS1*5mzaDDlA!JdADF&(#7)4af-0WBsb7ZN;fhw~}w>(7x}RSAUL6s>6G^kl#8 z#UC#rY_vD2CZB>nWFVifBVl))?YW}g4b{BZ9Cs^eyWXzcragNfx8Q9$+-?3nz_oj5 zTLGbpEO(>zIC@-+y zC@uC!helhh|AzBCaV@faA`lsP+m)!J<3y&hrELTL*`KZ>P^8}bRhQ`q?5V=*3wgT8 zs}92^7mzMsB|ai&V%L&dc!NWYC-x!wViz5N-a9bW3qEWEgfWIew3CKMo4*>eYQoXRF|Q5oQtC{3m$MQ&6z{kFhh6bWq#c`T(*{cAN&mYg;VwI|l- zBtUrxc47n6^ht_M)Lt&Ij9GcZ(?Zyv1$jjJy}S}>rP_mhY$WcDu_K@T=KwAPkvBEd z4{8RCEHZJN70Vr8@X0gOH00bSIxR-}7@oN5a($r%x(Fur{x+qDAE}T z{rP$eGgK@Q1*t{`{h4FQP4Td0H!?{<^{jIB2>3XUM4|-7CcSjJU9`~1VFH<@{gzWFC$2gax2Xv}5Ver;JIFed(vsh-jM_<8-$1N*{E0Vi zC_%n-H#K}BbDFGk=N4>w!b)+4`mzhzKCP&4AAmY6_LgfI^(2ACwY?jBPlWeW2a!i9 z#%=e;s>&(7XjOuSR?2Kwh=-8M)_0zX#NCE|5Z$?U)%y*rm!oEPwe2#0nqMrKf>)*D z#oBuF?_u5(*YbuJXtulUWN9@<3dx*fU;6O!*)#c+BcR3F@+$6$Rx6j+4Z;xgTTBi? zxs!${tHX3r9i8SQX}(vuV>0!Tt_FXkSdGcDE=gK5rKqGoulsk z8>K5hN%?k;%wAGSze3IZTR-}$ip#aJKGEl*UlM)vv>!9=g%QZ|r;v~78-W_q;HhF; z2c^T~#SNf0

R@{nJa6>p&!O_RZ2KloH1sb(n|v=T(CNpmHl62UG^wc_Qndb|iT* z36&jjs{h^K(1cpaPh4YMR^YP%zz$Z;A~b)K zKe|L4DK95`kLM|jn6lIG-8G*Ot)59_{@kIK0+IB5XiaNv09bc@k}yi!G{7F=czW?B zlPOq9g_S*vp+lAjor$~IiB)DNZa@`PXkVe37R|9(JRkN`5v`**(+RYm?ZL59`R4@^ zso|z$Q~C^vtVTWB`!6yXpDYx68in7&sEDBXq51DrN!<3lkKW|}*xawBB3+m(kHmWV z$xE-fh7u^EX>_}Ac4i|HvCFr6e?6W#IMWTMJ4%A(QIF#qmvBYf#L9o0$Xb4oGRl zXbRDR4PMP)G$|#9uW=kB-t8mQBJ(1wQO*;#yU|4P=wS0^ zk9VR8Zr7EGP?hI-lHu-%4t!xbO^H-(RT}4Lo3NP$>3R%3qXp#sJb#qIx#y(3nOvQ7aGN(};Cn1ri#kD5Br?ZWyD9URtE$s+0cFL!)K${N zdnRbg3iOJ5)9+Guy;Qs1@b?oZ5WcthFyea8S1kV{?}}3l`L`cmP51jz#X*l5LNDk{ zJXNWuSuTybN2PP(u4kk zmEJY->g2HpX+Le4CYu;xuBO5g?P$7){!0JiA90xg(B=OS7m6SK@UPPiXM$Gsd0hP? z8!A?nZz*>l8+u=r@{yPT&$9#*c1ou~>A;H3EIq=__r+FuvBU2pSGbY#4?p=(w5hZr zs5Wl;5KC2zm*`x|Ro&*ztCvMm07!}mSf2De$wMjDo(*I96W}RXnyM08MgdA%CQI@S zhNmiTmFeKCc32Z99U?V>ZGfT4NvW#gGINYLx2QO&3~Yp32UsZjDy8E)(l4!Si`A_bN#NVZz?W*;SOUhVz3q8TV!Bwba$@T?#9O+a z&%<<_Z=@@El^r-2Xf+u0pV=x4fx^nf^-(kuICfNwWGW|JYB zVlrhVuUOb`*b*f@PSF@~djkhLB-vWwWmK>|`;b5S`RPQ)sg)F%v+dJdR6lD&g<^*Z zA@Y@=LU_*iReICDL{B^EmIn!PI+{wlR`F~ zM`%zfc0U9XRQs}tnD$cub(VwTaff?$%Il~p^KUwQ&fRpu${^~n=*z_l6~wPpH>2^p z=|{`Y`%d1V>QE6&-23W{{#Voa)2NkFl>G4DID4(nG@6?9n(yRK;pdtioPlQlUAv2g z!i_2h$m5UX0aw z+K3=$8jO7c8z;+b0arfhH4Swt2mDf73J30$G6pif$sFCu!Zj!nX{2TeW`>J4%92J4 zGT2mz@^wmH-63adi~Zz*N(^L$N@5$ZQOAyXqJE);Ni)Q`Z8@QN(W6x|2M^i=5Gs5v zpicxIpcTA#2HP46npJ{B83gXf@UTmMr{iH(XM#5E+>NwtrtvQc`X3u6_vS9IiGms1h(mQj`QRdVp7p0bj!bH5xegAEsTZlDMUdY0>wbvMF%DdUGpYh z-yt6_jgZJ4p$r}-mSI1R|WdeJyQNhfCU;u_mdj~sQVnHI&tTeE$jeUY4C1}2 zm}-8xuvXrBKy|8=E^6|f9pi|M7t2^%eu|2L*AJf+T@hW6=+_|?3Ad)OTL?1|y2hzh zE~M_7>cM<8-n(tq_(s%2i%H5Fr&vEGYz7aT*zC0;Fr(1?@yt&aumEuEb%m~h!Nurh z@U1Dy-WdjGb0Rz`JZyY3%)}^h5c0!yH$ljk7KO4VX`cQRv9vjBUYHkGQa2w&~>slfg832jG4w3$E8z2XcT$`|Z~k+O5g4*HMJ?d5!alqfWl1gx}^Q>&ehL;Q$cp^`x!IqeYsSotpVQ}~Y zcQ_(;{qhzRRPjZFAGuJ%sifJl_EEib(U@Vv4TDV*EMk$i3bmezQs;2t$Y$>4K_6$g zvABk;x2u56R#lEIuSOLdH6?Z2N@Iqti8DebyA{vCNp^vxZ zKdzkFY^mR;N}|pOr5!Lt7Lph-v}DS&AcjR$w;Kh{%9C8jZB7Hra)|iyDyiSC3b{Le zAP7GCXXBIr=Q$#$xi9aVTb?=dUz05cv`0ke{j9G= zipF-Y3Zp@6P3e)Dt-pWL@lzPU+}h^7(C*;z1*FwfMR97=^xNDO z4tZBZC_^Y3I&bi3m9N)hh@PQK)+-1z+rU`*+W1FQ>Afm_uv&ppTFxTYxs&grp4O+p z$Jdc>Zw)vbw4;i%Kk#rHhG=pJv(q|hXhLZ9+P+;I`i-m_bb;@jXy6q`8$EyZ?5>Yb z_*~ZF-YZ%Ed5h6QJ{_1)Q{vzJ86a;UjIT|AU`bVaVXwsE!7Kn|`Srwb7*FH9bG92Q zB6zG7@W1qNN<0i$JS^!Wk=Lo9BuI z`vO*>Wg-8FOND}Fm9$ zX4~3Q@=C`U9;VnJBB&FJU{zIOkjTz{11IS{{^VZATfn$1St(%ZtaU7^lr>UrXOU8W zz{j4_LKTG-t&-s~lh%|8WNKNMcwL?DRI|8bh~(m3+Q48`O#@2sfpcl9zAN*;U#vO~k+OF8a6nRF6wuq1jkOiU^ zM|vzQp$jPcdWs0=h-JGUd`BsK3~;bTVS$I3NtuDo7XCnLVf zYI6BTzyG!;pE)bVN0RKsvTFvX7ab*C|f%5!GPK;w1j`EqLkW=y`=i3^Wvj&k8ZjZRh7Qz7A;ulm?OJ5g0YvWX^ z##3ht!kZtRX9)g!VUc9n^@qSX`a#$pOK&M{g*nJ$Exb(r~Db+hEZ? zG0*ELG$mnT_k|MPi4@!OVH28pFHPr^2RoJ4#3#1aB2|MOp^`Eq)&ER9 z!Os8-lhRuXO@e3wfEj~>OKM&8LLTIvs4;^WXRSZXRd{AxNBY83RwybyN&Z)u9I^~BZTE&9JDI(X z#g^-)wb6%ao#hd19^Mpr9xMM#x?HAFa@7dCeF=Mkr_sEHgj~iVs&d~T=H&Pz?RG-w zA`=GWY+moO5bVVr!X2L*ynShFOHjXpIBmRWpBf3M^k->qMy~o7WtEp^&=5>gHr)Rq z4ns|O(IGq8F#<>8%u?7XnV9=6%Eon&puFmXMk`;8m4NWxUmcQi5I$x!L&{IJFtwkW zGNw%nBLJeH5)Vs+vz2Ux%Q@wncb#X#^Cl${QcIWni!K8;c_{2mRSXMF5=c4CvG)o^S`W#)y!v2u5K}J$ZloTc~Sr2>3W)4U|{l!t0IZQ(*8doNV#6ldO ziH|d?Qf)*9yWF*#8o6NdPH)~VI^D)@K4?Qx`Z)dF2C4ZKOKUK+O=d~ly9u93zv_l) zHg4Pxf-9*@&Sl9gM;A<3k~cu0y5b;Fj)orl)d3>MAT_iX>kbN~7YJ~cQKv>9V*TlD zC6$(XVSS3=ha`@RYqHgsyR^Pd`!aCDfRRzNb28t?`znT#w&MPizHxWc*sq#*t+F4| z@Qm)~__Dc=a!z)AYFy$1f7a$F#QNp4Rk!Fwi58cv8dbx|QaRx^j3bs=mvIsMQb%P!kDXg^-HAH3NMw?aHB@ggC;;Fb3^zr`|VRv7xE$KQBue^A+W{c1lTE1AdOV&-m7G&xIChDk|0}}wj5c{Gduackg4%rMEF~3h`OWA{s*}PdRSABjnmnwT@xJVPN({}k>={Nq0l_tV+b*;I8 zrLq|Zn_aotK}&}3sgLnON1iP_on)Y4vVAOL$U*b{@s+Tz_jN3gC8e8bkIQ}9eJo(Ca$uIV;#8Y5c1CE6%{qPuX|FR z89@ydh?1SB&#pTh{TW|q{8KbC{C)22?NeO?zV@oGVRLnK1y>H|v?&&{ByXgx+bxvt z5fcCqpJ4?jW3RG1mGPcASf<#T|Alhk8l2tor-h@cp=DcaHqRsgk4c>t4rDmsBvqZ^ z%T6Xplv~fUjWVLmr`9T-i|K6CP;!o5ZC?7fS<0iXFRVs&GVpFq7BZbM0z)|4)alG3 zM&=MJuvR(ps*9)<$knW-OVoI(LNw!Bpe$yVlm7uI+Bt54hC!eWiVn+TV&*Wj^~wIi zq_Fy8s%yid98LYFVMF$_ltTNrHedOM)tKJ%8f;Tu#c=uA1w4Ebpsv|RML?m+w4AF; zl5LhI%(8s3tD9RV1D#sV8~zJY25ywtq1gK4m95fqPdPJ1&g3Vtkw2J>9f%9l$pj5FsbvN z$*DRiS==~0AL1)|x(;Sw739<;_-3gx3>tzxNl~`;X z!IM-?F;&{9?1~*Wqv`ni*>Wv>U!++FsW>vkVyfbllpAZBjQ*XK*+6BM+J?uH6z(fy zzS-80Oi=7k*ituM>S=$ncgXrjG=?J&MVd##ywNJMhO7n}Dxq}u zoG~U>JZTDh*wWsOGnp+4JR;$3d{uvv-yRc1V4m6Opj*S9L26hSCC& ziPX4QMJ0$ob6r2epHlbaRh*u*i3_U<+>`YT%MxhVT)cFp&dCqePSR5O+4-tdvRZrV zUFf%d+S`JDo!{*}560Wyc5RJT9#wPzW15}@)k(p1RQ`Q14Y`&qNz6m(STerj`)aqFO-(nNuh(lPKX$9YkAb`1QXJ^CbRo|wl%dYN zFL>|t(QP7H)neS1oH=O0gtjyZ_OnSW!)nlRt`bfb>qSPWl zg(Cg2Igm=(NGWB~1gm(CQ9kv9ih20Ay18t~jC5 zhpN%$qjSw%R#-oEV&NCL*ai_iTPc%LD%#Ec6Ha4QCiAX^9ueM>`Odg8`}zx!oNqf8 zT5}!v?eRyPT<^!4ebSyT4AD$#yfykR+_UMqMq8~wIztvkZr!~Mut&qRuzB^5xDo)y z&lfrlzGLeFm}47~G)A-VS=DL>ZeL)=u?UJd>Ck&iJXo+J_qWIxJcY5YQjej4IiDZ9TyHvXmRb#Bkw`wb=M+TALF@skgnnQwl3^7?iVC2573TU58&WpD!Q&uTj5gmXOqbWaT;u*#03Pg*+`W$RFg3{nsliNpLsF0c z6Uh}musl|F-or`l9d3>D0d!9!0U9%5=I@>2^Nd?hh z$a4jm$K^ouI2!_a3C8re$H?J)Mc>oQvbeoV5bLLRC27BWCmkAFKj?1O-wU4q>^k*& zSa1E`LiT@p{XJj|N7v{Kig_i{%tF{XN>we5^+e#}D$r)UlqWSyT@ZGh+IaOsL%P!@ zH>ktrdo)uI8PGho3%*mLPN*%v1|$&qhz^q5RIF0{JK){V8`&XnW%yT7-yU=Xr{XHn z()UdIMq{>EpvT&H6CjjK-dI~DiPUM1Ls#w3y%&!-t}Klxg#FJv4pUWN-obEeJ%nw{ z31#DwUJmM1pQ!k3P@TBn?>nD6Ne0}hqvLXbVuJERooM=hCqjoV-Xu+TrVi5x?E zU33s*TF~PJnrlRQD4i8#JSY7j85RkI>x-GYJpsxwYQT5VfJ@6}HueNG=8{c1p-y@! zh5p;7KPkhOBc)b6Cv*poO>4d)D8=9BJx(i%-{&LZShG6&`Mi4a+(;Qn^Cj9o+~{JQ z?&SL;;lRu%=gc^ov-odAx?=x~)~FPP7N`GCi9|mWImWYh!j^(`eMtg05mS3d&_8xw z+zE#(D5$mmiLPi!cHo!~NhdVV@hMpCG}4qTDM@p^tTmLlm}imZ){mM~vH#{;O&(i* z_dYXF{8QT`KQf)?UQl1D6RXT zdPTy1&y*aQs1h_@EsqpLc>}m|OWNhg7OP34SM!Q0b%(q?zy8kr*7aLmxXEm<8W%h8 z|Af;2?f)JC%SpN$f1sEHd&f)~N+OOid&{Pr!gk7Ktl-1nv^s!3@i7w@+pTw6U^4q> zW~FYw=rTL*1GXYv0j`@kFaSP$Fk2XBlg)e9D*$d*Hb$K$-2@xv{7XUeIMZ2=6*?~u zYpxqpA7mj_QQksg@6iT-_~x(wx|gM8$lw1Grz4={V2J9;I#%hip8|{ZQ;D_3rZj*`14w3MgFGF#tIiN|G+$jZd) zkeh^POf9g+n$NmP3`oG^i}IhxnK^Ufqzgr0-=A6v_-+u#Vb@l~FK&j8adW|T_kiwC zRg1r-zVC2xb2!+W^5^#RTE-bS{CNH_O^6J9OpERLzs2c)^ST*|DNf|pF`y{_@A1$y zZ&P1?(3c<^JsvKi2U7l(Lot#nhZnG>dABh*`I3cYhjkA4CRmD@oB-QnJve9H>Z^&N z39D<9DoL7ew%l&Yi}+UM7Q~rhigoruoL++Jfb?lt9kku~0?A%l%6XmO_<_*vGinPj z;UCC@jsFstDWLO@xImlLE=wPyL}L_js9xtg+4jwG<{tvuuev*c?F(059RMU3iuwQ| zorP!7!e|FP{hkcC94@y4!J1}*BN;duAlG|LtH_yk-;F3`?$5n&_AfI5F(U*RWNElS ziuTCbp^A1THTYds=B&swmNntuqI1WsmPryup1gC`6}3xG%PMtVu!aWfJHm|6UDLVq zC-;$E$o=lXhi4wux!M??D*Vq^p-&MXoDjG?jmiBu*zZv}%7@oMI&9=R$1-cH2$i=6 z&Qg&o;a}$uC+1)Ff5YIl`9Ys}yoVunR=oeW@wkq2kty^0zNbDCB?14 z`x{RI14zRs`fs|m;^{(L$ZOy4l^q-RJ_*mK-fbH1b>(QC^~?a!@Ofk$XW|9$2rr0w zpHP|09}`ljGN1GBtbJJwSB>dtsYnADn+WM-0RtMPa{FVsIH}U0WzUhq? z>*;);Z_`-4N_Xz@>*P=(|NfT4Cb_(uv__l zrhUqWT+A~V_wZ}vD zcnJg6^Z;T2t(EVtf_2=qLNP|loz&sxP&QsR|KEt)70`1s8GGk3%$X=-WRe6f(1jhU zc(i0!d)-*Nis9Hp1TW2wTHA04Y`BhM-|FOklQ_Tg=plR>(GGO$>I*vNDs=h^fVTQ# zv_fM%u;A<}aV$TcNjTHADp*$2i#u=tO+iR;pOa?qK74sV%wi!sJs@ZZ?Mq?%9AC|V zB}ryDkX6M#>^#F{K)FO{?A1A2Bhxuu%af!wEHu^JW>8-~lx>m(N>SddnGY?11Zsx|*TD*=b7Wt1mq`o74X)#5VVeX8w5x`*Dv+10046{)`;%x>PgACYuK;Ab2hP+;1|u~q!IqX! zeM{+k$2aFH->CWv0_nJZZh5i`cU!>0W_ut&@sJeQd10r!KzH)C2(U(qF_X1JX^4#DB&;4xp2()Cmm60FNA7KJ zf}@k&)@UptXmXF53-F3Q;fHb98|?|eWNg*fmu$PZmA5}u>AV|Y6iyE19Ice_$ zl0BG(ydgh1IeNC{-!=IqJIc(=_1PI1YI5&>NPuKT-c1PbO~^eq&GCL&FD3e3>bnOj z-%~~7GsYdFm!gNxbRo`XCanET^r{>pi$0FarfX;R+DLg0lff(S9P}IEVQRGN$f4tJ%%27yrifO%!j&) z`BUxayd12f%ypS>v$_&3FOW5|?b3VD_AL09EhOPLiyp-G3c~Sih)l^8$7<)80VwbF zhv2VZ5u6`_@AW3Dt!pX%4 zJVh=tfDyWC=)=OY&0Mcd=#*J6qU>YnSKvXKZ=6a0eLY3|In)B#L4oCGYz!-|qEOm> z4Y%iEz_{NfuWqjTem8zcBh$4?s$hnMtr<>^AaLjW{F zygQlkWE2vgUn580uo;D+ko5|5K9NwOyxSwpiNa322BM+HI|@BNl$?;mHu#{M*s%X$ zRF(MQrG%Ea!9rOR`WoK;x1!iQ-h`Pq{-*^C*JnM|hD2FMzTKrEJ3ck&8qp+Qe&GMJ zK=#+uaSQ2w9k_Y`AnowfhpQEE>Nj?3rQI9Bl34Yj&Uw-SL?(t^#>+2Pjd#3TuW_-> zNxqNwMryYG{N-=N!B~IVI8)2Pg8~^!NTPFrO07MI2aKXx7|}XH$||6`WIoKRP9RD8 zMuH(H(@@vQmV4^Nx|&Ad#+OB~h0C8=#_R%Pt?jo zwV3$JpMtmzSEI2Q#*qxzDvRzW^Z14KZZ#3U#z$UDZFu=|)+F}bSaogtB?=0ZS}`>1 zPI0g+YNBw%hv(-x4|~Kim;$Dp&U|f&^k7rnL32abi6GOJSEpYAjEqrt@Cly$(GIIc zW@kwnQFNJ|tu5z;j=Vazn`tK3Yaiq!RSb3mBC@AyU+!5I+tnF_Xl*j8CxAyQaKebs^88OahPaAoGk$3qL5??{^Gcp zN8qC7LuIgGN_r>M5+~L2EoZ8-VOlx|FKrXo(Gl(AbnB7&2DF{S&_UMR19{Qrd3w(U za7{*9ahL;zFD6cxLy3f{8PU;w=cR`6g50`E>u$)`yQt%WXwmSBzn;&(^RG7wDmes; zd~g65`o#5NZA!Yo6e8u!s$)$B3$cp)+<=>@!-G39HFRIOa@?lFG-!CcXnDbzCUbPr zYkg)cuQYN?o-G=d7oV~8=NDH202NFDc9Tujuu&j^v*ROGbz;bc z03j>N0tH-^se_9JSx@Yc*Xzu%IH--26C%C#DLpTh2NIDPQK3U%Hll~jN`AavitRX< zj6$-CLsV^?vGSP6n%xgx~qiU(tH;1p=;^lq?WSm3p3vB=~K>99vjV7X8>sL9i$PmG8~LW zA0xxNrPj5IMoUC`wm8Xyo@%8W6%a}11I}MAyZKZfhZF+l`6B0|C(ccQZ3ZH06Ai!< zxi|tyPQYAK&;cZxQWU!TccS)-%YtjJ8VvmA;kQoW>w*TkleY~Ie`l!vdh|zf8e`=R zt@8j1(6}Bho*v_|*UAfK5!O}t5JjNiZ#I8{@t`WjGF24cZ>JrHri(u6)xt)M$ANhA zPQF~d1##43;cvv5u+BOet(e;H90c2&KoZ+C5X7nYH4#@!CD`)rkjC-6G_H=tiK=oO zcKw`aizd|R%xOE(^#0Mpn%!Juu}{PCOAf4MmY=|peHDW}O%#}%a8P&}g^byW3Nt>1 z##@+-f;Wl9K|UPXX&W!!_)w?6OqA__w@Tb61%Gj;Dg-g;zs6h$#w0Y6@1wb`J~^;qw6Vv1dN39z@zKw;}6h zsLY6-=mjoMGc2AICs=-kz{7|1hV7vipE$N%inCdCW+WTjtq#h+*zM zY6zR8x&+>Qlr9OLWOT;uT2CF`qx2l_kWETw!FNYcwOep0*Yki?ME{;;e=hYqt|eXt z?Vw~N<36A)Sq{p?0_fW^88@&9pvZm1h*DPCxQG1EvTu=}EizO*ad3wI4${LG%%~kM zq`XnjH+v{@6Ux@ak5R`cwe3BYgLJ&VR5ZYP?p@uFdUCz`pa9Z;#alcMA=gEEN#*!jW?wOEk zyk}jkrewu%*v<{|Gd9%vZEYnCFw3ly#GJW@%~-ItBqR}>rE;a5de9r)6g7X#(N zk;tYN6W)`)m^-9MnlBq-GdzD7m)2?8WwHBqzV$;5^d*8vY*jrRbPa=G*iHM)0D${w zN(Kl`{nDWie7~23RUHb(7oCS^Zx$9WA?=HG4u--T=}SWJ7Bd1 z0OaVEU?G+s`NLzB6k!3*Z%OF-O8FCCT-1hZ!_I0}%t|7F|bQH$^ zopAccqs_kiTC8;mKr+r7lNJ&{sS&ITi${{B*v@6-*H?JWs-2&0KPoA&{Hu+_6l2wK zGMqCv8?07$l7LLS%u#`DbND5s?u#UR;Dc(Te5-F;h}7*&LC@Lxx)?-5qf=QA_xWI{ z^(^4z(84cS`NdVuW8G7}_uiM+JcuQxIFCx6kt>=}uOB-ApxF?x^sZAF_fw0NA!@Kz zgg3zYSjo3le^zTn=L{JXSXjgm_D~kb14UiO6y9{7oiCgyB%?oTT2QaYL`x@$#XX|m z8f>dtz+ruC&V%*-;wt(u|JF%kax{{sDJLkbRib+p3}Er|w1+kv;w9j7pJ9>beLIdR z%#OiBLlWR4I6zL6TxJ|rLTvzg5~xxJTsbMm!u`kiNeRy@IXU#ac6}@mn_;gYhF2oizy#1H}nrfKyXd9a8VGwxE2+*vK_GJy8lt zM&wY!He%pd-DZ|w?IZY=$8A6JkF#%Xn*Vsl|6X^v%1#q3X%0rbnTJaIeV>K4!a4j4 zB7hb>U`UM+ZN>HrPUpf1a(>uv#EBrhs^OfetwL_Fy)k4$EkmW&8q+VBXulg#j#JwY zSW6q6KcUiC?Cn~&Gsb%6UR9F1YcO(`OeYN`?p%No-$PzjQEx7nvdR8bXKwr5-ORSE zb3ezni5%Ou6a&$VHU|Lcj}VYIBy5nRS01vDAUUSuk7|0Ipg4A1i7C*CAEC!T%oYp(L3mroCCvJC6{SMom3@^~fiJ>E0d3gx0 z3UtWEGk0WIVJIEwxo*nZo?*vKv6oEg&IzZ>LF`=yY!q0EI!H5;_Ooyz#b$N#dfM2EHq7b3YX#0a!Y|A7B2gjKQ07VZ4@6P zYOkOZ`2>_eM@m`W)?7TQ7nzFa_oKF7BVBm9jxVV2oL@qSY)=FVViaYzDv z%6){5^GG4u4@3~BsP?9II+Y_G8R_oA5=Q_i#UNpH(aW}hVEZnwDNAIestB3Ixal>A z>uU7r2YdKKUz#6lfnwI_cNsJljaS##5S7;h5D~vUr{e+g@@lCo78ZQKjMh|xC|uqt zuEWAvmBQa*07fg6*}+dQ>LECqJV>(@e>XuijMBBJ-&UZt^P*Ba5BF=dU*WQIXEct` z$Hsx~Q+V*+6GAch3vs!Utf)|o7p+P%hT`5IrutiA|xilwUrNXXMTYDPdlipVqAHPzeZH5b`gQ{p+a6lwD3@yLLj6?Mk87xf zv$cAg7@{HETo&wLl^BOr2=m+BRhr!C&AQvb)0?15fgD(WZn%)D6QW%Kdkc-2Q+@7Fd4gnJ{mAKhenx4NcySGMc zq4jA>wnAyh%*__ELI3v0xuo0?&fMCtnM+3Rantkz)#z|)i77`ZVvMKYaXhPj$npf< zCC3bhctcj~hv!Y~Rd(OHz8`*Fhr=gt?l*^o5!nlgCL+4IkkHT>2aUSK*s#96$qJ#O z(BFhSKr1^wQR};b1@8NLn%P$ssRUEYq zA%I>Vz+z$1`!=NMAkO<0G%iD1S(YW(4g;-TJDR!Utxb#D!&sS_2_bW6PI4(1DTZ1_rA68fod^ zA6Ia=COyK4{+k}R45slbs}unGz=#nCs&KS<`N1g(38W4K$oD@ zz^16t4%+Q_Jz)}j_4XE#Vdv}mKhRjG?2@jW000@y(;@g+O@YuZ*ZCL?y_6J@# zA|5qYpOfn$HuYs%5?=)E?*>lp@~B?NPx9QHZoj zOxUSK-NHtrd1Qu!6BL_MY51uO)F$aSqFZ_@k2&(5JjI;HflSI1*>5u-RYxF9^+C~^ zV|Rb*D2E%``@;CWnvy~jgbOUNk$ryW60h8w&J-;0W)j!PGG2I&@70N8cvbPJI2@Y= z>ONo?x>r1+m#b5NHSF(|uX!(Up~Cg5s0LSwtXj3D9r>&c#?9@!&a~H^=lk=P78oJg zVmc@g<`+nIq9fAWA~MQKVR31)7q79!BHAz0o@=yLksPQE?9q#372K!PamZDUtF_`H ztOZrhi}r2fB<7$dq?3HDc~@(4$MXH|PXqlx`d_#`Ss(;ftXpt%f)R)nU0hjVzF7g$VwJ}?qgiX zk)cLGIpP7$0Pc|?Cg2iR%g2a618=6GfE6z3_&1p2LnBc*y^7=&EXZaEu>@qmXDr?v zJy)i%r3_(K6DBY~J3z)#Ldj&u0hZ=`0^aLIyTeQ{@bvzpq%W%YCO{K~ejMuP-owRs zvS2s4ZQ(6q)F#kZ7{D@Qv?JmDk$2xoc#|@MiT~XQ-#ZZuh;lAtBO-`aMzFp$v#DtEI!*k!E0j06A`GxvqvL%8a-gxeqW4MxhV z5YBWAA3x8#RF;=CUu@ML(ZzkdU?WA7rRu2N!D9oq!1y8!9%6MbR zqR-~y4VZ@V^%?g@$3=OCdxz^z1@3k?{PrOtnu}^qIki@$5J39dMm<%rafn}2wa!L) z!2HTPdR9_;0TB&%WrJd|L%YSmM#PqHG}ZN-@mk<#Dnco5Xk(36%EU*n4X0&i@y|bS zpy{YJB5riwGVl4Id|3VB_YR*}HM>Y5!iI{-P+cA7(%2W<1oL4*v;_(M`Cn%J7tXTO zhw1jZ@W}bEsGAg7IP6xHs3d-$4yLr)nck!u{5diI zSl50b4r`fu%1OdsO}Dga&6*ezI|CI#)EorlQY*akwR!(UkR3f(j&mXam?_`ox>vfm z2^~6Ya{%$iLn#PnU-;;Ra_mPU7bXc)(%5+-71zqqRqoNuV7oIK7HAShZUJ-*Ad=)& z0rtofJe+JUde^eIH?NjmQ(^QHObP%HgONb&AruA@oZ7Pu#v#FfmAh>pHtxhUW~^Z( zJ+8P^=C}XO)~vKFr7@EpIsB~L*-G-mm|(Jq>mPx6UOqJ zu&D_4nkFBU#qZj!iXGotl-44ML)f@QItO+thlg7Hcx6Bgd`3*ASK7uUyl+yIGWT!;vUbV-*U*h@`IsbqszY;f1 zrSX$EJ)5dEdtpc%;35Ir#T1Z65SRF;#HslA+cpXVNH{*`Av(;_@m}zjB94e;ARU8c z=B_mF*LEn?t`leX-gvB!s|3OGf#T!HS)4G?`;g?>Ois#NLW_&Ik+gx*@B{&SstVbO zf}Y#XL;(#+R`t`X*W}9t&Be#ud_L(&*|V6 z>UCEljT^&O;TDp|+0=@j+djrIZ{Q_~*`);a3exH_E;mS9F{5j-#gc}DLyJ;K9Lf(4 zE-tI3M`}uRetOmHDsR<$EZ20LwPcx$ot8Vyl!j!IA6`cDdvfuOuuo_=EmTRk=C0*{ z3_S=#2#dd{W|QSlh|W(iYsIAKU^#f6Aht3?l->U5$FE+Mfko5FIM-AIIriAvNF}z? zUI@00DIk%!>z)7M&w5ojeCNR|M{NQCSXNGa%1b7pBG6bg1Y67s6Y;+)igkh1&Wkh4 z@Q^ZbhMafXX1;9lM0Z4UwEcE(!qu%*`c0YOQVmYvd*`i0Ol51`>|pL0l7uWKL|>S# z9LSEu=DyaQ^maQayCTM;2gTY2;tG4Afcz|Z1llDru8vA^=0n%xtMSQ4F$tvO=-L&h zoPOnHUBn(Wn0PA&1&?LBNlBeme-;+SZ<@iyWf^R898_KdB?X+Z+`=#K_*X}v>*CHP z(8`^v%QW0OD=%&mpI<$fB$ETeR!B8%G>Hh=J)o9fdbWXI zGMg@D8vwcUZL4|71?j%Bj1?F%%lsVKLNGSf-~r?DTAuuiv)mZNq+ysi{@@FxRiykX zdbW?q7t0T)`ZAc4wD@1-6JD-a6rHY{huDU6FHV~O0AyFps8_gnti-lFrP@i zEsD~or)Z&!{k?4mD!)Umf2d@A?`!Y6}8g}YiQZedIx%lMPNop z5;)U3$8Zy!ebKRJMWt1iyd%p1h|EG{JkzERzgqVzp_&{i5BB0r5*Re3yTWQBS)BU; zSx0Y-B4~@eM6|{I3+v6Bu#bGh>FYs`>MVuOCg0%Bk9(KPzpT9dH}(AY{==`ty{1t= zH0oDVdJavn7gre>u||~RI0Wbu%3ENYf19}fQV6WUPjU;O^z%$MeC%JKp|5BHMdkWK z8L^0`qGQV2pV#ys9jNX;!BkBV8qa|>&6JgS|mHp-gk<*IoQ0M)dq+31S%Yiqh;Z`#L zrO_Y#+b_i7P*bWqQI2WIT65&v^QnwP*owe*IRuCk?4U3>Q!ACz7R1aE@xHE#ZSy3h1QP>WOr6ucuqhVcG)EvhO+oK7*dT>XttW_ zwFFDbRE($r0Hvi)LG}d&Uu?|n8^K;V_FU`O)-yA$5Wu35Oo2C3{pbyFM`ZCY6JZ93XA~Z7P0EJ!YS><%kO5|Q~HM~ zf0v5?j)8t94njE|VAQWHKfqz;M4^IVVa-*0ipl;B$JV=>h28t`znQ}bNE^l4u@`=%|yN1=%xN_fu(<`5_NT1 zwTOb&T<+sbZ5-@qEmft4ZX^12#r}hfO9%kGet%v?0Yt|qqyQX`4$6{K0aHqHhFE3A z+-hM`DMtRp`#hTKkL#O5i@41UrYHz^{IIwq93n|_6b*yx5#7RkcR|R#*b#h?KBeJa zfEahPz2D+-?&ux;lEkMuJeDm`KdiSsT{p20V(HhL?H0uFo@Y4g^!x+*{W}KzmAFBQ zi2x&iWtnZtU?+T)`|j2(iMIRndkLj2FowU+#{F5XF0_>+6n)+T0MbN(u;L;`XvjGi zCV2|`xS7Qa!5PW5AXsq~Bv?Py-Nb(q@MEz}8P6s(4)?R8>m32qbf4FEy|Nm4r+a}| zQ4t!U($`j$_576{n1?q=P8l2>eF@LGtATcEFOI4Dj!YpyqE%V|p!Yv%>jK}QpSm;3xJje)wnHy{-CrmJo}R;<*0qqg)t&KWXxNm8txg16g4W*2Cm`q zy^?e_yJG9ZA9`i}tOkGhi@y+u`-np2P|{dc0+~|EiAx2I-HI z^7sFRI6Mi$F(=KOPCg_RZYNwZlxr2H1k3V`9*phJ`ORy;+cS>XG%Q^L$X-b~@$9NJ zWIrkf(j{b1O!h!;gnKB^y)p^-nN%mq{HVWt>}wqKk8icjTx15217EsRnYUD_XM5y0 zKC;rVN^^HCqYcRd+*KN9g4b-R*=a@y6&O;$Arz@MT!@Di~vG(bPq!G_2QdlD)=$q|FyE#Q}lzneb) zni2m(9KJu{@Bjt0o*ha2+6h+_*`0?WCUGakDbiXyeIxmw{=w#4%C`tYKs`y!h97j* zKrhasFkWLj$eoW_FmmC9u47_l_}-AQcI_zgR2Cur7hi8qKA74LT}5Sd+vQg4Z4LM_ z4Qq^b0reCsTgbDBhV#Lem(Z%;8XA}P55^X1VWet5DS{Y196f61Lf_YJ>j+5|=^G z&p@7It|PiFu|l>q*z-%z{Qn5luaK@qw?v?=yE1|5+kT1bz#o!~tkYWs1jU~atQDc2 zVFHM1Y6Ix@tml7({m+H}y#l`xhdf+_X!w!~6`vPoWC8brs6qgMo+7j)8DK{F-{16i z4zbY)qQ`|`gu23Ui(bh5J&C#fNm(W%2=OWY7y4ZOp43_^jcdT<4Re+@toh+$}i sV7dbULT3;!LTh>eVCh9Pi2X;W|0wW(sK9@S`_xJv;bKdJZ*ZbdD-TQXmYhIuAnb+q|+rdE}Ai+N=RMk$1@TeJP z9f{yV__%pock(1;AXQ2Ue_*=(w{jgqo6z##iO>=O-|SdKUFr4k|0O*^{q0H+)-Z8$ zcNEt4a6sR5x^8qd09qX_E-EG^Dkdt0J~N*l`tOUM&?7zksb0OPt)i+Y51V+p+S)ta zv_la8?U7&kq7ed+!8&4B(C@JQv4#N90btF`PZMvi&Yz#~^o(Ch!ezqKJJE+J2@l_~ z-iQ=y|JMyIY0Crv5x|}ykIq|AckY#OU_Bk}kt5@DRk{#O`bc+HhWyResT-~ZuL@jT zd-?gus7;9>H~{7{PZ*;f;dVWOC!7`D9&mVc@)TxxPzV&|1XGB2qC>8TFFlLDD!Wva z7cIMd=2gEkrO>O78dt=Ijc$}Tkyr$H_R1_~{Bt8eS_c}=MVW-nmQIhH4901KB1)SfV^zhvxw$?;);S9@JhmqBVkLRH^D%Md1S3u7O)Eb4LAVB1Qo$epu3tR|KrhSq#mP{hn<_IiU*e&Z*vWrxIM}ie1 zo_;~6^`~uokfBNYnp4b}KG^!uApLZGaZ38p4&Ll#`waJz|9$GaoYej_&t7$^wEVwM ze)Q?2WyK$19@}CDO*@+ntmpJGjkI{&1hzHpPg^LeXM|4=6Vgvt*Bkup?;o@%w#?{l zm6?Mr9)3!9sVBF9Pk(GPetsY)jlH>3px?qm`op2&Fs1;(y(aQ28$wKZ|=L@cv9yk9fBr;a2*#S9aya zTe^!>Vi1c3r63kZRWD?Dmdjjr$*&$UJDZ=Nr@^29m!jaNqHSZ9NZ5{uBs|6AJ%1sj zivQfWHQv5soCE)H_5I?|rRRg!fVhypguJ1Fp|Q^`(`4_7+AxbT@0rniGow*fEaCqZ zvHndt01{2;5ltpsj}+_32)U|E{&$1_MLD+_JDzZKJ>k`?@t)xEp z=KJ!MhX3vLZ^}{g;Dr~Y990kA|DYV47{^6OO_hRL8-Ld*KL7#hrONW38vp<j@be$p5b?29^#>Y7I(4z$OB~2EdnR1w;Nc^w(o$9x6GKskd>wGnZY; z$TN?85PR~H`VSuc9y+4xlz#Ov#-VvLXHHLp$5Carmz9KS+Vyz87Lh`>M+Tm<0h$g3 zhZc%M69p-ckkki(79-*V13?17gd32=Fvw#VRR6yIpWWd=lDb6j`llN>(0~DAK=Pll z;3zl=Rg5H*B>(5>zZpwc3ZeZUV__tEHSy zK>NXhELiz6phwm^rsTh$92Nj9f)ro@!+XrX=ahFD zYJJjiwx&?OxEyDP09ZTIEK&gC?EJX?`)>Zf=l+)g5!f>TJjgX+cIW6uM&B^S#0gSb zn*uGAFFS@2L8y!*%VA<<%6H1`ye+6XsPe=PDnSoV zNW#ZsS&M!J1Kh9HfOW2Xi{^8(zQbkbM9+%u1${#5e* zwqW;$iY}v;zM)0(XOpDGhq-6c3Q8J;;Xr*yA_^*Zj%okSmegW|To`g=3zoEnhlCzV zO3Eo=%|S^mSaXy(*D zmQzx)+)#eD8$bnWJkidSWR~z&2^IHQ90H(mWU^gFm1M`Y>ec`wd*ulb0dXPHMnf#0 z>IS_s#Z#Lr%9nX;_4EYz^C^@C_!9M$F6Tef6W0*RPtqgiNsQAdMnBWj<0l4KPHFfv zAqxvHB?9YE+q;o)y+>w|S6M@BA;XiNC!ZCnH^q!M2s%zeoEX%TuWEFqz`WD>wy<7C zyq+w~qk#&C7p(FuK~MQxh9}fNGGP@2!2E^wqnlSn=?#v+%>;0>gzd^Y4Z*D*SKya* z8tSdianJtdq{;RD1AV`&e_-rk0e6D{D86pO9u=3AP{6lA2&gcEzFShV@}`CW|50z7 z2?Fp}8gLNq-gazt1o16M34pdc00J*;yhG!2U*e#kLlWd=s2CYP)VWA_p3x~^<`0Yg zf1*DE3)^7n{;^QbMcVxHberNot(O03zx@CCG-l>fR&4}Wd&5u|)6gi1Qr=9aXc89o zN_s#>4tHHCLhKuFLY#&MlX9fY8NS3Mvqxph5n^Qd&xXuyiZS=ekUo8uVD^Z=W*%-3 z%!5lYGpFRqPcVBdRKuEnlLzja3(UJAp-~O<;8I)!HR@sB%Xh3UQL1OsuMtXJ%B1+e zdTPELHoH+;eJU?9j*wScJ#r#JPrRK`A3mjpinedF-Y6AYG>fNyv%{q?1S`8hTsUbP zRord{5r^C^GD>JT!LyebVC1C%hL2V0G@Bu_O&&Q57xrjl>Y)t@QLmkVVFbL=d&cSs z(F`3*u*9B`9Tg}+^%CwG+l_w}JPnQ0dk3gB>j`9ptOoFQn!8pZ!E$WKVnJ8DaI zq#{F8l%T27L)=Z!gYClL7=LwV2oMT5#!-O=G+7yy$^RB4#KC&`{}jN1VE_LVz=2>l ze_Ox@f(o8Us7rV_x)&3k;OpP}--3KN5X}6WMHmRa{?p&lKnZ#Re_tW{MG?5)Ndcj@ zs}kjMNHs?BE0`mig%%ne>C0CmX3rx%-m9yZUA)A;kn?Ozos_5AMAHtf^j=*fGnkB@ zq&O^6AU`EONx3^kkLvnaF|SB5HJPsl${nnbWd{R*IwsCQ#)!Fpp9)B0F2^DP1tk^d zTU883m?saH<935kad6^9ZtCZ6Yde7a7#k12n2ge~ zqv8u-2Y}0Z*oX+n1!-A11&p%FrOO&uuIfPchB%Uh7=R!n`)hC#-pR=R`aiG|N9_T@ z|3MIo`sot4xe-G6G;?!1{2lx`yb%5*UKlThm%*RMi{KU2FKd~APj>s;rB)i?_&4#x zyCWieSZZK>%KC3d@P3F#foS|$Ge9ySPXvAL?%s4+dn)75wZ1Qj_f*uM>F*ca+wrVCZoHt;==0-KwYKr| z#1d%Cx8LS49*Apb)Q!u>12bU%8|SAHUbDC6x~LN2vr>ZeHChM-m={ z?N{;m(F%OfDjT*ZBbBXUWw&{?aoY9fty|+|ErWd<8G~h^SAe*u{dCjz^hC|AzKV*9 zzP<@&C8JEwt5d^0)7gafR(Skguc!nnAdrxdxT1=R^DnBatG(;14NZ-<{`?^a{Zmt8 zhD;qb@)8m#s({_yZE~=`S(R;Pe@a54rej5D(Zl8WWzSnox6WiMK9{`sCKl|_iZ&*{ zR5l)Np*Snv&m6$@vg!xPOJP0Q2p!(oa0~hkwUq76z0yZ4fKPfh^6N7`vIGidgEHA% zGNZG0H4)Z^&&v$v$7(pApDi=9|5@0Wo$VRe?0vU!dwQ=*u@9z}KzaPm79NiPk@kT+ra9E7p1? zntdTyk}6r6y*nrFz%-d*^I5e*c6Q(SGU>7bxf<+qmr|E{^a2|$@#0EB-YOdhrK82l6{&5Z+amdcbCQ~6NOu+nOB@&av{U~acBT^?WbM3j|1ReWLIZ~w5OeL`?2Iwy)7Eu z__h?+1=1eRZ+qRPX_U>|qrfs!BEU05KJ+5`m;PFN>kM{~0QZz6LyML}i99%zdNP$v zqg%-lbzdJUfWYx(X!;MRdae=wQrHnvee@QIxhpy|`^>mm4iJ9;xWmT)SKj?)-f$?; z`@_JpBsCLLnK5~DRheZpKj%|`HP+1&X%4(v_>*o>B8kcRBI}YAb<=6H<;SNll_?Ig zr{D6$8!q0e{>pQc(&F=@y6-4FraOqG@85ThE4n`(f5MI1^Qt6+#em7ILjjHUN1b`T z1RZ)+-5xFzkn?ysZJ~t>i2|LDT)4Y(lwj_&@Q|wUsX{A>K4O**v&IO4cBj&{Fo|3R| zJQwrl`$Dh|bd7!z7AFGFh=KDr;QPyM@&o{+e0#mycp+k(3XqkSb)u z5g+#63``6WnQ7Y!%Uiquksc~ zR$nA6y0YSoj&46T#D5xkrl~*xgcW8qg_v>{kj(y}h8|!x@B+^2#myErYcmKbgW6Sf z+QSQb^}u(u1L|Qqv`BznC9v$kBB=&HP}1Q)b5N~MoAy!rbxKs_81l)e_YA)rlfUiH z9SZPnV8cHLD*n>I(Q-zG6!hQl+n*rD-avv$>|O-7wz7;VV)nATKd?cCxKo7sU?EIl z*Rh&2`Cczl*TxG%8_VopyGh^FMSz6&k}c$+)51Xa8c#)Ic4{k%E{7LZwgvO)iU6~( z2|Q|lnCt;?N@`Ht^YR*$U0^Mq=3r-1y$vBg$4)c%v1!QhVesA;V=1?R!PIfT{a1tT zjAF`8SKc``r;psblfIR%zCW4WHOf>G_yOZnE`BL)^VQ~B=ZUcgF$h5tX*sx%5;F&v zGo1v(1P=YpEQW=MGypz9yNi`n^zB$y{bnvZ1y(ph-DJFZZ_m*knez@7TNVkGN~2E1 zY%M->ZzPEwPexURNA=!+f8!wQu-QrcZU8ZMzJBTRF<^=UvFzZ>q7X!~Z!hiL@UE!Y zh^3HseTbhVzRHcKfHZvu9TEBCSTv8avJyE0Kt&jUTc4PVw>&?On&}6iTfRc)F#4jO z)ojcpu&+73T+{{_L36?^?&YW-F?fAk4p5PRSeCaaU|s2pB)$EP1t}AYVA_B0g|Mb0 z#w1L0U+{ZCqvWCb?dgX(sqv8U>i5mR13eu@W=r)YDGD0qAAiSj?lEVJNbFgE|2<{y z!@PEiz4ovn`gU`<-Y7R!vX9N$78xW%TEf)kxB&?O-kdZ=4iI|)aNLVAJr@MrIe;{L zo7AqIk&#nkJOcvjZsp!Z6%FoA@=FUB$yUE99W7MDeB3?Qy>~bWQqy-d0hU0tSP6Hz z6-EH$lVVyj5wj+fiVXFD=D}Nr(}O6r;0FZaqgGC!Pa}*4z$;U@IYpx+VAd1&K+j{~ zL`)Yy7;sb$T>7LB4eNbV4RaX-g!x?n!YzYOhbXd=IU#6cV`vp>0}px}I{ADd3O%}8 zTx!e@R9tFG=7gw{3#eZ@+&$cYve2N#!gAyOCsg74Pt_5!6dhAPc;bm<`roK#IvYMT z*?5>;{HM65S6G0Qoi6i>S?rC5c2GB#&5e=+Gw3l`nER;v_(Lh)M9QB#6`>|4c) zD2(=7l|aGX8=eR*Kq&|*fdfm*g^MNyy@eSll2aihvIw-*b{tSh`Ek<+xwh$lt|bP~ z9{gpLqDsBlel)CpTD#?Lx_1EN7Tfn;A({brMgmsSe=q{9bW&|g8e%r$bLyoT0L9g~bRX%bSn{y#fttCo)enuw1`GE2dP67J%jlT08T{FmJae16{0csGp{_j6ZZoGA{co z9;{Qb7X_elzz&`O3DQ}G_-_FC2x_-vAZEwfEe=ne6~%f+IoxLua(}i!Ccs#y&-?QT zW&nJo_bZvTuu{J3dZi@GKIl)^2m-To9s#DpsB}JIr^}_ua3>hn{ojTo!AM_-T%*^z z*8_@p2Toufh`LW-QqmNLqjB z=TXk47qSjZ& zwH}u}7?raZfAS=izOp8mA0Uy34{og~w4CbMZ8|tNE$gWBas7_g`~*4X(aN9S-2+(3 zW+aeX{qrZ4#CntzT&4!Uk3S|ruXH>w8Mq6&>}Nct`R>pgtiML2G$%)3nlNF^-cYNs za@_rKRX9ibq6;lBu@#WG7cNZ;es|Dz`Yn>K>F~^6V_p8ey(_<(#`el-(zPQ?Hyn&U zkaS!WK?%insUmYK*Hb(+Ri%q4Z_VxeTvy$5_~q0nZg2bgc*-UYVNlR^sha7{d~%B- z&4u_2PrR$Rnoa6XX`Ps>sZwX}Bl33fWeIrM6f+(@CFpf-=$Q`_KJgj<+W0p$ z+8F^d?yo2vv3t3D15m>FwH$VlT<$fnE`GC2F!l)P(<}MlM+v`7Yi}{HFXKlaewq;5 zux%#&U40pVRGNS;#!Fv!r5SQIGO^~y-?=c229-}F1bK5&KlYESH~()9QBV{Z8?dvg7z z&NE_U#}s&0vI#e3GXjHSnPKFchz5*&6;7NK`cjv$W}=03*4P@z#DJ zAKlY(&wwPMbRjAgYpGUR)HCy-W<=K0iQ1+1^MI(#==rd7wcH6@&vSZ^fp|dfbjhK@ z7=QR9GlcUO+WjV7MIbN8t-8=!qI}`}F?U7h;n7L9-^O zuNJ~X-8nC_xVMex*wUeEO5b>b{&n~yQ_l95S7$-<`BRg>qZ=isn%r|rG%%WAN5W4( zZq!Ms^Xcf8R%VmuN1`>NRfOEmBxCvuRJ!afv$@Lm0uC=LzV_%g&@(j-ny!c{ZZAxL zG1JnOdv|MI%d??G1RNV;7E@Xpv8H#l#ZrFwYwmA6N@a>4#I+<}x%~7Y!k=vY_Rr}T zWfyS|-<-WK@j8>yK??G41T#p6u>#{~CZfgo#Qe~VMQhFDWp-Bod z^lEAE)(aJW{H&_ElCa!Nb#rF-gtfdsw6I~UH@N(>gATDCu9co@gptYUSnD)1hb;|c-{ zsg#_zO%b`i~~QVjBEJJvKXZL=(gT5h9TXxj03nU<5RneT4)fetX?Y;+^5aHnZxBBXKmc(N721+l0|>)qrDvnX1M7b9e#=| z*wL#(XW5{bxvYf$jdTgS*0C|8;bDzSx~JrzeOT;=&;H)9y6jN3pSildnYXeVa0veT zA#gTFcyi>2fFcCkG@lpXGPl8d;Fa)ap%X&c((*dq7y2Q%@B;Wt#@8J1QK6QUG}=yu zE47v5QDz5KYM(auU8lGG_ij}VvV)1xn=YR^9y@(Qn^c<$>7CU{zwz29{v)|@SedA3 z;_wP<<8b0F#SdO_D;q0OcNKSnt2Ph!HAOqT-S8s`CxDm7)&qxKuix2|EQ#-X0zH}v z)xKLjQEaN|sl7mi`I6zohDCM?mx&Db&|6#}G;=?`Nb+8GfK>?vXfdHE5X%T;gZ8Ct1aX^zr7Ks>Oy5g~)k5JKjNmC3;VL!q zKt+d5gGR{)H}K4{c7p#-v^^yiz$kkGY}OEt1wa)G0XaQ~5^=B!z?ueq{0R-Ggb>Um z;x;^AIDv@z{dkZ?;&|StfRN*gUfkSn7EM*ziZ5E~T|EPqn~WO{TP{JH;T37?&X@H& zrbu59%Lhyje&5H;UGpz*IK>DU3zIBOn|8RWmDkwBLH+*WNyYlFWLh@XI$5I&3#l~Y z*W0VE28P(odzfDeX!KzhQFrepTmO>AX8(}+qZCt<^g&_zFpET0M!fF(wr+QCDzD=l zzO7^L_PJKCQ{4N78qNTDY_X50AnR8S!b zs<`e+*IX8NWniIVjLv&+4kdxwg}%>$Zk?53G0vC&Fx+~Ii& z>)%aQ2$0p+AsppOQb_{PQXpdVcp(67FZYL_x(2=B(LpodCzi$8hY5SqmyC$~IBO{1 z<%oWg%eZ3LJx1lRYW&K2$Lqd7JP~*|7-W-lx`;^o{^1y~%|n>po1qIRKw|3*faNuK z=78A5F0WV6!2@dod_-d@qy5GuX4dP7R?#4tAhuZZe6nt z*f&&Ey-Vzw=*`S7{KT$)xFze3!lUvJNgX{R7NCbsl=-S5-FRABi`Rng)r8l`%K+E4wiNxEN6gcX721$H}vTV%80EP|tT3DS53(Nl7y(h=aW=Ii0sQ#Je- zCn(yMS)gzGZWkl+63=240XHn94Ri!|J2L8 z%>;vuZH(0cv+3V#GhI587H%{B{5sKSb!szm`@+Hc0bM&AQ@+aA8;`y$Jjo9Z=xX+9 zb-05#+&Mi#I#QpN#OstN|D|*O#i}o5htMHS7AbBXC9J;BbUXzGh&!2a$XQ9yA9*ku z#6dtN+ns~mIc^jN0dO&&Yv~9Z|9ys`W3bN}{G;e(R|D z6nm|eY}ryKEZuI|o3J0#-QBnct<0hjsZD5Ckb=EWG6M*(X>w@P1Kitcl$N21iJhnc z)-kgrN^eM#DCkclNC0VwAt0hbCI9Q**sqL{2Xv0!-*MD1#_0FXd-|MbyJYAp;-0~F zA;3t7W}OK<86v_J`xy}c&ywiyiUFrk(C3SdG=7`ei^y*23rN1E?F47~V}ad(ME=!P zlCfNyQ=k2grIQvm`kXymF_w2Xb>#JG3fl<*lNF5N6~DXQK?50PKGfT^jZ>Sis(OcJ z<#eV^d`T85U&{kbIW1cZhGIjO99SEj>3-oiF-WiR8v-%lh0H?q z+E+$eM#fDRCXt3X`Mw8IP8Ta)y4?F*Y4O@wX}KVtPMI~li<#os^p)O-{O3_@B{|Z> zv0h)b&L5z_0WQbNa)B=2Ge*#}XrO(PrgzZ2AK|lngJu@47 zi`gi0tcxU?0)s3VUl@R!*XNeSsN~BOk_PdmCx%DNw13p zs1Gv;K`7o_rJ6IXKN%|tzN%JAuU^Se$--kKad-M1XpjC zzLguJ@joBO@g0hMT|U>>cF1-5?xj^BciTHUnJ2y=#6>d6u;)hOY7(Xc)O-r1gx`~R z4=X&_6ZKy4yjF9rZ!f7duqh31XM}!UFvGX+IXFxXM1t&|1dx1NglySA#qPx?&?o$Z zsHZlN;rc3x!z8!87}qUKYIog%WsOf((=oMeYAjJxR#RCA@~+nj6bL7{bIq%Q%%}m> zUfuU8vDB|4N=boQoc1F+-kY-`40`lgA=aq-b&ww*BJPE(<|gg$)+oMu_$PH!LEzVE zwU7bxX;%gD>kRgl_AkvAHVf^}vJY=a+9RwHUxEax*S{iwEnj z35qLHX&%ifGj*@0q9|Yp>rTIAV~xcCQGxc=^j08n87Agj*1QWmx8bg%dD)09)bB73zK%QfpIlRowF z-hNb7hcO_Ew)_!#4q(`IWZ*e)3?c@9odhR_Y4kaPn8en$#hgBpuj&H8=9n;>wkNTA}SArPhD=vq1hVv|*|>l>VC6h>WUph*CQ0cKb# zj0^WR5*zmesnbdS^VM@EAnJiaq_@w*xCAoE=@{)M(mtU!r7r8J?CG$}sn)hCCY>E2 z@f*#4pYAZ%ZmlHB?aoIWfUyWHo{}4ThMRdM3T{ z*QUT|Be2o|Gtr&IWNQINX7q=(2!ih!v;Sh{x;im2_!K)7$najaRPFk%dsBIa*i@Y4 z%3)W7$enijid;L(pn=_^g*?I+r76CFMYk<}nu`1&>XB7pw9a1=VUK|`=NdR>LuG+BP zNU&M|AxT|6vL>a>-2++T;@6^Y^S;in;+(x&jqH8V{FZF7$e?%IJ#xR!15C@z>UMk> zfW|u?l%?|~EAcbJfaCGbP%B9tqT^(=^wlDM7VOC`HuU8&oDTU`FaflH?wHW0t}CRA z?6)3tF+cd!-WHx$XJ$+f&=2&K2h0r~3jIcOBAr!#S!&4n&VHDCCQp{e4~aCs$)Ui% z6MWgV>t*Br*z!S_FXTb}>*!?X8BwleomX(D4dxrJNy{R6h(cA~s3t@orX4#wqA^vY z#?|d?b2m}7#>R$~t?I&86Qv|Q4W(N>m()d+hWv9iHJ=63n$*_R@ozbsimb2*XZ{hV zv+g`mZDy++=ajXjf9Y`#H>ZZ*^E~{l|5;O z3ro=IbvLCqMmKB-MPM{C+W?m zC%iuMk~aQ*b>;B#rrI_y)73-kFTJnry80St`4SFO@>vdF-Y|Bs11A*$40Rc3N; zSAVZ$O|J%*`VHQQn?MWDVK$JPO|}F4z!~ZEqLKft_?KXM3OSn?p=H*nd-pCm3%Gbn z3*1qWYF_4*N)$%n_fvR2zr|ij?o8j$5?N4-dqUj6x{lgxyn)yqW16(f>Zm!y#(d)F z=)7Q!lJl?j&eSt#to0i{XB-(|F{ZLf3UrL#cOIo?I)Gsrz{DIs)e2F;hiE9^7(ln% z(E$C{uvP=IM1h}zgk!mg$lu4JzGj|h-<$kydEYzC7?CrdDqq3Y%w$?@mrD*rou}qI z@_fF{hccH+fuaoi1nXp@;z#x#{A`k6H~Q>7yRZfFUnx>0ZDcnL=J0L|bsMM}e0-{1 z`yD&3M7OH6%8@#ZV{SFbdG!p%vj479@Oe?qK}EK$@zLG6IVYY`q8HrWvQ_bK78=i8(wU5yKXj$eLFlLVHRWf$lD>m z3gnpHm7p372mp1~mo8mekVF?tQ1gO>5#kO6e@1TL9q8OeqGO+&tY8Jb!=IihDkw}s z){K?eGY=wpfdjOQ6xO$p0DJMmHKz3-!_8p`lz}BHZoex$999@+ER3!#Zp*z!5Q2gN z{&sBW2GW1IO%h-pOoZ?aLRbe&hbTQ4-VA>Me+K?z$CKhu;5qPos%n?5EpNbhj`Mhd ztTDT9-U)W)d&%7c753tB%HmU*-`>r7cc$Hatyp$@#keYx7ppaT#7~1@msnvaNW1{J zz)ZPD15YwUlah-uhVC|^cb?=|JK8zOFmKNbF3&D^x7kiH~0oE7Mjq`{)IEdJ!P`}=Nj zlnBRXB!PJmJzqV%L#lLXS)SoZ4lN=hUno=E`%{R8o<#pXWb7$3y_qMX8N7|H9T=$*JLl@BXyn zUcc3@v}tos^}9BY!6@|4f;b>K3UCJ$L+k*(=z2r<%v^un8Qa`TVD?_bamSNzuDBLW zeT22}a3wPsXgnEswQ^Z(SWS%t{4v+2qi(-``gEc1cqY;W`dP9OV8nXrt~B77`1!-i)$A%cg>*fe?jAoq z2+ztY*!UAF$qRirM1ukQdZYpzg?7A0$7c|Wy4?`c+5L2)D0eLifI|Ts)DxemLJ|4^ z0j9^izv;5mjvjQ!Whou7Pcpu^FX%%Zz-Ss8vp1O5Y_sQGOrI+{OAB!1;F<5$rt>#* zEKs07&j9ud&p2)qWwb&aw&r`p4J04#4F*X8HwmUrRo_vy{WqQg4BWph2iw=U#hT5! zYb_bDnp)EmsnEW+r3KvZ{5U}`e|U*z^$zJ>u2@Y39YxFNg$~%9&9|{x7t!gL8>{rN zJza!Jr!aII5e3f)u%~~$NYx;tMBgvi-j6g)*t=@IoJZlpb5X|UU?o*>s2!JRb1&^- zpLe3$Ig%29LC_6xI8s~|4PX$7(;|dYflG-HptBRZ@ZP0ecJzlOSLB z+B9qGSHV}h{EQQo-@nMIw$3|bAc0AT-}zxx38C4~Zi;jbsB>hq35IfqZj_F)?g4wJ zGIk{giB z8biM4I4&p)ztt#i5od>a)`WS7-vQR+NJ`9XtIX=8BY=t#G8l(|m^BT-G(9`#9jHHX zen_}O8`;BS9MaLF;`_tO`OiS+r91Q~M?lggcpwH&VAncsKqACSE5Ge~`905#9-Dtd zlTYOvSq&Kz5g=&LAR(*0k^->CTs#=-Ik|PIv^2$m5)^fZQD_*3EjfOCd=Z|wS-%#} z-}yc4L4zK+k<|xsT0fJ|SMX7Sm!YE<(IMZUFjWrtsyvZM#389sqw&sv{NWvGX&9|A zzH;i^?dg8{(?77KqQSOhCGD?ny-N_{(4 zv6<3hpg4DD)cN95qYwwZu)amRE$!sIlWnvh_K*m3GHP+E16XH3CPC^>(GkT`kx2zA zPX;oYl;~$_L||g9HKBKfAc{cFv2_Q05!?E&o#gG`w` zcCReteVC5mzr%6)@vIceE9B>o@{sW7ZeWdZe7bI&Doa^}mJ(nZzUkld=QhEsnBL(WtDW7>~CDA0og%7Z7pW4+lQ7oh2 zGySP;9O!gl8Ppr=d05i&@eh~MFV2_jZHS!9$&#PPwz@(BlZoHI@iRB@yH%l3Z&f}F zMT|(*ZUg7auS0ZmC&IcAF@1kc8~^Hb3gXS(>)nXp4C#Pc^O#nEAtI#;K^%@)&kA8) zSHp>Muu8*w=X+cb#F<(6XbQ}&!Q09%a;W)^0upOh93v5(m1Xu@c!+-U7Gf4bWt{|p zs8BTAW}H`|u;3P2yQ8ylzxny4?5Zm%qkca7Zkpf+NNMaYD;vl6?)UkTn*VuAvrP<$bvA!|Ka|Hqrv##w;qDAycq3`JE$v72o*3ADoff8uq$hPCBXWK{+`({uKFuaupIwRhWC<%^$SVa^_L zGN>OrSeaq1c1^RyS~8tI4!DCzeti5@elp>4(B`o*=TkpSWZhfLn{Ng({EEMG!YDbU zdD!#JBjb}>mI}Gw^3s^_^h`XJEOVmR+1uH$_>r#UsCjOztE#$TiBTBi@6#Gzi=HdY zT$31f+xNV;Y(CK-y?=00X0C9v|5ghNJ4o>GE>!cAZ5-s3ukrGIdTnaSCTnT8uUEBC zWMz8kLd%KVM5*f^;W5YUg0#6iiA35mG%^~0c5QVNb3f*kax(46cliq$#oDP&uTS6P zTgfVKl6#q8plkCbDA(C~_|8Ek3ViC6GU`(G8E<)~b2wtfbeFd0>26(^O5Y{9PY%|1 z-S+ms%L}L-ps?1TLLwu-v)OGLDqL?(sD1+MNJMyJpXjdg(9hlI+J?cga7z&G1=P_* zY6Nd9tD*WCYPS<-ERa6XQl!Hc2`Tch{ONN3F<#_(^XBLGnqwU@0+|<*QjRS;Mg@(Z zBj-x|5>=%7%Jha_gu>K^q72ayL3p$_3UcNcfulCoJV5(<$Z>~bLMDH~kSWBlFo+ZbDrPwFHLBDbM)NhCiH{Wl$n zJ+e#;4DVF#ZfLQ$J6=_k5MI+g zAUc5vjc0l28=hwlScsC2!+}><1^xXACnRfFZYkPTmg|fFU1^m#y0YlLs`#54Ybpd4 zRIgZ)Nh`$(a2aWW!WA$8y|n-#g5U6P%v+FCWV0@7cOvP`d!xQ@%=IMOe~3G_hGq&$ zhw=?X@4^T)FT{M&Z{m9ZE1AP93-x7_g&7noYptQ-T;)Gw@%1aGU7G`aEx zG(w5M94|Hg$UpzRnB;2y4x;o!Uekg zPW&lUbZrqhXx1c_&)$!Hd*&Jw$SKCug}<(Z-GS1Z6}pTW`pg<5WWSatZ@g9-{MZth z1J#vE&Cu;d65Cp@krr0_Qwz(AZYNbZ6QWF~_RXIy2Itz6#C>K{XoE- zYY9b6Ytp zF#2hdYZ}FN^v_y#VyQ%mfV=S1;IPtAz0T$jY544HB%K*gf~*_-&fMrr(FaBa?1R$Q zi=^P!P+X0bp{y{#CQ`L>k_pMc1z;}6>{0tPd+6kJUcWiXH`;odtJ56@Ph-4|PMm&q z<-E7sf$F1GF`M8aXx4)4Yn0ELG6T!s*^>wg$rD**) zUJP$zXM7!h6K{gQj<>^`;tlba@wzZrLpG~UE2sLJ*uDL>!)A-*%GlrQxg%Be^>l+< zQGx0B>nz^@zZ7af;Q`m;@N*_KR!XNMd)J*R z=vlI_RDcj;jCQph@%@8et2a)2S|G!gRKpA~{7fKGmrNn{uBAkSqC3GS6P!={X&lLNy7zB$1PP0fWMN0{tI<#LEx&KJ6TorDu1T{1KNLnsNO z{MUv)3a($XuD-KD{p?gUe*keS;*M~;1N$=1xL>q9&I6X z+CM{jQG3IE3}6T`$SNI~pIdM*dSFYC^Iaj*kU(xZr0|UvtOY*!M$kDhd0)H2khn9V z6h8HtV;`f3leW(?k)l?t3QS}T&sK>|+b1U`RT0$$aoOi?8bOsb+cwqI-aa+8extsJ z!-*=_5<>Kgh=?e( zQn)H(J*g_!J>9!;`?lqM5{QpIub+xq+?x3MOJ2;1HeCmq=`@^(Z!9T4Y`b1?gPbSy zm!n*}SKCBafJoWTKLN~=A7iBIC8Rz{l79EElf#Mkca_8wscNlF^c|K(MEEHj%Au&i zF`{Ga=c3C?>Y2G6upYwO9Y5_XdqwK^N%#6jTB`aESte`FfHBp6;jv|l$#Vc_4P0*B zyme4h1;2`USzS#G{}+{Sw=0gFK(Jzfb@q&6Xw&V*Ra$yd(B?WgZ5fT%Rc3c}=$eUj ztuAPCklUzj`TjkIbL%2_m7Iq}L;-OM#6#mge5#+dbwWWB>fKk%U!PQGbibj4R)u=F zf5tq{d+FDFGpOWoue0y3OIeHSHX9q(yi+e#e=Ow+oFJdPx|FzTAn&3EW6%UP3ZO&cKoq#9lCNH-7T+?o%tQ!ipSH zS_hYb9mvu9f#Nysyh ztN1FML^*5(jWoaa_<|#6{}cA!`@QhQ`hny!8?Wu6153^mOJzSvd%>0M^JU!KpL(@f zav=Hv>^mn4F#8zB!Jsz!awL&ke}GWwTQffs_$zxe1-|I&3&u3r5jVxFevA)=r42DhHs?*LfRpB1&DD1 z90W1^!id)je(X^Q;|!pA%Z$jnvCl?UO|8Q;bW)U@?8wN%c&fhYLV}jXLt{=mUD?iZ zNZg+|VOvgMvJL}xPGP74Iw$9cizOmr@}1!_;WU@}5-Y201aLdZBC@4?=1nReZ&y2d z{BYj{e)1EZ=U$(3%HO+|nUoI&o_@swtymjpgFbnF9uOQpUYI%fO=4?d{S``AqhFfz zampj=I+u_N7bm&jR~(qGoWcyaB}HAp4$>sYBkB#>tM|^7QXkJuWF14^dVy>WoG54D3O zMf-}v9mt#Z#NLK-10@G`_8?rRi=-yY*2MPqBrY$}Wb&9FQwpxD%b%2Rt!!!1eRxe% z`paoXJOLxs5O719$$)zTWXC%qNDvB-3ZqqJq)0KD(0wwLgcB%I!$75skepvQ*PKCM zH*ZXaafI1l2^-;bgd(x-HnD7HyLi$sz=K+g1+h`^(}mgaH+Wy;l-XZkHXp?o6E`@I z=*(MY#wha}&eRGZQT613s+_=E-y*d$PCGM&sfMSkr`|?_4v|Y&-(0Ew0v6Hp| z*2F(+znh%(VEi{WOZg5D1(Uvjn~rkhO-a7hd*Q{C0C&~5BRrE@md*5cu(t}1##L&} z<{U+rp*8%lVo?$dKdblf!v0B_zv$6f%&X0)(t7MqVx!~?V4lsgh982w3!dYQg{p9x zqQ(oX>X7$ibKN$3O40}K*g3dps3q5^sA1_oLEnIf^E_l=!B-A`X8Bzd1-O>HCp(-+ zb|<3riW862HkdN!yBO=!EgwH1NI5%*h~aW$N>5e)KBO*p5xR`OP=! zLdGtQ{5Tnw2j(kwC!;xy#Rb7*9R(PJ_ROg6e-!m4;84Eb`_CBL*o*9I5eZq!l5HrY z#nOiCyU3Dtgqaa(6B1>o6e?ROJ2RrlUiNHb&%PVXnEAi-`TqXLb#aYrmghb1dCs}d zea>@+l8#~(g9EI+!&b9Bjn~&%I@n*|52E!JA8(Bee(-2`@3X#g)dUYDGIuYQqsErT z@J(%3ZkGJWJxL@T9cZAg-0;9o?$BMkqpZ5jOIksb`8j;NAHvhp`Efl&(rES8~A9V`Qrd;6T_ zvmt}NNwg;B)g0ntd8AUTbw`a#V(;jvC@PBUY1V;iGl(%gum-LJ$H0yTZh@E`5!T39 zI@Pp%$!xJ>X950@w@5$y0+=8vi3+~1Jiq`zR6zODc_qL>tf*z*ec3Vj{u%WD)lR0# z%f-r`7hzI-p>p4-mOpIU&UK=yGj6)%2yC5F@518K42|biRgBEp97JaD!pM zET+_`Jz2Gf(PBmCOw9}awGgV5?`P)bE_ag?@+X4rdV3+N^OzuX63Lv0;_r7v!TGLg zX3$dD%9tB{AUlxHuf_;c&soh_Djh}g4AP*m^uX?}9mI@Ea9=#+nVNoj zsmvINV>O-vI)7?Z4Gj>^^40I2{x!4}si=Og$V9jA*Df~_;?Og^>$)Uf`8@5&;Z84&2yCr zSJ|;|46zMu@3wLAE!rY0ok}5YZ{FP)4rutRBs`yS>{5>cQU_*Ky)v=bdKoCqu(oRg z&Y=B`iLIZTc$I*@rt%b~`bnM_MZL=nK~cu$vgE_X01Wz%oiqA^4On)xOQzpOU!?&Z zv05#D>?keTBo#y)=~ zUKsynL6xrUdo?u*>4E&S@bE2_I$LW#3OZbzD9>Uw zKHACz8uHieE;dFmJPof84|;KeSzZRZKxb3RJfwX<$qm>FioJYwo3>JROvA4{V95B! z5u7$AdxXiA^FPak+!kbvD0$G?IN)TPJ_*6E0}Z}bH)({W;7;RHnZCV0P$Edc{%}YJ zywrss0)xMI(~~s=f}bO>N3bsJ$U!n`_GT6VLC2otqg~dqTF62e17JzHbDguTkMpM* z7cl4A#tCyZ@iXI1BkkU)+t&>Wn9u#HI5Yb>Q6{3_<@^MlH|=d_X7G8!_FNiGR$O4z z8@&VrXQ(c7kKeYhY9n|iU)VT)aHeE5h2h&!jeQ~Ss_Hkc%{H{#E3Ztguu8JYQ#bx7 z*!{Ay+AP6SmAL*Cc49{(*Gy165JyJQWmRG-jp}__R6ACe+8C6&%IQ|rSeGut@kn0r zh}(y;nb28!tUh+TR*Jz5eO2BBFYhq7GRTcLA94^xK)mFeBKE@|1L9^odI^+3zFf()Io;J)JR@_9Jq;x%TRW{R^9Sr+1fc#-*?ra2=6_|tAd8O=OUI$PkdA1O1{$%Re?QP;>2KDd8vR^y z!lT-9!;SehVe%ZT&#|EljsjRLUl5*2k7kmAmvG0Z4HP4UA8nF}+&8cKWb?vO@+GPIhO)E_z^W)~vz=DwGS}eT95LYrc1k z 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 a{%#D`Sluu@3hx^gIY-~wvS}&+*!~|1N!42b literal 0 HcmV?d00001 diff --git a/addons/mail/static/src/audio/channel_01_in.mp3 b/addons/mail/static/src/audio/channel_01_in.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..12d0b288bcfa6f830c2b6dc338283d7281923c9a GIT binary patch literal 17560 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 T*|Pm&zVD`eY*jz}YwW)OxloVv literal 0 HcmV?d00001 diff --git a/addons/mail/static/src/audio/channel_01_out.mp3 b/addons/mail/static/src/audio/channel_01_out.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..cded45bc81f672072b2827c85ae6de021745a5c6 GIT binary patch literal 18812 zcmeI42UHXJ+W#jB2>}8m5UPM7BoHECXbLDA0@6#UBElLvND)y1(bdpHlLP{UqJ|=% zf+7L}iiRT6WNEsJq6nxIQL(IIkC|8-8zoS9#F=6SyJInVs& zH#4y^(}e)PF4DiP|7o@SzLpFCg0+AR9RT0}AQS-rApTE_-x31=cpd-L{HQj2{q3QJC6@ix~NilC;)?!2VVoq{JSyZv{z%JYn8>IRp zttjl+&YXfYQ&@nd{BGHRlEq|7m!*ze?Pvg)RGZjdnj@FlAE2x%$WhSoL8&uLG2F2+ z5{cX%rvd{C85lT?>zx1s0p@8?Fh@fkCfLFol#6ex5CT=Sn9CxOG&&X{b2}~$1_#TS zlqQ5iYacs`&_ukG>m49eRru9guM_Es>XrttnGFrf29mm3+6R^5Cu-Bx{4m`+)O>IH zw;Kwz?J1sCgSKOfM~rSN7e6XIBC#9cV!vp>^*b%!dJLx@+j^{DxXX^`rel`e_0#IL zH=ex#O*Tz?0xd$i$5&NHC zn*ebHP5D<#?7AJhk2}{qSZKE8tZ7J0-E|KZ17dXsY^EOq zW*%9rrmqH!HkEp2TfGAWrVryq^|254CbN8QYCtbN+2qojdxA_eH}fl|t~1lXNikJP zy01L;+3c!QGh^q38*0>9g9Ncq8(%0AyV}SUAOLX7OLirJ>9{l}Jqda?n3yK>s*X_l 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 C{ZWzt literal 0 HcmV?d00001 diff --git a/addons/mail/static/src/audio/channel_01_out.ogg b/addons/mail/static/src/audio/channel_01_out.ogg new file mode 100644 index 0000000000000000000000000000000000000000..d55c305a5f864a7223ac766d1bcef8569392a48b GIT binary patch literal 10476 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 literal 0 HcmV?d00001 diff --git a/addons/mail/static/src/audio/channel_04_out.mp3 b/addons/mail/static/src/audio/channel_04_out.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..f32ebba6bb5c26212284d09829022984fb58da38 GIT binary patch literal 6918 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¥LC-w%`d^XMnnBZq^RfguMa_^@>E)K6`Of)IPm-Kb7 zHZJC=7C4$~cg6FhwupvZ;GCQI$wUl?v(o*#rr)yVt_tS}E+tboUBQsen7Q*hnCK_tRUG3 z1`QZ^B2TY73g?Y}BrSoJHFH9#U`2S!Vw1M6nm^@hQFEz0gsrq4P7&*`06F zHnzTLzfY?#65=QQ)B7c(^3l#HLP=j=BL8V_i(>2hYO!a71uR3E&fWSRl)dz;vPL&q z`GWk^-1B$4O?1nAgD+TLjHZHbGmNYxMh;h6IwVQ4%z8%+-W&HeFn4+|JJbdmz1n@> zcIxb|(@+8r_bn>8=8jMQC+3X;PsjgX=#NwNtdpJohJwE<50~IQlp8i#xt^!YDb}ht z&i;6>ko%vAn$Vxkw{?2OojEKU>0`bZ)IcxRF+=MmeKF7^r*T)CJ@V)y{Wl^|JQuOnhhP2bN<6SzNfhGkZE1`U&%(I&b z`0L_bcC3BQ9tN>51lNRO=?wxwP&M^+-9OR)@9BTd0!LMtVu1P>&^aw6lIsWkQ2{>n ohUn?lg5%G6+`qQr->d(&z(2IW--!E%=J`E&8hn4#|Ct5;162?HJpcdz literal 0 HcmV?d00001 diff --git a/addons/mail/static/src/audio/channel_04_out.ogg b/addons/mail/static/src/audio/channel_04_out.ogg new file mode 100644 index 0000000000000000000000000000000000000000..1dc628b2ad4e6ec8d1454db8876604dd170f6ea5 GIT binary patch literal 7587 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 QqSDr%3_OD*ylh literal 0 HcmV?d00001 diff --git a/addons/mail/static/src/audio/dm_01.mp3 b/addons/mail/static/src/audio/dm_01.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..71f600e8c62d132d3114187671a6dad8b6d37574 GIT binary patch literal 20690 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 KW5$yUF#iF~Qv`JY literal 0 HcmV?d00001 diff --git a/addons/mail/static/src/audio/dm_02.mp3 b/addons/mail/static/src/audio/dm_02.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..91d4390c691dd6955ba95de2d8aa2b37224e3cf8 GIT binary patch literal 7544 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

$R=e%eCGz%#-LRIuA#z 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 K+qvJhQU3)`$14{A literal 0 HcmV?d00001 diff --git a/addons/mail/static/src/audio/share_02.mp3 b/addons/mail/static/src/audio/share_02.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..52141784f618c50411d4895438e32ff9886effcb GIT binary patch literal 32584 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 n?tjG0f8OL@Ebu3B|6+(Ngu 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 literal 0 HcmV?d00001 diff --git a/addons/mail/static/src/components/chat_window_header/chat_window_header.js b/addons/mail/static/src/components/chat_window_header/chat_window_header.js index 270648b382e..b6354b7c066 100644 --- a/addons/mail/static/src/components/chat_window_header/chat_window_header.js +++ b/addons/mail/static/src/components/chat_window_header/chat_window_header.js @@ -74,6 +74,24 @@ export class ChatWindowHeader extends Component { this.chatWindow.close(); } + /** + * @private + * @param {MouseEvent} ev + */ + async _onClickCamera(ev) { + ev.stopPropagation(); + await this.chatWindow.thread.toggleCall({ startWithVideo: true }); + } + + /** + * @private + * @param {MouseEvent} ev + */ + async _onClickPhone(ev) { + ev.stopPropagation(); + await this.chatWindow.thread.toggleCall(); + } + /** * @private * @param {MouseEvent} ev diff --git a/addons/mail/static/src/components/chat_window_header/chat_window_header.xml b/addons/mail/static/src/components/chat_window_header/chat_window_header.xml index 6ac2bcaa0af..5319b1cbea0 100644 --- a/addons/mail/static/src/components/chat_window_header/chat_window_header.xml +++ b/addons/mail/static/src/components/chat_window_header/chat_window_header.xml @@ -25,6 +25,14 @@

+ +
+ +
+
+ +
+
diff --git a/addons/mail/static/src/components/chat_window_manager/tests/chat_window_manager_tests.js b/addons/mail/static/src/components/chat_window_manager/tests/chat_window_manager_tests.js index 687a2cb1664..70cee153a7d 100644 --- a/addons/mail/static/src/components/chat_window_manager/tests/chat_window_manager_tests.js +++ b/addons/mail/static/src/components/chat_window_manager/tests/chat_window_manager_tests.js @@ -448,7 +448,7 @@ QUnit.test('new message autocomplete should automatically select first result', }); QUnit.test('chat window: basic rendering', async function (assert) { - assert.expect(12); + assert.expect(14); // channel that is expected to be found in the messaging menu // with random unique id and name that will be asserted during the test @@ -498,8 +498,18 @@ QUnit.test('chat window: basic rendering', async function (assert) { ); assert.strictEqual( chatWindowHeader.querySelectorAll(`:scope .o_ChatWindowHeader_command`).length, - 3, - "should have 3 commands in header part" + 5, + "should have 5 commands in header part" + ); + assert.strictEqual( + chatWindowHeader.querySelectorAll(`:scope .o_ChatWindowHeader_commandPhone`).length, + 1, + "should have command to start an RTC call in audio mode" + ); + assert.strictEqual( + chatWindowHeader.querySelectorAll(`:scope .o_ChatWindowHeader_commandCamera`).length, + 1, + "should have command to start an RTC call in video mode" ); assert.strictEqual( chatWindowHeader.querySelectorAll(`:scope .o_ChatWindowHeader_commandShowMemberList`).length, diff --git a/addons/mail/static/src/components/discuss_sidebar_category_item/discuss_sidebar_category_item.scss b/addons/mail/static/src/components/discuss_sidebar_category_item/discuss_sidebar_category_item.scss index 93bb7556fcd..55b14cd4e6e 100644 --- a/addons/mail/static/src/components/discuss_sidebar_category_item/discuss_sidebar_category_item.scss +++ b/addons/mail/static/src/components/discuss_sidebar_category_item/discuss_sidebar_category_item.scss @@ -13,6 +13,14 @@ } } +.o_DiscussSidebarCategoryItem_callIndicator { + margin-right: $o-mail-discuss-sidebar-scrollbar-width; + + &.o-isCalling { + color: red; + } +} + .o_DiscussSidebarCategoryItem_command { margin-left: $o-mail-discuss-sidebar-category-item-margin; margin-right: $o-mail-discuss-sidebar-category-item-margin; diff --git a/addons/mail/static/src/components/discuss_sidebar_category_item/discuss_sidebar_category_item.xml b/addons/mail/static/src/components/discuss_sidebar_category_item/discuss_sidebar_category_item.xml index 9b73002e15d..e803d896431 100644 --- a/addons/mail/static/src/components/discuss_sidebar_category_item/discuss_sidebar_category_item.xml +++ b/addons/mail/static/src/components/discuss_sidebar_category_item/discuss_sidebar_category_item.xml @@ -30,6 +30,9 @@ + +
+
diff --git a/addons/mail/static/src/components/rtc_activity_notice/rtc_activity_notice.js b/addons/mail/static/src/components/rtc_activity_notice/rtc_activity_notice.js new file mode 100644 index 00000000000..404440e3069 --- /dev/null +++ b/addons/mail/static/src/components/rtc_activity_notice/rtc_activity_notice.js @@ -0,0 +1,39 @@ +/** @odoo-module **/ + +import { registerMessagingComponent } from '@mail/utils/messaging_component'; + +const { Component } = owl; + +export class RtcActivityNotice extends Component { + + //-------------------------------------------------------------------------- + // Getters / Setters + //-------------------------------------------------------------------------- + + /** + * @returns {mail.thread|undefined} + */ + get thread() { + return this.messaging && this.messaging.mailRtc.channel; + } + + //-------------------------------------------------------------------------- + // Handlers + //-------------------------------------------------------------------------- + + /** + * @private + * @param {MouseEvent} ev + */ + _onClick(ev) { + this.thread.open(); + } + +} + +Object.assign(RtcActivityNotice, { + props: {}, + template: 'mail.RtcActivityNotice', +}); + +registerMessagingComponent(RtcActivityNotice); diff --git a/addons/mail/static/src/components/rtc_activity_notice/rtc_activity_notice.scss b/addons/mail/static/src/components/rtc_activity_notice/rtc_activity_notice.scss new file mode 100644 index 00000000000..4d32c9e13b0 --- /dev/null +++ b/addons/mail/static/src/components/rtc_activity_notice/rtc_activity_notice.scss @@ -0,0 +1,33 @@ +// ------------------------------------------------------------------ +// Layout +// ------------------------------------------------------------------ + +.o_RtcActivityNotice_buttonContent { + max-width: 150px; + align-items: center; + display: flex; +} + +.o_RtcActivityNotice_buttonTitle { + @include text-truncate(); +} + +.o_RtcActivityNotice_outputIndicator { + margin-inline-start: map-get($spacers, 2); +} + +// ------------------------------------------------------------------ +// Style +// ------------------------------------------------------------------ + +.o_RtcActivityNotice { + cursor: pointer; + &:hover { + background-color: rgba(black, 0.1); + } +} + +.o_RtcActivityNotice_button { + font-weight: bold; + user-select: none; +} diff --git a/addons/mail/static/src/components/rtc_activity_notice/rtc_activity_notice.xml b/addons/mail/static/src/components/rtc_activity_notice/rtc_activity_notice.xml new file mode 100644 index 00000000000..bdbcf29b983 --- /dev/null +++ b/addons/mail/static/src/components/rtc_activity_notice/rtc_activity_notice.xml @@ -0,0 +1,23 @@ + + + + +
  • + + + Open conference: + +
    + + +
    +
    + +
  • + + + diff --git a/addons/mail/static/src/components/rtc_call_participant_card/rtc_call_participant_card.js b/addons/mail/static/src/components/rtc_call_participant_card/rtc_call_participant_card.js new file mode 100644 index 00000000000..ce6b9176c71 --- /dev/null +++ b/addons/mail/static/src/components/rtc_call_participant_card/rtc_call_participant_card.js @@ -0,0 +1,58 @@ +/** @odoo-module **/ + +import { registerMessagingComponent } from '@mail/utils/messaging_component'; + +const { Component } = owl; +const { useRef } = owl.hooks; + +export class RtcCallParticipantCard extends Component { + + /** + * @override + */ + setup() { + super.setup(); + this._volumeMenuAnchorRef = useRef('volumeMenuAnchor'); + } + + //-------------------------------------------------------------------------- + // Getters / Setters + //-------------------------------------------------------------------------- + + /** + * @returns {mail.thread|undefined} + */ + get callParticipantCard() { + return this.messaging.models['mail.rtc_call_participant_card'].get(this.props.callParticipantCardLocalId); + } + + //-------------------------------------------------------------------------- + // Handlers + //-------------------------------------------------------------------------- + + /** + * This listens to the right click event, and used to redirect the event + * as a click on the popover. + * + * @private + * @param {Event} ev + */ + async _onContextMenu(ev) { + if (!this._volumeMenuAnchorRef || !this._volumeMenuAnchorRef.el) { + return; + } + ev.preventDefault(); + this._volumeMenuAnchorRef.el.click(); + } +} + +Object.assign(RtcCallParticipantCard, { + props: { + callParticipantCardLocalId: { + type: String, + }, + }, + template: 'mail.RtcCallParticipantCard', +}); + +registerMessagingComponent(RtcCallParticipantCard); diff --git a/addons/mail/static/src/components/rtc_call_participant_card/rtc_call_participant_card.scss b/addons/mail/static/src/components/rtc_call_participant_card/rtc_call_participant_card.scss new file mode 100644 index 00000000000..524f4036680 --- /dev/null +++ b/addons/mail/static/src/components/rtc_call_participant_card/rtc_call_participant_card.scss @@ -0,0 +1,160 @@ +// ------------------------------------------------------------------ +// Layout +// ------------------------------------------------------------------ + +.o_RtcCallParticipantCard { + padding: map-get($spacers, 1); + display: flex; + position: relative; +} + +.o_RtcCallParticipantCard_avatar { + display: flex; + justify-content: center; + max-height: 100%; + user-select: none; +} + +.o_RtcCallParticipantCard_avatar_image { + max-height: 100px; + max-width: 100px; + border: 5px solid gray('700'); + + &.o-is-talking { + border: 5px solid darken($o-enterprise-primary-color, 5%); + } + + &.o-is-invitation:not(:hover) { + animation: border-pulse 3s linear infinite; + } + + &.o-is-invitation:hover { + border: 5px solid theme-color('danger'); + } +} + +@keyframes border-pulse { + 0% { border: 5px solid white } + 20% { border: 5px solid gray('600') } + 35% { border: 5px solid gray('100') } + 50% { border: 5px solid gray('600') } + 70% { border: 5px solid gray('100') } + 85% { border: 5px solid gray('700') } +} + +.o_RtcCallParticipantCard_container { + margin: map-get($spacers, 0); + width: 100% - map-get($spacers, 0); + height: 100% - map-get($spacers, 0); + display: flex; + position: relative; + justify-content: center; + flex-direction: column; +} + +.o_RtcCallParticipantCard_liveIndicator { + display: flex; + margin-inline-end: 5%; + align-items: center; + + &.o-minimized { + font-size: 0.7rem; + } +} + +.o_RtcCallParticipantCard_name { + padding: map-get($spacers, 1); +} + +.o_RtcCallParticipantCard_overlayBottom { + position: absolute; + display: flex; + pointer-events: none; + margin: map-get($spacers, 1); + max-width: 50%; + overflow: hidden; + bottom: 0; +} + +.o_RtcCallParticipantCard_overlayTop { + position: absolute; + display: flex; + flex-direction: row-reverse; + margin: map-get($spacers, 2); + right: 0%; + top: 0%; +} + +.o_RtcCallParticipantCard_overlayTop_element { + display: flex; + justify-content: center; + flex-direction: column; + margin-inline-end: 5%; + padding: map-get($spacers, 2); + + &.o-minimized { + padding: map-get($spacers, 1); + } +} + +.o_RtcCallParticipantCard_volumeMenuAnchor { + position: absolute; + bottom: 0; + left: 50%; +} + +// ------------------------------------------------------------------ +// Style +// ------------------------------------------------------------------ + +.o_RtcCallParticipantCard { + border-radius: $o-mail-rounded-rectangle-border-radius-sm; + + &.o-is-talking { + box-shadow: inset 0 0 0 map-get($spacers, 2) darken($o-enterprise-primary-color, 5%); + } + + &.o-is-invitation { + opacity: 0.6; + } +} + +.o_RtcCallParticipantCard_connectionState { + color: theme-color('warning'); +} + +.o_RtcCallParticipantCard_container { + border-radius: $o-mail-rounded-rectangle-border-radius-sm; + + &.o-can-click { + cursor: pointer; + } + + &:not(.o-minimized) { + background-color: $o-brand-secondary; + } +} + +.o_RtcCallParticipantCard_liveIndicator { + background-color: theme-color('danger'); + color: white; + user-select: none; + font-weight: bold; +} + +.o_RtcCallParticipantCard_name { + @include text-truncate(); + color: white; + background-color: rgba(black, 0.8); + border-radius: $o-mail-rounded-rectangle-border-radius-sm; +} + +.o_RtcCallParticipantCard_overlayTop_element { + color: white; + border-radius: 50%; + background-color: gray('900'); +} + +.o_RtcCallParticipantCard_video { + cursor: pointer; +} diff --git a/addons/mail/static/src/components/rtc_call_participant_card/rtc_call_participant_card.xml b/addons/mail/static/src/components/rtc_call_participant_card/rtc_call_participant_card.xml new file mode 100644 index 00000000000..6660df2c00e --- /dev/null +++ b/addons/mail/static/src/components/rtc_call_participant_card/rtc_call_participant_card.xml @@ -0,0 +1,93 @@ + + + + +
    + +
    + + + + + +
    + Avatar +
    +
    + + + + + + + + + + LIVE + + + +
    + + + + + + + + + + + + + + + + + + LIVE + + +
    + + + + + + + + + + + + +
    + +
    +
    +
    +
    + +
    diff --git a/addons/mail/static/src/components/rtc_call_viewer/rtc_call_viewer.js b/addons/mail/static/src/components/rtc_call_viewer/rtc_call_viewer.js new file mode 100644 index 00000000000..9313273fefa --- /dev/null +++ b/addons/mail/static/src/components/rtc_call_viewer/rtc_call_viewer.js @@ -0,0 +1,152 @@ +/** @odoo-module **/ + +import { useUpdate } from '@mail/component_hooks/use_update/use_update'; +import { registerMessagingComponent } from '@mail/utils/messaging_component'; + +import Dialog from 'web.OwlDialog'; + +const { Component, useState } = owl; +const { useRef } = owl.hooks; + +const components = { + Dialog, +}; + +// TODO a nice-to-have would be a resize handle under the videos. + +export class RtcCallViewer extends Component { + + /** + * @override + */ + setup() { + super.setup(); + this.state = useState({ + tileWidth: 0, + tileHeight: 0, + columnCount: 0, + }); + this.tileContainerRef = useRef('tileContainer'); + useUpdate({ func: () => this._update() }); + } + + //-------------------------------------------------------------------------- + // Getters / Setters + //-------------------------------------------------------------------------- + + /** + * @returns {mail.rtc_call_viewer} + */ + get rtcCallViewer() { + return this.messaging.models['mail.rtc_call_viewer'].get(this.props.localId); + } + + /** + * Used to make the component depend on the window size and trigger an + * update when the window size changes. + * + * @returns {Object|undefined} + */ + get windowSize() { + const device = this.messaging && this.messaging.device; + return device && { + innerHeight: device.globalWindowInnerHeight, + innerWidth: device.globalWindowInnerWidth, + }; + } + + //-------------------------------------------------------------------------- + // Private + //-------------------------------------------------------------------------- + + /** + * Finds a tile layout and dimensions that respects param0.aspectRatio while maximizing + * the total area covered by the tiles within the specified container dimensions. + * + * @private + * @param {Object} param0 + * @param {number} [param0.aspectRatio] + * @param {number} param0.containerHeight + * @param {number} param0.containerWidth + * @param {number} param0.tileCount + */ + _computeTessellation({ aspectRatio = 1, containerHeight, containerWidth, tileCount }) { + let optimalLayout = { + area: 0, + cols: 0, + tileHeight: 0, + tileWidth: 0, + }; + + for (let columnCount = 1; columnCount <= tileCount; columnCount++) { + const rowCount = Math.ceil(tileCount / columnCount); + const potentialHeight = containerWidth / (columnCount * aspectRatio); + const potentialWidth = containerHeight / rowCount; + let tileHeight; + let tileWidth; + if (potentialHeight > potentialWidth) { + tileHeight = Math.floor(potentialWidth); + tileWidth = Math.floor(tileHeight * aspectRatio); + } else { + tileWidth = Math.floor(containerWidth / columnCount); + tileHeight = Math.floor(tileWidth / aspectRatio); + } + const area = tileHeight * tileWidth; + if (area <= optimalLayout.area) { + continue; + } + optimalLayout = { + area, + columnCount, + tileHeight, + tileWidth, + }; + } + return optimalLayout; + } + + /** + * @private + */ + _setTileLayout() { + if (!this.rtcCallViewer) { + return; + } + if (!this.el) { + return; + } + if (!this.tileContainerRef.el) { + return; + } + const { width, height } = this.tileContainerRef.el.getBoundingClientRect(); + + const { tileWidth, tileHeight, columnCount } = this._computeTessellation({ + aspectRatio: this.rtcCallViewer.aspectRatio, + containerHeight: height, + containerWidth: width, + tileCount: this.tileContainerRef.el.children.length, + }); + + this.state.tileWidth = tileWidth; + this.state.tileHeight = tileHeight; + this.state.columnCount = columnCount; + } + + /** + * @private + */ + _update() { + this._setTileLayout(); + } + +} + +Object.assign(RtcCallViewer, { + components, + props: { + localId: String, + }, + template: 'mail.RtcCallViewer', +}); + +registerMessagingComponent(RtcCallViewer); diff --git a/addons/mail/static/src/components/rtc_call_viewer/rtc_call_viewer.scss b/addons/mail/static/src/components/rtc_call_viewer/rtc_call_viewer.scss new file mode 100644 index 00000000000..d1235aa8716 --- /dev/null +++ b/addons/mail/static/src/components/rtc_call_viewer/rtc_call_viewer.scss @@ -0,0 +1,114 @@ +// ------------------------------------------------------------------ +// Layout +// ------------------------------------------------------------------ + +.o_RtcCallViewer { + position: relative; + display: flex; + align-items: center; + justify-content: center; + flex-direction: column; + height: 50%; + min-height: 50%; + + &.o-minimized { + height: 20%; + min-height: 20%; + } + + &.o-fullScreen { + position: fixed; + z-index: $zindex-fixed; + top: 0; + left: 0; + width: 100vw; + height: 100vh; + } +} + +.o_RtcCallViewer_controls { + width: 100%; + display: flex; + justify-content: center; + padding-bottom: map-get($spacers, 1); + + &.o-floating { + position: absolute; + padding-bottom: map-get($spacers, 3); + bottom: 0; + } +} + +.o_RtcCallViewer_grid { + height: 100%; + display: flex; + flex-direction: column; + align-items: center; + overflow-y: auto; + overflow-x: hidden; + + &::-webkit-scrollbar { + width: 0.3vw; + } + + &.o-dynamic-sizing { + flex-direction: row; + width: 100%; + overflow-y: hidden; + flex-wrap: wrap; + justify-content: center; + + .o_RtcCallViewer_participantCard { + width: var(--width); + height: var(--height); + min-width: var(--width); + min-height: var(--height); + } + } + + &.o-sidebar { + width: 120px; + min-width: 120px; + } +} + +.o_RtcCallViewer_grid_tile { + width: 100%; + aspect-ratio: 16/9; +} + +.o_RtcCallViewer_mainParticipant { + width: 100%; +} + +.o_RtcCallViewer_mainParticipantContainer { + max-height: 100%; + display: flex; + flex-grow: 1; +} + +.o_RtcCallViewer_participantContainer { + overflow: hidden; + height: 100%; + width: 100%; + display: flex; + justify-content: space-between; +} + +// ------------------------------------------------------------------ +// Style +// ------------------------------------------------------------------ + +.o_RtcCallViewer { + background-color: lighten(black, 10%); +} + +.o_RtcCallViewer_grid { + + &::-webkit-scrollbar { + background: gray('900'); + } + &::-webkit-scrollbar-thumb { + background: gray('700'); + } +} diff --git a/addons/mail/static/src/components/rtc_call_viewer/rtc_call_viewer.xml b/addons/mail/static/src/components/rtc_call_viewer/rtc_call_viewer.xml new file mode 100644 index 00000000000..d167b3e2f3d --- /dev/null +++ b/addons/mail/static/src/components/rtc_call_viewer/rtc_call_viewer.xml @@ -0,0 +1,73 @@ + + + + +
    + + + + + + +
    + +
    + + + +
    +
    + +
    + + + + + + +
    +
    +
    + + + +
    +
    + +
    +
    +
    + + + + + + + + + + + + + + + + + + +
    +
    +
    + +
    \ No newline at end of file diff --git a/addons/mail/static/src/components/rtc_configuration_menu/rtc_configuration_menu.js b/addons/mail/static/src/components/rtc_configuration_menu/rtc_configuration_menu.js new file mode 100644 index 00000000000..32324646162 --- /dev/null +++ b/addons/mail/static/src/components/rtc_configuration_menu/rtc_configuration_menu.js @@ -0,0 +1,93 @@ +/** @odoo-module **/ + +import { registerMessagingComponent } from '@mail/utils/messaging_component'; + +import { browser } from "@web/core/browser/browser"; + +const { Component } = owl; +const { useState } = owl.hooks; + +export class RtcConfigurationMenu extends Component { + + /** + * @override + */ + setup() { + super.setup(); + this.state = useState({ + userDevices: undefined, + }); + } + + async willStart() { + this.state.userDevices = await browser.navigator.mediaDevices.enumerateDevices(); + } + + //-------------------------------------------------------------------------- + // Getters / Setters + //-------------------------------------------------------------------------- + + /** + * @returns {mail.configuration_menu} + */ + get rtcConfigurationMenu() { + return this.messaging && this.messaging.userSetting.rtcConfigurationMenu; + } + + /** + * @returns {mail.user_setting} + */ + get userSetting() { + return this.messaging && this.messaging.userSetting; + } + + //-------------------------------------------------------------------------- + // Handlers + //-------------------------------------------------------------------------- + + /** + * @private + * @param {Event} ev + */ + _onChangeDelay(ev) { + this.rtcConfigurationMenu.onChangeDelay(ev.target.value); + } + + /** + * @private + * @param {Event} ev + */ + _onChangePushToTalk(ev) { + this.rtcConfigurationMenu.onChangePushToTalk(); + } + + /** + * @private + * @param {Event} ev + */ + _onChangeSelectAudioInput(ev) { + this.rtcConfigurationMenu.onChangeSelectAudioInput(ev.target.value); + } + + /** + * @private + * @param {Event} ev + */ + _onChangeThreshold(ev) { + this.rtcConfigurationMenu.onChangeThreshold(ev.target.value); + } + + /** + * @private + * @param {MouseEvent} ev + */ + _onClickRegisterKeyButton() { + this.rtcConfigurationMenu.onClickRegisterKeyButton(); + } +} + +Object.assign(RtcConfigurationMenu, { + template: 'mail.RtcConfigurationMenu', +}); + +registerMessagingComponent(RtcConfigurationMenu); diff --git a/addons/mail/static/src/components/rtc_configuration_menu/rtc_configuration_menu.scss b/addons/mail/static/src/components/rtc_configuration_menu/rtc_configuration_menu.scss new file mode 100644 index 00000000000..89d5eb97ed9 --- /dev/null +++ b/addons/mail/static/src/components/rtc_configuration_menu/rtc_configuration_menu.scss @@ -0,0 +1,97 @@ +// ------------------------------------------------------------------ +// Layout +// ------------------------------------------------------------------ + +.o_RtcConfigurationMenu { + display: flex; + overflow-y: auto; + flex-direction: column; + margin-left: map-get($spacers, 2); + user-select: none; +} + +.o_RtcConfigurationMenu_option { + min-height: 40px; + padding: map-get($spacers, 1); + margin: map-get($spacers, 2); + display: flex; + align-items: center; + flex-wrap: wrap; +} + +.o_RtcConfigurationMenu_option_deviceSelect { + padding: map-get($spacers, 1); + padding-right: map-get($spacers, 3); +} + +.o_RtcConfigurationMenu_option_inputGroup { + display: flex; + width: 100%; +} + +.o_RtcConfigurationMenu_option_inputGroup_input { + flex-grow: 2; +} + +.o_RtcConfigurationMenu_option_inputGroup_value { + padding: map-get($spacers, 1); +} + +.o_RtcConfigurationMenu_option_label { + display: flex; + align-items: center; + flex-wrap: wrap; + max-width: 100%; +} + +.o_RtcConfigurationMenu_option_name { + @include text-truncate(); + margin-inline-end: map-get($spacers, 2); +} + +.o_RtcConfigurationMenu_option_pushToTalkGroup { + display: flex; +} + +.o_RtcConfigurationMenu_option_pushToTalkGroup_key { + padding-left: map-get($spacers, 3); + padding-right: map-get($spacers, 3); + margin-left: map-get($spacers, 1); +} + +// ------------------------------------------------------------------ +// Style +// ------------------------------------------------------------------ + +.o_RtcConfigurationMenu_button { + background: none; + border: none; + outline: none; + + @include hover-focus () { + outline: none; + } + + &:hover { + color: black; + } +} + +.o_RtcConfigurationMenu_option_label { + cursor: pointer; +} + +.o_RtcConfigurationMenu_option_name { + font-weight: bold; +} + +.o_RtcConfigurationMenu_option_pushToTalkGroup_key { + font-size: 1.4em; + font-weight: bold; + border-radius: 3px; + border: 2px solid $o-brand-primary; + + &.o-registering { + border-color: theme-color('danger'); + } +} diff --git a/addons/mail/static/src/components/rtc_configuration_menu/rtc_configuration_menu.xml b/addons/mail/static/src/components/rtc_configuration_menu/rtc_configuration_menu.xml new file mode 100644 index 00000000000..3e30a581af8 --- /dev/null +++ b/addons/mail/static/src/components/rtc_configuration_menu/rtc_configuration_menu.xml @@ -0,0 +1,72 @@ + + + + +
    +
    + +
    +
    + +
    + +
    + + +
    +
    Press a key to register it as the push-to-talk shortcut
    +
    + +
    +
    + +
    + +
    +
    +
    +
    + +
    diff --git a/addons/mail/static/src/components/rtc_controller/rtc_controller.js b/addons/mail/static/src/components/rtc_controller/rtc_controller.js new file mode 100644 index 00000000000..0677eba3283 --- /dev/null +++ b/addons/mail/static/src/components/rtc_controller/rtc_controller.js @@ -0,0 +1,45 @@ +/** @odoo-module **/ + +import { registerMessagingComponent } from '@mail/utils/messaging_component'; + +const { Component } = owl; + +export class RtcController extends Component { + + //-------------------------------------------------------------------------- + // Getters / Setters + //-------------------------------------------------------------------------- + + /** + * @returns {mail.rtc_controller} + */ + get rtcController() { + return this.messaging && this.messaging.models['mail.rtc_controller'].get(this.props.localId); + } + + /** + * @returns {mail.thread} + */ + get rtcSession() { + return this.messaging && this.messaging.mailRtc.currentRtcSession; + } + + /** + * @returns {mail.thread|undefined} + */ + get thread() { + return this.rtcController && this.rtcController.callViewer.threadView.thread; + } + +} + +Object.assign(RtcController, { + props: { + localId: { + type: String, + }, + }, + template: 'mail.RtcController', +}); + +registerMessagingComponent(RtcController); diff --git a/addons/mail/static/src/components/rtc_controller/rtc_controller.scss b/addons/mail/static/src/components/rtc_controller/rtc_controller.scss new file mode 100644 index 00000000000..2f61de847fb --- /dev/null +++ b/addons/mail/static/src/components/rtc_controller/rtc_controller.scss @@ -0,0 +1,84 @@ +// ------------------------------------------------------------------ +// Layout +// ------------------------------------------------------------------ + +.o_RtcController { + display: flex; + justify-content: space-between; +} + +.o_RtcController_button { + margin: map-get($spacers, 1); + padding: map-get($spacers, 4); + display: flex; +} + +.o_RtcController_button_iconWrapper { + display: flex; + width: map-get($spacers, 4); + height: map-get($spacers, 4); + justify-content: center; + flex-direction: column; + align-items: center; +} + +.o_RtcController_buttons { + display: flex; + align-items: center; + flex-wrap: wrap; +} + +.o-small { + .o_RtcController_button_iconWrapper { + width: map-get($spacers, 3); + height: map-get($spacers, 3); + } + .o_RtcController_button { + padding: map-get($spacers, 3); + } +} + +// ------------------------------------------------------------------ +// Style +// ------------------------------------------------------------------ + +.o_RtcController_button { + color: white; + background: none; + border: none; + outline: none; + border-radius: 50%; + background-color: gray('800'); + + &:hover { + background-color: gray('700'); + } + + &.o-active { + opacity: 1; + } + + @include hover-focus () { + outline: none; + } +} + +.o_RtcController_callToggle { + background-color: theme-color('success'); + + &:hover { + background-color: darken(theme-color('success'), 20%); + } + + &.o-active { + background-color: theme-color('danger'); + + &:hover { + background-color: darken(theme-color('danger'), 20%); + } + } +} + +.o_RtcController_videoButton.o-active { + color: theme-color('success'); +} diff --git a/addons/mail/static/src/components/rtc_controller/rtc_controller.xml b/addons/mail/static/src/components/rtc_controller/rtc_controller.xml new file mode 100644 index 00000000000..55077a4045e --- /dev/null +++ b/addons/mail/static/src/components/rtc_controller/rtc_controller.xml @@ -0,0 +1,121 @@ + + + + +
    + +
    + + Unmute + Mute + + Undeafen + Deafen + + Stop camera + Turn camera on + + Stop screen sharing + Share screen + + + + + + + + + + + + + + + + Disconnect + Join Call + + +
    +
    +
    +
    + +
    \ No newline at end of file diff --git a/addons/mail/static/src/components/rtc_invitation_card/rtc_invitation_card.js b/addons/mail/static/src/components/rtc_invitation_card/rtc_invitation_card.js new file mode 100644 index 00000000000..0a1b8ed44ac --- /dev/null +++ b/addons/mail/static/src/components/rtc_invitation_card/rtc_invitation_card.js @@ -0,0 +1,58 @@ +/** @odoo-module **/ + +import { registerMessagingComponent } from '@mail/utils/messaging_component'; + +const { Component } = owl; + +export class RtcInvitationCard extends Component { + + //-------------------------------------------------------------------------- + // Getters / Setters + //-------------------------------------------------------------------------- + + /** + * @returns {mail.thread} + */ + get thread() { + return this.messaging.models['mail.thread'].get(this.props.threadLocalId); + } + + //-------------------------------------------------------------------------- + // Handlers + //-------------------------------------------------------------------------- + + /** + * @private + * @param {MouseEvent} ev + */ + async _onClickAccept(ev) { + this.thread.open(); + await this.thread.toggleCall(); + } + + /** + * @private + * @param {MouseEvent} ev + */ + _onClickAvatar(ev) { + this.thread.open(); + } + + /** + * @private + * @param {MouseEvent} ev + */ + _onClickRefuse(ev) { + this.thread.leaveCall(); + } + +} + +Object.assign(RtcInvitationCard, { + props: { + threadLocalId: String, + }, + template: 'mail.RtcInvitationCard', +}); + +registerMessagingComponent(RtcInvitationCard); diff --git a/addons/mail/static/src/components/rtc_invitation_card/rtc_invitation_card.scss b/addons/mail/static/src/components/rtc_invitation_card/rtc_invitation_card.scss new file mode 100644 index 00000000000..fd242c92603 --- /dev/null +++ b/addons/mail/static/src/components/rtc_invitation_card/rtc_invitation_card.scss @@ -0,0 +1,95 @@ +// ------------------------------------------------------------------ +// Layout +// ------------------------------------------------------------------ + +.o_RtcInvitationCard { + display: flex; + flex-direction: column; + margin: map-get($spacers, 2); + padding: map-get($spacers, 5); +} + +.o_RtcInvitationCard_buttonList { + width: 100%; + display: flex; + margin-top: map-get($spacers, 4); + justify-content: space-around; + align-items: center; +} + +.o_RtcInvitationCard_buttonList_button { + padding: map-get($spacers, 2); +} + +.o_RtcInvitationCard_buttonList_button_icon { + margin: map-get($spacers, 3); +} + +.o_RtcInvitationCard_partner_info { + display: flex; + width: 130px; + flex-direction: column; + justify-content: space-around; + align-items: center; + white-space: nowrap; +} + +.o_RtcInvitationCard_partner_info_image { + margin-bottom: map-get($spacers, 2); + width: 70%; + height: 70%; +} + +.o_RtcInvitationCard_partner_info_name { + overflow: hidden; + width: 100%; +} + +// ------------------------------------------------------------------ +// Style +// ------------------------------------------------------------------ + +.o_RtcInvitationCard { + border-radius: 3px; + background-color: gray('900'); + border: 1px solid black; +} + +.o_RtcInvitationCard_buttonList_button { + border-radius: 100%; + cursor: pointer; + user-select: none; + border: none; +} + +.o_RtcInvitationCard_buttonList_accept { + background-color: theme-color('success'); + + &:hover { + background-color: darken(theme-color('success'), 10%); + } +} + +.o_RtcInvitationCard_buttonList_refuse { + background-color: theme-color('danger'); + + &:hover { + background-color: darken(theme-color('danger'), 10%); + } +} + +.o_RtcInvitationCard_partner_info_image { + border: 3px solid gray; + cursor: pointer; +} + +.o_RtcInvitationCard_partner_info_name { + font-weight: bold; + @include text-truncate(); + text-align: center; +} + +.o_RtcInvitationCard_partner_info_text { + font-style: italic; + opacity: 0.9; +} diff --git a/addons/mail/static/src/components/rtc_invitation_card/rtc_invitation_card.xml b/addons/mail/static/src/components/rtc_invitation_card/rtc_invitation_card.xml new file mode 100644 index 00000000000..b1655503761 --- /dev/null +++ b/addons/mail/static/src/components/rtc_invitation_card/rtc_invitation_card.xml @@ -0,0 +1,33 @@ + + + + +
    + +
    + Avatar + + Incoming Call... +
    +
    +
    +
    + +
    +
    + +
    +
    +
    +
    + +
    diff --git a/addons/mail/static/src/components/rtc_invitations/rtc_invitations.js b/addons/mail/static/src/components/rtc_invitations/rtc_invitations.js new file mode 100644 index 00000000000..c05cfd26103 --- /dev/null +++ b/addons/mail/static/src/components/rtc_invitations/rtc_invitations.js @@ -0,0 +1,27 @@ +/** @odoo-module **/ + +import { registerMessagingComponent } from '@mail/utils/messaging_component'; + +const { Component } = owl; + +export class RtcInvitations extends Component { + + //-------------------------------------------------------------------------- + // Getters / Setters + //-------------------------------------------------------------------------- + + /** + * @returns {mail.thread[]} + */ + get threads() { + return this.messaging && this.messaging.ringingThreads; + } + +} + +Object.assign(RtcInvitations, { + props: {}, + template: 'mail.RtcInvitations', +}); + +registerMessagingComponent(RtcInvitations); diff --git a/addons/mail/static/src/components/rtc_invitations/rtc_invitations.scss b/addons/mail/static/src/components/rtc_invitations/rtc_invitations.scss new file mode 100644 index 00000000000..2692ca19cda --- /dev/null +++ b/addons/mail/static/src/components/rtc_invitations/rtc_invitations.scss @@ -0,0 +1,13 @@ +// ------------------------------------------------------------------ +// Layout +// ------------------------------------------------------------------ + +.o_RtcInvitations { + display: flex; + flex-direction: column; + position: absolute; + top: 0px; + right: 0px; + padding: map-get($spacers, 2); + z-index: $zindex-modal; +} diff --git a/addons/mail/static/src/components/rtc_invitations/rtc_invitations.xml b/addons/mail/static/src/components/rtc_invitations/rtc_invitations.xml new file mode 100644 index 00000000000..e3b91722614 --- /dev/null +++ b/addons/mail/static/src/components/rtc_invitations/rtc_invitations.xml @@ -0,0 +1,14 @@ + + + + +
    + + + + + +
    +
    + +
    diff --git a/addons/mail/static/src/components/rtc_layout_menu/rtc_layout_menu.js b/addons/mail/static/src/components/rtc_layout_menu/rtc_layout_menu.js new file mode 100644 index 00000000000..7baf1429ea3 --- /dev/null +++ b/addons/mail/static/src/components/rtc_layout_menu/rtc_layout_menu.js @@ -0,0 +1,38 @@ +/** @odoo-module **/ + +import { registerMessagingComponent } from '@mail/utils/messaging_component'; +import { useComponentToModel } from '@mail/component_hooks/use_component_to_model/use_component_to_model'; + +const { Component } = owl; + +export class RtcLayoutMenu extends Component { + + /** + * @override + */ + setup() { + super.setup(); + useComponentToModel({ fieldName: 'component', modelName: 'mail.rtc_layout_menu', propNameAsRecordLocalId: 'localId' }); + } + + //-------------------------------------------------------------------------- + // Getters / Setters + //-------------------------------------------------------------------------- + + /** + * @returns {mail.rtc_layout_menu} + */ + get layoutMenu() { + return this.messaging && this.messaging.models['mail.rtc_layout_menu'].get(this.props.localId); + } + +} + +Object.assign(RtcLayoutMenu, { + props: { + localId: String, + }, + template: 'mail.RtcLayoutMenu', +}); + +registerMessagingComponent(RtcLayoutMenu); diff --git a/addons/mail/static/src/components/rtc_layout_menu/rtc_layout_menu.scss b/addons/mail/static/src/components/rtc_layout_menu/rtc_layout_menu.scss new file mode 100644 index 00000000000..60659192d97 --- /dev/null +++ b/addons/mail/static/src/components/rtc_layout_menu/rtc_layout_menu.scss @@ -0,0 +1,55 @@ +// ------------------------------------------------------------------ +// Layout +// ------------------------------------------------------------------ + +.o_RtcLayoutMenu { + display: flex; + flex-direction: column; + padding: map-get($spacers, 1); +} + +.o_RtcLayoutMenu_input_text { + @include text-truncate(); +} + +.o_RtcLayoutMenu_separator { + width: 100%; +} + +.o_RtcLayoutMenu_radio { + display: flex; + align-items: center; + justify-content: space-between; + font-size: 1.3em; +} + +.o_RtcLayoutMenu_radio_icon { + margin-inline-end: map-get($spacers, 1); +} + +.o_RtcLayoutMenu_radio_input { + margin: map-get($spacers, 3); +} + +// ------------------------------------------------------------------ +// Style +// ------------------------------------------------------------------ + +.o_RtcLayoutMenu_radio { + cursor: pointer; + border-radius: 5px; + + &:hover { + background-color: gray('100'); + box-shadow: 0px 0px 1px 1px gray('300') inset; + } + + &:active { + background-color: gray('200'); + box-shadow: 0px 0px 1px 1px gray('400') inset; + } +} + +.o_RtcLayoutMenu_separator { + background-color: $border-color; +} diff --git a/addons/mail/static/src/components/rtc_layout_menu/rtc_layout_menu.xml b/addons/mail/static/src/components/rtc_layout_menu/rtc_layout_menu.xml new file mode 100644 index 00000000000..8feee44777f --- /dev/null +++ b/addons/mail/static/src/components/rtc_layout_menu/rtc_layout_menu.xml @@ -0,0 +1,118 @@ + + + + +
    + + + + +
    +
    + + + +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    diff --git a/addons/mail/static/src/components/rtc_option_list/rtc_option_list.js b/addons/mail/static/src/components/rtc_option_list/rtc_option_list.js new file mode 100644 index 00000000000..601164a8729 --- /dev/null +++ b/addons/mail/static/src/components/rtc_option_list/rtc_option_list.js @@ -0,0 +1,38 @@ +/** @odoo-module **/ + +import { registerMessagingComponent } from '@mail/utils/messaging_component'; +import { useComponentToModel } from '@mail/component_hooks/use_component_to_model/use_component_to_model'; + +const { Component } = owl; + +export class RtcOptionList extends Component { + + /** + * @override + */ + setup() { + super.setup(); + useComponentToModel({ fieldName: 'component', modelName: 'mail.rtc_option_list', propNameAsRecordLocalId: 'localId' }); + } + + //-------------------------------------------------------------------------- + // Getters / Setters + //-------------------------------------------------------------------------- + + /** + * @returns {mail.rtc_option_list} + */ + get rtcOptionList() { + return this.messaging && this.messaging.models['mail.rtc_option_list'].get(this.props.localId); + } + +} + +Object.assign(RtcOptionList, { + props: { + localId: String, + }, + template: 'mail.RtcOptionList', +}); + +registerMessagingComponent(RtcOptionList); diff --git a/addons/mail/static/src/components/rtc_option_list/rtc_option_list.scss b/addons/mail/static/src/components/rtc_option_list/rtc_option_list.scss new file mode 100644 index 00000000000..34d57be7efd --- /dev/null +++ b/addons/mail/static/src/components/rtc_option_list/rtc_option_list.scss @@ -0,0 +1,51 @@ +// ------------------------------------------------------------------ +// Layout +// ------------------------------------------------------------------ + +.o_RtcOptionList { + display: flex; + flex-direction: column; +} + +.o_RtcOptionList_button { + display: flex; + margin: map-get($spacers, 1); + align-items: center; + color: gray('800'); +} + +.o_RtcOptionList_button_icon { + margin: map-get($spacers, 1); + padding: map-get($spacers, 1); +} + +.o_RtcOptionList_button_text { + @include text-truncate(); +} + +// ------------------------------------------------------------------ +// Style +// ------------------------------------------------------------------ + +.o_RtcOptionList_button { + background: none; + border: none; + outline: none; + cursor: pointer; + border-radius: 5px; + color: gray('800'); + + &:hover { + background-color: gray('100'); + box-shadow: 0px 0px 1px 1px gray('300') inset; + } + + &:active { + background-color: gray('200'); + box-shadow: 0px 0px 1px 1px gray('400') inset; + } + + @include hover-focus () { + outline: none; + } +} diff --git a/addons/mail/static/src/components/rtc_option_list/rtc_option_list.xml b/addons/mail/static/src/components/rtc_option_list/rtc_option_list.xml new file mode 100644 index 00000000000..92f05c3b262 --- /dev/null +++ b/addons/mail/static/src/components/rtc_option_list/rtc_option_list.xml @@ -0,0 +1,23 @@ + + + + +
    + + + + + +
    +
    + +
    diff --git a/addons/mail/static/src/components/rtc_video/rtc_video.js b/addons/mail/static/src/components/rtc_video/rtc_video.js new file mode 100644 index 00000000000..9b0b2df55c4 --- /dev/null +++ b/addons/mail/static/src/components/rtc_video/rtc_video.js @@ -0,0 +1,80 @@ +/** @odoo-module **/ + +import { registerMessagingComponent } from '@mail/utils/messaging_component'; +import { useUpdate } from '@mail/component_hooks/use_update/use_update'; + +const { Component } = owl; +const { useRef } = owl.hooks; + +export class RtcVideo extends Component { + + /** + * @override + */ + setup() { + super.setup(); + useUpdate({ func: () => this._update() }); + this._videoRef = useRef("video"); + } + + //-------------------------------------------------------------------------- + // Getters / Setters + //-------------------------------------------------------------------------- + + /** + * @returns {mail.thread|undefined} + */ + get rtcSession() { + return this.messaging.models["mail.rtc_session"].get( + this.props.rtcSessionLocalId + ); + } + + //-------------------------------------------------------------------------- + // Private + //-------------------------------------------------------------------------- + + _update() { + this._loadVideo(); + } + + /** + * Since it is not possible to directly put a mediaStreamObject as the src + * or src-object of the template, the video src is manually inserted into + * the DOM. + * + */ + _loadVideo() { + if (!this._videoRef) { + return; + } + if (!this.rtcSession || !this.rtcSession.videoStream) { + this._videoRef.el.srcObject = undefined; + return; + } + this._videoRef.el.srcObject = this.rtcSession.videoStream; + } + + //-------------------------------------------------------------------------- + // Handlers + //-------------------------------------------------------------------------- + + /** + * @private + * @param {Event} ev + */ + async _onVideoLoadedMetaData(ev) { + await ev.target.play(); + } +} + +Object.assign(RtcVideo, { + props: { + rtcSessionLocalId: { + type: String, + }, + }, + template: 'mail.RtcVideo', +}); + +registerMessagingComponent(RtcVideo); diff --git a/addons/mail/static/src/components/rtc_video/rtc_video.scss b/addons/mail/static/src/components/rtc_video/rtc_video.scss new file mode 100644 index 00000000000..10d46e2e150 --- /dev/null +++ b/addons/mail/static/src/components/rtc_video/rtc_video.scss @@ -0,0 +1,18 @@ +// ------------------------------------------------------------------ +// Layout +// ------------------------------------------------------------------ + +.o_RtcVideo_video { + width: 100%; + height: 100%; +} + +// ------------------------------------------------------------------ +// Style +// ------------------------------------------------------------------ + +.o_RtcVideo_video { + background-color: black; + border-radius: $o-mail-rounded-rectangle-border-radius-sm; + cursor: pointer; +} diff --git a/addons/mail/static/src/components/rtc_video/rtc_video.xml b/addons/mail/static/src/components/rtc_video/rtc_video.xml new file mode 100644 index 00000000000..14248f3b0d6 --- /dev/null +++ b/addons/mail/static/src/components/rtc_video/rtc_video.xml @@ -0,0 +1,10 @@ + + + + + + + diff --git a/addons/mail/static/src/components/thread_view/thread_view.scss b/addons/mail/static/src/components/thread_view/thread_view.scss index b054d47fb45..9ae574eb052 100644 --- a/addons/mail/static/src/components/thread_view/thread_view.scss +++ b/addons/mail/static/src/components/thread_view/thread_view.scss @@ -49,6 +49,10 @@ flex: 1 1 auto; } +.o_ThreadView_videoRoom { + min-height: 60%; +} + // ------------------------------------------------------------------ // Style // ------------------------------------------------------------------ diff --git a/addons/mail/static/src/components/thread_view/thread_view.xml b/addons/mail/static/src/components/thread_view/thread_view.xml index 12bad72b27c..dcfdc41184a 100644 --- a/addons/mail/static/src/components/thread_view/thread_view.xml +++ b/addons/mail/static/src/components/thread_view/thread_view.xml @@ -9,6 +9,9 @@
    + + +
    Loading... diff --git a/addons/mail/static/src/components/thread_view_topbar/thread_view_topbar.js b/addons/mail/static/src/components/thread_view_topbar/thread_view_topbar.js index ae197e2de35..b3dc357da48 100644 --- a/addons/mail/static/src/components/thread_view_topbar/thread_view_topbar.js +++ b/addons/mail/static/src/components/thread_view_topbar/thread_view_topbar.js @@ -29,6 +29,28 @@ export class ThreadViewTopbar extends Component { return this.messaging && this.messaging.models['mail.thread_view_topbar'].get(this.props.localId); } + //-------------------------------------------------------------------------- + // Handlers + //-------------------------------------------------------------------------- + + /** + * @private + * @param {MouseEvent} ev + */ + async _onClickPhone(ev) { + await this.threadViewTopBar.thread.toggleCall(); + } + + /** + * @private + * @param {MouseEvent} ev + */ + async _onClickCamera(ev) { + await this.threadViewTopBar.thread.toggleCall({ + startWithVideo: true, + }); + } + } Object.assign(ThreadViewTopbar, { diff --git a/addons/mail/static/src/components/thread_view_topbar/thread_view_topbar.xml b/addons/mail/static/src/components/thread_view_topbar/thread_view_topbar.xml index 47cb89b819d..7f0d5818945 100644 --- a/addons/mail/static/src/components/thread_view_topbar/thread_view_topbar.xml +++ b/addons/mail/static/src/components/thread_view_topbar/thread_view_topbar.xml @@ -49,6 +49,14 @@ + + + +