From 56ebed5445e59e5bc6381a0413b089d73d981d9a Mon Sep 17 00:00:00 2001 From: Kenneth Kehl <@kkehl@flexion.us> Date: Fri, 13 Dec 2024 14:40:37 -0800 Subject: [PATCH 01/15] switch to log insights for delivery receipts --- app/celery/scheduled_tasks.py | 9 ++++ app/clients/cloudwatch/aws_cloudwatch.py | 65 ++++++++++++++++++++++++ app/dao/notifications_dao.py | 24 +++++++++ 3 files changed, 98 insertions(+) diff --git a/app/celery/scheduled_tasks.py b/app/celery/scheduled_tasks.py index 3597bdbb7..f884de834 100644 --- a/app/celery/scheduled_tasks.py +++ b/app/celery/scheduled_tasks.py @@ -11,6 +11,7 @@ process_job, process_row, ) +from app.clients.cloudwatch.aws_cloudwatch import AwsCloudwatchClient from app.config import QueueNames from app.dao.invited_org_user_dao import ( delete_org_invitations_created_more_than_two_days_ago, @@ -231,3 +232,11 @@ def check_for_services_with_high_failure_rates_or_sending_to_tv_numbers(): technical_ticket=True, ) zendesk_client.send_ticket_to_zendesk(ticket) + + +@notify_celery.task(name="process_delivery_receipts_first_wave") +def process_delivery_receipts_first_wave(): + cloudwatch = AwsCloudwatchClient() + start_time = utc_now() - timedelta(hours=1) + end_time = utc_now() + receipts = cloudwatch.check_delivery_receipts(start_time, end_time) diff --git a/app/clients/cloudwatch/aws_cloudwatch.py b/app/clients/cloudwatch/aws_cloudwatch.py index 36bcf5dca..c914501bc 100644 --- a/app/clients/cloudwatch/aws_cloudwatch.py +++ b/app/clients/cloudwatch/aws_cloudwatch.py @@ -2,12 +2,14 @@ import os import re from datetime import timedelta +from time import sleep from boto3 import client from flask import current_app from app.clients import AWS_CLIENT_CONFIG, Client from app.cloudfoundry_config import cloud_config +from app.dao.notifications_dao import dao_update_delivery_receipts from app.exceptions import NotificationTechnicalFailureException from app.utils import hilite, utc_now @@ -108,6 +110,7 @@ def warn_if_dev_is_opted_out(self, provider_response, notification_id): return logline return None + # DEPRECATED def check_sms(self, message_id, notification_id, created_at): region = cloud_config.sns_region # TODO this clumsy approach to getting the account number will be fixed as part of notify-api #258 @@ -165,3 +168,65 @@ def check_sms(self, message_id, notification_id, created_at): raise NotificationTechnicalFailureException( f"No event found for message_id {message_id} notification_id {notification_id}" ) + + +def do_log_insights(self): + region = cloud_config.sns_region + account_number = self._extract_account_number(cloud_config.ses_domain_arn) + + log_group_name = f"sns/{region}/{account_number[4]}/DirectPublishToPhoneNumber" + log_group_name_failed = ( + f"sns/{region}/{account_number[4]}/DirectPublishToPhoneNumber/Failed" + ) + + query = """ + fields @timestamp, status, delivery.providerResponse, delivery.destination, notification.messageId, delivery.phoneCarrier + | sort @timestamp asc + """ + start = utc_now() - timedelta(hours=1) + end = utc_now() + + response = client._client.start_query( + logGroupName=log_group_name, + startTime=int(start.timestamp()), + endTime=int(end.timestamp()), + queryString=query, + ) + query_id = response["queryId"] + while True: + result = client._client.get_query_results(queryId=query_id) + if result["status"] == "Complete": + break + sleep(1) + + delivery_receipts = [] + for log in result["results"]: + receipt = {field["field"]: field["value"] for field in log} + delivery_receipts.append(receipt) + print(receipt) + + delivered = delivery_receipts + + response = client._client.start_query( + logGroupName=log_group_name_failed, + startTime=int(start.timestamp()), + endTime=int(end.timestamp()), + queryString=query, + ) + query_id = response["queryId"] + while True: + result = client._client.get_query_results(queryId=query_id) + if result["status"] == "Complete": + break + sleep(1) + + delivery_receipts = [] + for log in result["results"]: + receipt = {field["field"]: field["value"] for field in log} + delivery_receipts.append(receipt) + print(receipt) + + failed = delivery_receipts + + dao_update_delivery_receipts(delivered) + dao_update_delivery_receipts(failed) diff --git a/app/dao/notifications_dao.py b/app/dao/notifications_dao.py index 052242644..d676f79f7 100644 --- a/app/dao/notifications_dao.py +++ b/app/dao/notifications_dao.py @@ -707,3 +707,27 @@ def get_service_ids_with_notifications_on_date(notification_type, date): union(notification_table_query, ft_status_table_query).subquery() ).distinct() } + + +def dao_update_delivery_receipts(receipts): + id_to_status = {r["notification.messageId"]: r["status"] for r in receipts} + id_to_carrier = { + r["notification.messageId"]: r["delivery.phoneCarrier"] for r in receipts + } + id_to_provider_response = { + r["notification.messageId"]: r["delivery.providerResponse"] for r in receipts + } + id_to_timestamp = {r["notification.messageId"]: r["@timestamp"] for r in receipts} + + stmt = ( + update(Notification) + .where(Notification.c.message_id.in_(id_to_carrier.keys())) + .values( + carrier=case(id_to_carrier), + status=case(id_to_status), + notification_status=case(id_to_status), + sent_at=case(id_to_timestamp), + ) + ) + db.session.execute(stmt) + db.session.commit() From 7529ae0153d949c50e6d2b7d54323b8e4f2d7418 Mon Sep 17 00:00:00 2001 From: Kenneth Kehl <@kkehl@flexion.us> Date: Fri, 13 Dec 2024 15:04:18 -0800 Subject: [PATCH 02/15] more --- app/celery/provider_tasks.py | 103 +--------------------- app/clients/cloudwatch/aws_cloudwatch.py | 59 ------------- tests/app/celery/test_provider_tasks.py | 106 +---------------------- 3 files changed, 4 insertions(+), 264 deletions(-) diff --git a/app/celery/provider_tasks.py b/app/celery/provider_tasks.py index a75a68c96..3bdd2d9c0 100644 --- a/app/celery/provider_tasks.py +++ b/app/celery/provider_tasks.py @@ -1,107 +1,19 @@ import json import os -from datetime import timedelta -from botocore.exceptions import ClientError from flask import current_app from sqlalchemy.orm.exc import NoResultFound -from app import aws_cloudwatch_client, notify_celery, redis_store +from app import notify_celery, redis_store from app.clients.email import EmailClientNonRetryableException from app.clients.email.aws_ses import AwsSesClientThrottlingSendRateException from app.clients.sms import SmsClientResponseException from app.config import Config, QueueNames from app.dao import notifications_dao -from app.dao.notifications_dao import ( - sanitize_successful_notification_by_id, - update_notification_status_by_id, -) +from app.dao.notifications_dao import update_notification_status_by_id from app.delivery import send_to_providers from app.enums import NotificationStatus from app.exceptions import NotificationTechnicalFailureException -from app.utils import utc_now - -# This is the amount of time to wait after sending an sms message before we check the aws logs and look for delivery -# receipts -DELIVERY_RECEIPT_DELAY_IN_SECONDS = 30 - - -@notify_celery.task( - bind=True, - name="check_sms_delivery_receipt", - max_retries=48, - default_retry_delay=300, -) -def check_sms_delivery_receipt(self, message_id, notification_id, sent_at): - """ - This is called after deliver_sms to check the status of the message. This uses the same number of - retries and the same delay period as deliver_sms. In addition, this fires five minutes after - deliver_sms initially. So the idea is that most messages will succeed and show up in the logs quickly. - Other message will resolve successfully after a retry or to. A few will fail but it will take up to - 4 hours to know for sure. The call to check_sms will raise an exception if neither a success nor a - failure appears in the cloudwatch logs, so this should keep retrying until the log appears, or until - we run out of retries. - """ - # TODO the localstack cloudwatch doesn't currently have our log groups. Possibly create them with awslocal? - if aws_cloudwatch_client.is_localstack(): - status = "success" - provider_response = "this is a fake successful localstack sms message" - carrier = "unknown" - else: - try: - status, provider_response, carrier = aws_cloudwatch_client.check_sms( - message_id, notification_id, sent_at - ) - except NotificationTechnicalFailureException as ntfe: - provider_response = "Unable to find carrier response -- still looking" - status = "pending" - carrier = "" - update_notification_status_by_id( - notification_id, - status, - carrier=carrier, - provider_response=provider_response, - ) - raise self.retry(exc=ntfe) - except ClientError as err: - # Probably a ThrottlingException but could be something else - error_code = err.response["Error"]["Code"] - provider_response = ( - f"{error_code} while checking sms receipt -- still looking" - ) - status = "pending" - carrier = "" - update_notification_status_by_id( - notification_id, - status, - carrier=carrier, - provider_response=provider_response, - ) - raise self.retry(exc=err) - - if status == "success": - status = NotificationStatus.DELIVERED - elif status == "failure": - status = NotificationStatus.FAILED - # if status is not success or failure the client raised an exception and this method will retry - - if status == NotificationStatus.DELIVERED: - sanitize_successful_notification_by_id( - notification_id, carrier=carrier, provider_response=provider_response - ) - current_app.logger.info( - f"Sanitized notification {notification_id} that was successfully delivered" - ) - else: - update_notification_status_by_id( - notification_id, - status, - carrier=carrier, - provider_response=provider_response, - ) - current_app.logger.info( - f"Updated notification {notification_id} with response '{provider_response}'" - ) @notify_celery.task( @@ -127,17 +39,8 @@ def deliver_sms(self, notification_id): ansi_green + f"AUTHENTICATION CODE: {notification.content}" + ansi_reset ) # Code branches off to send_to_providers.py - message_id = send_to_providers.send_sms_to_provider(notification) + send_to_providers.send_sms_to_provider(notification) - # DEPRECATED - # We have to put it in UTC. For other timezones, the delay - # will be ignored and it will fire immediately (although this probably only affects developer testing) - my_eta = utc_now() + timedelta(seconds=DELIVERY_RECEIPT_DELAY_IN_SECONDS) - check_sms_delivery_receipt.apply_async( - [message_id, notification_id, notification.created_at], - eta=my_eta, - queue=QueueNames.CHECK_SMS, - ) except Exception as e: update_notification_status_by_id( notification_id, diff --git a/app/clients/cloudwatch/aws_cloudwatch.py b/app/clients/cloudwatch/aws_cloudwatch.py index c914501bc..9bb52ea88 100644 --- a/app/clients/cloudwatch/aws_cloudwatch.py +++ b/app/clients/cloudwatch/aws_cloudwatch.py @@ -110,65 +110,6 @@ def warn_if_dev_is_opted_out(self, provider_response, notification_id): return logline return None - # DEPRECATED - def check_sms(self, message_id, notification_id, created_at): - region = cloud_config.sns_region - # TODO this clumsy approach to getting the account number will be fixed as part of notify-api #258 - account_number = self._extract_account_number(cloud_config.ses_domain_arn) - - time_now = utc_now() - log_group_name = f"sns/{region}/{account_number[4]}/DirectPublishToPhoneNumber" - filter_pattern = '{$.notification.messageId="XXXXX"}' - filter_pattern = filter_pattern.replace("XXXXX", message_id) - all_log_events = self._get_log(filter_pattern, log_group_name, created_at) - if all_log_events and len(all_log_events) > 0: - event = all_log_events[0] - message = json.loads(event["message"]) - self.warn_if_dev_is_opted_out( - message["delivery"]["providerResponse"], notification_id - ) - # Here we map the answer from aws to the message_id. - # Previously, in send_to_providers, we mapped the job_id and row number - # to the message id. And on the admin side we mapped the csv filename - # to the job_id. So by tracing through all the logs we can go: - # filename->job_id->message_id->what really happened - current_app.logger.info( - hilite(f"DELIVERED: {message} for message_id {message_id}") - ) - return ( - "success", - message["delivery"]["providerResponse"], - message["delivery"].get("phoneCarrier", "Unknown Carrier"), - ) - - log_group_name = ( - f"sns/{region}/{account_number[4]}/DirectPublishToPhoneNumber/Failure" - ) - all_failed_events = self._get_log(filter_pattern, log_group_name, created_at) - if all_failed_events and len(all_failed_events) > 0: - event = all_failed_events[0] - message = json.loads(event["message"]) - self.warn_if_dev_is_opted_out( - message["delivery"]["providerResponse"], notification_id - ) - - current_app.logger.info( - hilite(f"FAILED: {message} for message_id {message_id}") - ) - return ( - "failure", - message["delivery"]["providerResponse"], - message["delivery"].get("phoneCarrier", "Unknown Carrier"), - ) - - if time_now > (created_at + timedelta(hours=3)): - # see app/models.py Notification. This message corresponds to "permanent-failure", - # but we are copy/pasting here to avoid circular imports. - return "failure", "Unable to find carrier response." - raise NotificationTechnicalFailureException( - f"No event found for message_id {message_id} notification_id {notification_id}" - ) - def do_log_insights(self): region = cloud_config.sns_region diff --git a/tests/app/celery/test_provider_tasks.py b/tests/app/celery/test_provider_tasks.py index 80d5a0d7e..e16e9c54b 100644 --- a/tests/app/celery/test_provider_tasks.py +++ b/tests/app/celery/test_provider_tasks.py @@ -7,11 +7,7 @@ import app from app.celery import provider_tasks -from app.celery.provider_tasks import ( - check_sms_delivery_receipt, - deliver_email, - deliver_sms, -) +from app.celery.provider_tasks import deliver_email, deliver_sms from app.clients.email import EmailClientNonRetryableException from app.clients.email.aws_ses import ( AwsSesClientException, @@ -27,110 +23,10 @@ def test_should_have_decorated_tasks_functions(): assert deliver_email.__wrapped__.__name__ == "deliver_email" -def test_should_check_delivery_receipts_success(sample_notification, mocker): - mocker.patch("app.delivery.send_to_providers.send_sms_to_provider") - mocker.patch( - "app.celery.provider_tasks.aws_cloudwatch_client.is_localstack", - return_value=False, - ) - mocker.patch( - "app.celery.provider_tasks.aws_cloudwatch_client.check_sms", - return_value=("success", "okay", "AT&T"), - ) - mock_sanitize = mocker.patch( - "app.celery.provider_tasks.sanitize_successful_notification_by_id" - ) - check_sms_delivery_receipt( - "message_id", sample_notification.id, "2024-10-20 00:00:00+0:00" - ) - # This call should be made if the message was successfully delivered - mock_sanitize.assert_called_once() - - -def test_should_check_delivery_receipts_failure(sample_notification, mocker): - mocker.patch("app.delivery.send_to_providers.send_sms_to_provider") - mocker.patch( - "app.celery.provider_tasks.aws_cloudwatch_client.is_localstack", - return_value=False, - ) - mock_update = mocker.patch( - "app.celery.provider_tasks.update_notification_status_by_id" - ) - mocker.patch( - "app.celery.provider_tasks.aws_cloudwatch_client.check_sms", - return_value=("failure", "not okay", "AT&T"), - ) - mock_sanitize = mocker.patch( - "app.celery.provider_tasks.sanitize_successful_notification_by_id" - ) - check_sms_delivery_receipt( - "message_id", sample_notification.id, "2024-10-20 00:00:00+0:00" - ) - mock_sanitize.assert_not_called() - mock_update.assert_called_once() - - -def test_should_check_delivery_receipts_client_error(sample_notification, mocker): - mocker.patch("app.delivery.send_to_providers.send_sms_to_provider") - mocker.patch( - "app.celery.provider_tasks.aws_cloudwatch_client.is_localstack", - return_value=False, - ) - mock_update = mocker.patch( - "app.celery.provider_tasks.update_notification_status_by_id" - ) - error_response = {"Error": {"Code": "SomeCode", "Message": "Some Message"}} - operation_name = "SomeOperation" - mocker.patch( - "app.celery.provider_tasks.aws_cloudwatch_client.check_sms", - side_effect=ClientError(error_response, operation_name), - ) - mock_sanitize = mocker.patch( - "app.celery.provider_tasks.sanitize_successful_notification_by_id" - ) - try: - check_sms_delivery_receipt( - "message_id", sample_notification.id, "2024-10-20 00:00:00+0:00" - ) - - assert 1 == 0 - except ClientError: - mock_sanitize.assert_not_called() - mock_update.assert_called_once() - - -def test_should_check_delivery_receipts_ntfe(sample_notification, mocker): - mocker.patch("app.delivery.send_to_providers.send_sms_to_provider") - mocker.patch( - "app.celery.provider_tasks.aws_cloudwatch_client.is_localstack", - return_value=False, - ) - mock_update = mocker.patch( - "app.celery.provider_tasks.update_notification_status_by_id" - ) - mocker.patch( - "app.celery.provider_tasks.aws_cloudwatch_client.check_sms", - side_effect=NotificationTechnicalFailureException(), - ) - mock_sanitize = mocker.patch( - "app.celery.provider_tasks.sanitize_successful_notification_by_id" - ) - try: - check_sms_delivery_receipt( - "message_id", sample_notification.id, "2024-10-20 00:00:00+0:00" - ) - - assert 1 == 0 - except NotificationTechnicalFailureException: - mock_sanitize.assert_not_called() - mock_update.assert_called_once() - - def test_should_call_send_sms_to_provider_from_deliver_sms_task( sample_notification, mocker ): mocker.patch("app.delivery.send_to_providers.send_sms_to_provider") - mocker.patch("app.celery.provider_tasks.check_sms_delivery_receipt") deliver_sms(sample_notification.id) app.delivery.send_to_providers.send_sms_to_provider.assert_called_with( From b784d33173296dfa530700d8d0218cf38ee26723 Mon Sep 17 00:00:00 2001 From: Kenneth Kehl <@kkehl@flexion.us> Date: Fri, 13 Dec 2024 16:45:09 -0800 Subject: [PATCH 03/15] more work --- app/celery/scheduled_tasks.py | 12 ++++++++---- app/clients/cloudwatch/aws_cloudwatch.py | 12 ++++-------- app/config.py | 5 +++++ app/dao/notifications_dao.py | 1 + 4 files changed, 18 insertions(+), 12 deletions(-) diff --git a/app/celery/scheduled_tasks.py b/app/celery/scheduled_tasks.py index f884de834..562e4422d 100644 --- a/app/celery/scheduled_tasks.py +++ b/app/celery/scheduled_tasks.py @@ -23,7 +23,10 @@ find_jobs_with_missing_rows, find_missing_row_for_job, ) -from app.dao.notifications_dao import notifications_not_yet_sent +from app.dao.notifications_dao import ( + dao_update_delivery_receipts, + notifications_not_yet_sent, +) from app.dao.services_dao import ( dao_find_services_sending_to_tv_numbers, dao_find_services_with_high_failure_rates, @@ -234,9 +237,10 @@ def check_for_services_with_high_failure_rates_or_sending_to_tv_numbers(): zendesk_client.send_ticket_to_zendesk(ticket) -@notify_celery.task(name="process_delivery_receipts_first_wave") -def process_delivery_receipts_first_wave(): +@notify_celery.task(name="process-delivery-receipts") +def process_delivery_receipts(): cloudwatch = AwsCloudwatchClient() - start_time = utc_now() - timedelta(hours=1) + start_time = utc_now() - timedelta(minutes=10) end_time = utc_now() receipts = cloudwatch.check_delivery_receipts(start_time, end_time) + dao_update_delivery_receipts(receipts) diff --git a/app/clients/cloudwatch/aws_cloudwatch.py b/app/clients/cloudwatch/aws_cloudwatch.py index 9bb52ea88..aa53877ea 100644 --- a/app/clients/cloudwatch/aws_cloudwatch.py +++ b/app/clients/cloudwatch/aws_cloudwatch.py @@ -1,7 +1,5 @@ -import json import os import re -from datetime import timedelta from time import sleep from boto3 import client @@ -10,8 +8,7 @@ from app.clients import AWS_CLIENT_CONFIG, Client from app.cloudfoundry_config import cloud_config from app.dao.notifications_dao import dao_update_delivery_receipts -from app.exceptions import NotificationTechnicalFailureException -from app.utils import hilite, utc_now +from app.utils import utc_now class AwsCloudwatchClient(Client): @@ -111,7 +108,7 @@ def warn_if_dev_is_opted_out(self, provider_response, notification_id): return None -def do_log_insights(self): +def check_delivery_receipts(self, start, end): region = cloud_config.sns_region account_number = self._extract_account_number(cloud_config.ses_domain_arn) @@ -121,11 +118,10 @@ def do_log_insights(self): ) query = """ - fields @timestamp, status, delivery.providerResponse, delivery.destination, notification.messageId, delivery.phoneCarrier + fields @timestamp, status, delivery.providerResponse, delivery.destination, + notification.messageId, delivery.phoneCarrier | sort @timestamp asc """ - start = utc_now() - timedelta(hours=1) - end = utc_now() response = client._client.start_query( logGroupName=log_group_name, diff --git a/app/config.py b/app/config.py index 12159e289..e7f4af14d 100644 --- a/app/config.py +++ b/app/config.py @@ -196,6 +196,11 @@ class Config(object): "schedule": timedelta(minutes=63), "options": {"queue": QueueNames.PERIODIC}, }, + "process-delivery-receipts": { + "task": "process-delivery-receipts", + "schedule": timedelta(minutes=8), + "options": {"queue": QueueNames.PERIODIC}, + }, "expire-or-delete-invitations": { "task": "expire-or-delete-invitations", "schedule": timedelta(minutes=66), diff --git a/app/dao/notifications_dao.py b/app/dao/notifications_dao.py index d676f79f7..d3871c59b 100644 --- a/app/dao/notifications_dao.py +++ b/app/dao/notifications_dao.py @@ -727,6 +727,7 @@ def dao_update_delivery_receipts(receipts): status=case(id_to_status), notification_status=case(id_to_status), sent_at=case(id_to_timestamp), + provider_response=case(id_to_provider_response), ) ) db.session.execute(stmt) From b28b54776279514ec440721c760fccdf8ac1f970 Mon Sep 17 00:00:00 2001 From: Kenneth Kehl <@kkehl@flexion.us> Date: Fri, 13 Dec 2024 17:30:00 -0800 Subject: [PATCH 04/15] more --- app/celery/scheduled_tasks.py | 1 + app/clients/cloudwatch/aws_cloudwatch.py | 114 +++++++++++------------ app/config.py | 2 +- 3 files changed, 57 insertions(+), 60 deletions(-) diff --git a/app/celery/scheduled_tasks.py b/app/celery/scheduled_tasks.py index 562e4422d..d5aaa27a8 100644 --- a/app/celery/scheduled_tasks.py +++ b/app/celery/scheduled_tasks.py @@ -240,6 +240,7 @@ def check_for_services_with_high_failure_rates_or_sending_to_tv_numbers(): @notify_celery.task(name="process-delivery-receipts") def process_delivery_receipts(): cloudwatch = AwsCloudwatchClient() + cloudwatch.init_app(current_app) start_time = utc_now() - timedelta(minutes=10) end_time = utc_now() receipts = cloudwatch.check_delivery_receipts(start_time, end_time) diff --git a/app/clients/cloudwatch/aws_cloudwatch.py b/app/clients/cloudwatch/aws_cloudwatch.py index aa53877ea..825d13c5e 100644 --- a/app/clients/cloudwatch/aws_cloudwatch.py +++ b/app/clients/cloudwatch/aws_cloudwatch.py @@ -7,7 +7,6 @@ from app.clients import AWS_CLIENT_CONFIG, Client from app.cloudfoundry_config import cloud_config -from app.dao.notifications_dao import dao_update_delivery_receipts from app.utils import utc_now @@ -107,63 +106,60 @@ def warn_if_dev_is_opted_out(self, provider_response, notification_id): return logline return None + def check_delivery_receipts(self, start, end): + region = cloud_config.sns_region + account_number = self._extract_account_number(cloud_config.ses_domain_arn) + + log_group_name = f"sns/{region}/{account_number[4]}/DirectPublishToPhoneNumber" + log_group_name_failed = ( + f"sns/{region}/{account_number[4]}/DirectPublishToPhoneNumber/Failed" + ) + + query = """ + fields @timestamp, status, delivery.providerResponse, delivery.destination, + notification.messageId, delivery.phoneCarrier + | sort @timestamp asc + """ + + response = self._client.start_query( + logGroupName=log_group_name, + startTime=int(start.timestamp()), + endTime=int(end.timestamp()), + queryString=query, + ) + query_id = response["queryId"] + while True: + result = client._client.get_query_results(queryId=query_id) + if result["status"] == "Complete": + break + sleep(1) + + delivery_receipts = [] + for log in result["results"]: + receipt = {field["field"]: field["value"] for field in log} + delivery_receipts.append(receipt) + print(receipt) + + delivered = delivery_receipts + + response = client._client.start_query( + logGroupName=log_group_name_failed, + startTime=int(start.timestamp()), + endTime=int(end.timestamp()), + queryString=query, + ) + query_id = response["queryId"] + while True: + result = client._client.get_query_results(queryId=query_id) + if result["status"] == "Complete": + break + sleep(1) -def check_delivery_receipts(self, start, end): - region = cloud_config.sns_region - account_number = self._extract_account_number(cloud_config.ses_domain_arn) - - log_group_name = f"sns/{region}/{account_number[4]}/DirectPublishToPhoneNumber" - log_group_name_failed = ( - f"sns/{region}/{account_number[4]}/DirectPublishToPhoneNumber/Failed" - ) - - query = """ - fields @timestamp, status, delivery.providerResponse, delivery.destination, - notification.messageId, delivery.phoneCarrier - | sort @timestamp asc - """ + delivery_receipts = [] + for log in result["results"]: + receipt = {field["field"]: field["value"] for field in log} + delivery_receipts.append(receipt) + print(receipt) - response = client._client.start_query( - logGroupName=log_group_name, - startTime=int(start.timestamp()), - endTime=int(end.timestamp()), - queryString=query, - ) - query_id = response["queryId"] - while True: - result = client._client.get_query_results(queryId=query_id) - if result["status"] == "Complete": - break - sleep(1) - - delivery_receipts = [] - for log in result["results"]: - receipt = {field["field"]: field["value"] for field in log} - delivery_receipts.append(receipt) - print(receipt) - - delivered = delivery_receipts - - response = client._client.start_query( - logGroupName=log_group_name_failed, - startTime=int(start.timestamp()), - endTime=int(end.timestamp()), - queryString=query, - ) - query_id = response["queryId"] - while True: - result = client._client.get_query_results(queryId=query_id) - if result["status"] == "Complete": - break - sleep(1) - - delivery_receipts = [] - for log in result["results"]: - receipt = {field["field"]: field["value"] for field in log} - delivery_receipts.append(receipt) - print(receipt) - - failed = delivery_receipts - - dao_update_delivery_receipts(delivered) - dao_update_delivery_receipts(failed) + failed = delivery_receipts + return delivered + failed diff --git a/app/config.py b/app/config.py index e7f4af14d..d935b08b9 100644 --- a/app/config.py +++ b/app/config.py @@ -198,7 +198,7 @@ class Config(object): }, "process-delivery-receipts": { "task": "process-delivery-receipts", - "schedule": timedelta(minutes=8), + "schedule": timedelta(minutes=1), "options": {"queue": QueueNames.PERIODIC}, }, "expire-or-delete-invitations": { From 85e100febe51e04d1a0e83b062f62f117ba80b30 Mon Sep 17 00:00:00 2001 From: Kenneth Kehl <@kkehl@flexion.us> Date: Fri, 13 Dec 2024 17:40:28 -0800 Subject: [PATCH 05/15] fix --- tests/app/clients/test_aws_cloudwatch.py | 46 ------------------------ 1 file changed, 46 deletions(-) diff --git a/tests/app/clients/test_aws_cloudwatch.py b/tests/app/clients/test_aws_cloudwatch.py index b9529037b..fce0e150c 100644 --- a/tests/app/clients/test_aws_cloudwatch.py +++ b/tests/app/clients/test_aws_cloudwatch.py @@ -2,7 +2,6 @@ from flask import current_app from app import aws_cloudwatch_client -from app.utils import utc_now def test_check_sms_no_event_error_condition(notify_api, mocker): @@ -74,51 +73,6 @@ def test_warn_if_dev_is_opted_out(response, notify_id, expected_message): assert result == expected_message -def test_check_sms_success(notify_api, mocker): - aws_cloudwatch_client.init_app(current_app) - boto_mock = mocker.patch.object(aws_cloudwatch_client, "_client", create=True) - boto_mock.filter_log_events.side_effect = side_effect - mocker.patch.dict( - "os.environ", - {"SES_DOMAIN_ARN": "arn:aws:ses:us-west-2:12345:identity/ses-xxx.xxx.xxx.xxx"}, - ) - - message_id = "succeed" - notification_id = "ccc" - created_at = utc_now() - with notify_api.app_context(): - aws_cloudwatch_client.check_sms(message_id, notification_id, created_at) - - # We check the 'success' log group first and if we find the message_id, we are done, so there is only 1 call - assert boto_mock.filter_log_events.call_count == 1 - mock_call = str(boto_mock.filter_log_events.mock_calls[0]) - assert "Failure" not in mock_call - assert "succeed" in mock_call - assert "notification.messageId" in mock_call - - -def test_check_sms_failure(notify_api, mocker): - aws_cloudwatch_client.init_app(current_app) - boto_mock = mocker.patch.object(aws_cloudwatch_client, "_client", create=True) - boto_mock.filter_log_events.side_effect = side_effect - mocker.patch.dict( - "os.environ", - {"SES_DOMAIN_ARN": "arn:aws:ses:us-west-2:12345:identity/ses-xxx.xxx.xxx.xxx"}, - ) - message_id = "fail" - notification_id = "bbb" - created_at = utc_now() - with notify_api.app_context(): - aws_cloudwatch_client.check_sms(message_id, notification_id, created_at) - - # We check the 'success' log group and find nothing, so we then check the 'fail' log group -- two calls. - assert boto_mock.filter_log_events.call_count == 2 - mock_call = str(boto_mock.filter_log_events.mock_calls[1]) - assert "Failure" in mock_call - assert "fail" in mock_call - assert "notification.messageId" in mock_call - - def test_extract_account_number_gov_cloud(): domain_arn = "arn:aws-us-gov:ses:us-gov-west-1:12345:identity/ses-abc.xxx.xxx.xxx" actual_account_number = aws_cloudwatch_client._extract_account_number(domain_arn) From 2707f757c8e286c5465f4c4ee464f4c9cf3a0193 Mon Sep 17 00:00:00 2001 From: Kenneth Kehl <@kkehl@flexion.us> Date: Mon, 16 Dec 2024 08:29:34 -0800 Subject: [PATCH 06/15] get rid of duplicated code --- app/clients/cloudwatch/aws_cloudwatch.py | 33 +++++------------------- 1 file changed, 7 insertions(+), 26 deletions(-) diff --git a/app/clients/cloudwatch/aws_cloudwatch.py b/app/clients/cloudwatch/aws_cloudwatch.py index 825d13c5e..f66ed0290 100644 --- a/app/clients/cloudwatch/aws_cloudwatch.py +++ b/app/clients/cloudwatch/aws_cloudwatch.py @@ -121,6 +121,11 @@ def check_delivery_receipts(self, start, end): | sort @timestamp asc """ + delivered = self.run_log_insights_query(log_group_name, start, end, query) + failed = self.run_log_insights_query(log_group_name_failed, start, end, query) + return delivered + failed + + def run_log_insights_query(self, log_group_name, start, end, query): response = self._client.start_query( logGroupName=log_group_name, startTime=int(start.timestamp()), @@ -129,28 +134,7 @@ def check_delivery_receipts(self, start, end): ) query_id = response["queryId"] while True: - result = client._client.get_query_results(queryId=query_id) - if result["status"] == "Complete": - break - sleep(1) - - delivery_receipts = [] - for log in result["results"]: - receipt = {field["field"]: field["value"] for field in log} - delivery_receipts.append(receipt) - print(receipt) - - delivered = delivery_receipts - - response = client._client.start_query( - logGroupName=log_group_name_failed, - startTime=int(start.timestamp()), - endTime=int(end.timestamp()), - queryString=query, - ) - query_id = response["queryId"] - while True: - result = client._client.get_query_results(queryId=query_id) + result = self._client.get_query_results(queryId=query_id) if result["status"] == "Complete": break sleep(1) @@ -159,7 +143,4 @@ def check_delivery_receipts(self, start, end): for log in result["results"]: receipt = {field["field"]: field["value"] for field in log} delivery_receipts.append(receipt) - print(receipt) - - failed = delivery_receipts - return delivered + failed + return delivery_receipts From b5881409520f7ffb471e4131c9a8d81f86db063a Mon Sep 17 00:00:00 2001 From: Kenneth Kehl <@kkehl@flexion.us> Date: Mon, 16 Dec 2024 11:22:49 -0800 Subject: [PATCH 07/15] change schedule to every 8 minutes --- app/config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/config.py b/app/config.py index d935b08b9..e7f4af14d 100644 --- a/app/config.py +++ b/app/config.py @@ -198,7 +198,7 @@ class Config(object): }, "process-delivery-receipts": { "task": "process-delivery-receipts", - "schedule": timedelta(minutes=1), + "schedule": timedelta(minutes=8), "options": {"queue": QueueNames.PERIODIC}, }, "expire-or-delete-invitations": { From 87d9ae5f33c9ab5635ebd0f8e0671b5625e34523 Mon Sep 17 00:00:00 2001 From: Kenneth Kehl <@kkehl@flexion.us> Date: Mon, 16 Dec 2024 14:16:35 -0800 Subject: [PATCH 08/15] remove dead code --- app/clients/cloudwatch/aws_cloudwatch.py | 44 +++--------------------- 1 file changed, 5 insertions(+), 39 deletions(-) diff --git a/app/clients/cloudwatch/aws_cloudwatch.py b/app/clients/cloudwatch/aws_cloudwatch.py index f66ed0290..0d9f58680 100644 --- a/app/clients/cloudwatch/aws_cloudwatch.py +++ b/app/clients/cloudwatch/aws_cloudwatch.py @@ -7,7 +7,6 @@ from app.clients import AWS_CLIENT_CONFIG, Client from app.cloudfoundry_config import cloud_config -from app.utils import utc_now class AwsCloudwatchClient(Client): @@ -47,44 +46,6 @@ def name(self): def is_localstack(self): return self._is_localstack - def _get_log(self, my_filter, log_group_name, sent_at): - # Check all cloudwatch logs from the time the notification was sent (currently 5 minutes previously) until now - now = utc_now() - beginning = sent_at - next_token = None - all_log_events = [] - current_app.logger.info(f"START TIME {beginning} END TIME {now}") - # There has been a change somewhere and the time range we were previously using has become too - # narrow or wrong in some way, so events can't be found. For the time being, adjust by adding - # a buffer on each side of 12 hours. - TWELVE_HOURS = 12 * 60 * 60 * 1000 - while True: - if next_token: - response = self._client.filter_log_events( - logGroupName=log_group_name, - filterPattern=my_filter, - nextToken=next_token, - startTime=int(beginning.timestamp() * 1000) - TWELVE_HOURS, - endTime=int(now.timestamp() * 1000) + TWELVE_HOURS, - ) - else: - response = self._client.filter_log_events( - logGroupName=log_group_name, - filterPattern=my_filter, - startTime=int(beginning.timestamp() * 1000) - TWELVE_HOURS, - endTime=int(now.timestamp() * 1000) + TWELVE_HOURS, - ) - log_events = response.get("events", []) - all_log_events.extend(log_events) - if len(log_events) > 0: - # We found it - - break - next_token = response.get("nextToken") - if not next_token: - break - return all_log_events - def _extract_account_number(self, ses_domain_arn): account_number = ses_domain_arn.split(":") return account_number @@ -107,6 +68,11 @@ def warn_if_dev_is_opted_out(self, provider_response, notification_id): return None def check_delivery_receipts(self, start, end): + + result = self._client.describe_log_groups() + print(result) + return + region = cloud_config.sns_region account_number = self._extract_account_number(cloud_config.ses_domain_arn) From 6316e266eede9cbe1ee322441f1cc74c8947153e Mon Sep 17 00:00:00 2001 From: Kenneth Kehl <@kkehl@flexion.us> Date: Mon, 16 Dec 2024 14:33:50 -0800 Subject: [PATCH 09/15] fix batch processing --- app/celery/scheduled_tasks.py | 5 ++++- app/clients/cloudwatch/aws_cloudwatch.py | 4 ---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/app/celery/scheduled_tasks.py b/app/celery/scheduled_tasks.py index d5aaa27a8..94bea4bea 100644 --- a/app/celery/scheduled_tasks.py +++ b/app/celery/scheduled_tasks.py @@ -244,4 +244,7 @@ def process_delivery_receipts(): start_time = utc_now() - timedelta(minutes=10) end_time = utc_now() receipts = cloudwatch.check_delivery_receipts(start_time, end_time) - dao_update_delivery_receipts(receipts) + batch_size = 100 + for i in range(0, len(receipts), batch_size): + batch = receipts[i : i + batch_size] + dao_update_delivery_receipts(batch) diff --git a/app/clients/cloudwatch/aws_cloudwatch.py b/app/clients/cloudwatch/aws_cloudwatch.py index 0d9f58680..cd510e9dd 100644 --- a/app/clients/cloudwatch/aws_cloudwatch.py +++ b/app/clients/cloudwatch/aws_cloudwatch.py @@ -69,10 +69,6 @@ def warn_if_dev_is_opted_out(self, provider_response, notification_id): def check_delivery_receipts(self, start, end): - result = self._client.describe_log_groups() - print(result) - return - region = cloud_config.sns_region account_number = self._extract_account_number(cloud_config.ses_domain_arn) From 7cf747d35af39452e5dcb7fe0ac9044b14a84ea7 Mon Sep 17 00:00:00 2001 From: Kenneth Kehl <@kkehl@flexion.us> Date: Tue, 17 Dec 2024 15:59:30 -0800 Subject: [PATCH 10/15] go back to filter log events --- app/celery/scheduled_tasks.py | 24 +++- app/clients/cloudwatch/aws_cloudwatch.py | 155 +++++++++++++++-------- app/dao/notifications_dao.py | 66 ++++++++-- 3 files changed, 178 insertions(+), 67 deletions(-) diff --git a/app/celery/scheduled_tasks.py b/app/celery/scheduled_tasks.py index 94bea4bea..b14d50ee5 100644 --- a/app/celery/scheduled_tasks.py +++ b/app/celery/scheduled_tasks.py @@ -35,7 +35,8 @@ from app.enums import JobStatus, NotificationType from app.models import Job from app.notifications.process_notifications import send_notification_to_queue -from app.utils import utc_now +from app.utils import hilite, utc_now +from notifications_utils import aware_utcnow from notifications_utils.clients.zendesk.zendesk_client import NotifySupportTicket MAX_NOTIFICATION_FAILS = 10000 @@ -239,12 +240,21 @@ def check_for_services_with_high_failure_rates_or_sending_to_tv_numbers(): @notify_celery.task(name="process-delivery-receipts") def process_delivery_receipts(): + print(hilite("ENTER PROCESS DELIVERY RECEIPTS")) cloudwatch = AwsCloudwatchClient() cloudwatch.init_app(current_app) - start_time = utc_now() - timedelta(minutes=10) - end_time = utc_now() - receipts = cloudwatch.check_delivery_receipts(start_time, end_time) + start_time = aware_utcnow() - timedelta(minutes=10) + end_time = aware_utcnow() + delivered_receipts, failed_receipts = cloudwatch.check_delivery_receipts( + start_time, end_time + ) + delivered_receipts = list(delivered_receipts) + batch_size = 100 + for i in range(0, len(delivered_receipts), batch_size): + batch = delivered_receipts[i : i + batch_size] + dao_update_delivery_receipts(batch, True) + failed_receipts = list(failed_receipts) batch_size = 100 - for i in range(0, len(receipts), batch_size): - batch = receipts[i : i + batch_size] - dao_update_delivery_receipts(batch) + for i in range(0, len(failed_receipts), batch_size): + batch = failed_receipts[i : i + batch_size] + dao_update_delivery_receipts(batch, False) diff --git a/app/clients/cloudwatch/aws_cloudwatch.py b/app/clients/cloudwatch/aws_cloudwatch.py index cd510e9dd..d84044943 100644 --- a/app/clients/cloudwatch/aws_cloudwatch.py +++ b/app/clients/cloudwatch/aws_cloudwatch.py @@ -1,12 +1,12 @@ +import json import os import re -from time import sleep from boto3 import client -from flask import current_app from app.clients import AWS_CLIENT_CONFIG, Client from app.cloudfoundry_config import cloud_config +from app.utils import hilite class AwsCloudwatchClient(Client): @@ -46,63 +46,116 @@ def name(self): def is_localstack(self): return self._is_localstack + def _get_log(self, log_group_name, start, end): + # Check all cloudwatch logs from the time the notification was sent (currently 5 minutes previously) until now + print(hilite(f"START {start} END {end}")) + next_token = None + all_log_events = [] + + while True: + if next_token: + response = self._client.filter_log_events( + logGroupName=log_group_name, + nextToken=next_token, + startTime=int(start.timestamp() * 1000), + endTime=int(end.timestamp() * 1000), + ) + else: + response = self._client.filter_log_events( + logGroupName=log_group_name, + startTime=int(start.timestamp() * 1000), + endTime=int(end.timestamp() * 1000), + ) + log_events = response.get("events", []) + all_log_events.extend(log_events) + next_token = response.get("nextToken") + if not next_token: + break + return all_log_events + def _extract_account_number(self, ses_domain_arn): account_number = ses_domain_arn.split(":") return account_number - def warn_if_dev_is_opted_out(self, provider_response, notification_id): - if ( - "is opted out" in provider_response.lower() - or "has blocked sms" in provider_response.lower() - ): - if os.getenv("NOTIFY_ENVIRONMENT") in ["development", "test"]: - ansi_red = "\033[31m" - ansi_reset = "\033[0m" - logline = ( - ansi_red - + f"The phone number for notification_id {notification_id} is OPTED OUT. You need to opt back in" - + ansi_reset - ) - current_app.logger.warning(logline) - return logline - return None - + def event_to_db_format(self, event): + + # massage the data into the form the db expects. When we switch + # from filter_log_events to log insights this will be convenient + if isinstance(event, str): + event = json.loads(event) + + return { + "notification.messageId": event["notification"]["messageId"], + "status": event["status"], + "delivery.phoneCarrier": event["delivery"]["phoneCarrier"], + "delivery.providerResponse": event["delivery"]["providerResponse"], + "@timestamp": event["notification"]["timestamp"], + } + + # Here is an example of how to get the events with log insights + # def do_log_insights(): + # query = """ + # fields @timestamp, status, message, recipient + # | filter status = "DELIVERED" + # | sort @timestamp asc + # """ + # temp_client = boto3.client( + # "logs", + # region_name="us-gov-west-1", + # aws_access_key_id=AWS_ACCESS_KEY_ID, + # aws_secret_access_key=AWS_SECRET_ACCESS_KEY, + # config=AWS_CLIENT_CONFIG, + # ) + # start = utc_now() + # end = utc_now - timedelta(hours=1) + # response = temp_client.start_query( + # logGroupName = LOG_GROUP_NAME_DELIVERED, + # startTime = int(start.timestamp()), + # endTime= int(end.timestamp()), + # queryString = query + + # ) + # query_id = response['queryId'] + # while True: + # result = temp_client.get_query_results(queryId=query_id) + # if result['status'] == 'Complete': + # break + # time.sleep(1) + + # delivery_receipts = [] + # for log in result['results']: + # receipt = {field['field']: field['value'] for field in log} + # delivery_receipts.append(receipt) + # print(receipt) + + # print(len(delivery_receipts)) + + # In the long run we want to use Log Insights because it is more efficient + # that filter_log_events. But we are blocked by a permissions issue in the broker. + # So for now, use filter_log_events and grab all log_events over a 10 minute interval, + # and run this on a schedule. def check_delivery_receipts(self, start, end): - region = cloud_config.sns_region + # TODO this clumsy approach to getting the account number will be fixed as part of notify-api #258 account_number = self._extract_account_number(cloud_config.ses_domain_arn) - + delivered_event_set = set() log_group_name = f"sns/{region}/{account_number[4]}/DirectPublishToPhoneNumber" - log_group_name_failed = ( - f"sns/{region}/{account_number[4]}/DirectPublishToPhoneNumber/Failed" - ) + print(hilite(f"LOG GROUP NAME {log_group_name}")) + all_delivered_events = self._get_log(log_group_name, start, end) + print(f"ALL DELIVEREDS {len(all_delivered_events)}") - query = """ - fields @timestamp, status, delivery.providerResponse, delivery.destination, - notification.messageId, delivery.phoneCarrier - | sort @timestamp asc - """ - - delivered = self.run_log_insights_query(log_group_name, start, end, query) - failed = self.run_log_insights_query(log_group_name_failed, start, end, query) - return delivered + failed - - def run_log_insights_query(self, log_group_name, start, end, query): - response = self._client.start_query( - logGroupName=log_group_name, - startTime=int(start.timestamp()), - endTime=int(end.timestamp()), - queryString=query, + for event in all_delivered_events: + actual_event = self.event_to_db_format(event["message"]) + delivered_event_set.add(json.dumps(actual_event)) + + failed_event_set = set() + log_group_name = ( + f"sns/{region}/{account_number[4]}/DirectPublishToPhoneNumber/Failure" ) - query_id = response["queryId"] - while True: - result = self._client.get_query_results(queryId=query_id) - if result["status"] == "Complete": - break - sleep(1) + all_failed_events = self._get_log(log_group_name, start, end) + print(f"ALL FAILEDS {len(all_failed_events)}") + for event in all_failed_events: + actual_event = self.event_to_db_format(event["message"]) + failed_event_set.add(json.dumps(actual_event)) - delivery_receipts = [] - for log in result["results"]: - receipt = {field["field"]: field["value"] for field in log} - delivery_receipts.append(receipt) - return delivery_receipts + return delivered_event_set, failed_event_set diff --git a/app/dao/notifications_dao.py b/app/dao/notifications_dao.py index d3871c59b..ef338dc4d 100644 --- a/app/dao/notifications_dao.py +++ b/app/dao/notifications_dao.py @@ -1,7 +1,20 @@ +import json from datetime import timedelta from flask import current_app -from sqlalchemy import asc, delete, desc, func, or_, select, text, union, update +from sqlalchemy import ( + TIMESTAMP, + asc, + cast, + delete, + desc, + func, + or_, + select, + text, + union, + update, +) from sqlalchemy.orm import joinedload from sqlalchemy.orm.exc import NoResultFound from sqlalchemy.sql import functions @@ -709,8 +722,25 @@ def get_service_ids_with_notifications_on_date(notification_type, date): } -def dao_update_delivery_receipts(receipts): - id_to_status = {r["notification.messageId"]: r["status"] for r in receipts} +def dao_update_delivery_receipts(receipts, delivered): + new_receipts = [] + for r in receipts: + if isinstance(r, str): + r = json.loads(r) + new_receipts.append(r) + + receipts = new_receipts + print(receipts) + + statuses = {} + for r in receipts: + if r["status"].lower() == "success": + statuses[r["notification.messageId"]] = NotificationStatus.DELIVERED + else: + statuses[r["notification.messageId"]] = NotificationStatus.FAILED + + print(f"HERE ARE STATUSES {statuses}") + id_to_carrier = { r["notification.messageId"]: r["delivery.phoneCarrier"] for r in receipts } @@ -719,16 +749,34 @@ def dao_update_delivery_receipts(receipts): } id_to_timestamp = {r["notification.messageId"]: r["@timestamp"] for r in receipts} + status_to_update_with = NotificationStatus.DELIVERED + if not delivered: + status_to_update_with = NotificationStatus.FAILED stmt = ( update(Notification) - .where(Notification.c.message_id.in_(id_to_carrier.keys())) + .where(Notification.message_id.in_(id_to_carrier.keys())) .values( - carrier=case(id_to_carrier), - status=case(id_to_status), - notification_status=case(id_to_status), - sent_at=case(id_to_timestamp), - provider_response=case(id_to_provider_response), + carrier=case( + *[ + (Notification.message_id == key, value) + for key, value in id_to_carrier.items() + ] + ), + status=status_to_update_with, + sent_at=case( + *[ + (Notification.message_id == key, cast(value, TIMESTAMP)) + for key, value in id_to_timestamp.items() + ] + ), + provider_response=case( + *[ + (Notification.message_id == key, value) + for key, value in id_to_provider_response.items() + ] + ), ) ) + print(stmt) db.session.execute(stmt) db.session.commit() From 48c3cebc7235e7b6e5ec7b9956a843def891c39f Mon Sep 17 00:00:00 2001 From: Kenneth Kehl <@kkehl@flexion.us> Date: Wed, 18 Dec 2024 07:44:24 -0800 Subject: [PATCH 11/15] clean up --- app/celery/scheduled_tasks.py | 62 ++++++++++++++++-------- app/clients/cloudwatch/aws_cloudwatch.py | 11 +++-- app/dao/notifications_dao.py | 11 ----- 3 files changed, 48 insertions(+), 36 deletions(-) diff --git a/app/celery/scheduled_tasks.py b/app/celery/scheduled_tasks.py index b14d50ee5..25e4d5034 100644 --- a/app/celery/scheduled_tasks.py +++ b/app/celery/scheduled_tasks.py @@ -35,7 +35,7 @@ from app.enums import JobStatus, NotificationType from app.models import Job from app.notifications.process_notifications import send_notification_to_queue -from app.utils import hilite, utc_now +from app.utils import utc_now from notifications_utils import aware_utcnow from notifications_utils.clients.zendesk.zendesk_client import NotifySupportTicket @@ -238,23 +238,43 @@ def check_for_services_with_high_failure_rates_or_sending_to_tv_numbers(): zendesk_client.send_ticket_to_zendesk(ticket) -@notify_celery.task(name="process-delivery-receipts") -def process_delivery_receipts(): - print(hilite("ENTER PROCESS DELIVERY RECEIPTS")) - cloudwatch = AwsCloudwatchClient() - cloudwatch.init_app(current_app) - start_time = aware_utcnow() - timedelta(minutes=10) - end_time = aware_utcnow() - delivered_receipts, failed_receipts = cloudwatch.check_delivery_receipts( - start_time, end_time - ) - delivered_receipts = list(delivered_receipts) - batch_size = 100 - for i in range(0, len(delivered_receipts), batch_size): - batch = delivered_receipts[i : i + batch_size] - dao_update_delivery_receipts(batch, True) - failed_receipts = list(failed_receipts) - batch_size = 100 - for i in range(0, len(failed_receipts), batch_size): - batch = failed_receipts[i : i + batch_size] - dao_update_delivery_receipts(batch, False) +@notify_celery.task( + bind=True, max_retries=7, default_retry_delay=3600, name="process-delivery-receipts" +) +def process_delivery_receipts(self): + """ + Every eight minutes or so (see config.py) we run this task, which searches the last ten + minutes of logs for delivery receipts and batch updates the db with the results. The overlap + is intentional. We don't mind re-updating things, it is better than losing data. + + We also set this to retry with exponential backoff in the case of failure. The only way this would + fail is if, for example the db went down, or redis filled causing the app to stop processing. But if + it does fail, we need to go back over at some point when things are running again and process those results. + """ + try: + batch_size = 200 # in theory with postgresql this could be 10k to 20k? + + cloudwatch = AwsCloudwatchClient() + cloudwatch.init_app(current_app) + start_time = aware_utcnow() - timedelta(minutes=10) + end_time = aware_utcnow() + delivered_receipts, failed_receipts = cloudwatch.check_delivery_receipts( + start_time, end_time + ) + delivered_receipts = list(delivered_receipts) + for i in range(0, len(delivered_receipts), batch_size): + batch = delivered_receipts[i : i + batch_size] + dao_update_delivery_receipts(batch, True) + failed_receipts = list(failed_receipts) + for i in range(0, len(failed_receipts), batch_size): + batch = failed_receipts[i : i + batch_size] + dao_update_delivery_receipts(batch, False) + except Exception as ex: + retry_count = self.request.retries + wait_time = 3600 * 2**retry_count + try: + raise self.retry(ex=ex, countdown=wait_time) + except self.MaxRetriesExceededError: + current_app.logger.error( + "Failed process delivery receipts after max retries" + ) diff --git a/app/clients/cloudwatch/aws_cloudwatch.py b/app/clients/cloudwatch/aws_cloudwatch.py index d84044943..297052741 100644 --- a/app/clients/cloudwatch/aws_cloudwatch.py +++ b/app/clients/cloudwatch/aws_cloudwatch.py @@ -3,6 +3,7 @@ import re from boto3 import client +from flask import current_app from app.clients import AWS_CLIENT_CONFIG, Client from app.cloudfoundry_config import cloud_config @@ -136,13 +137,13 @@ def event_to_db_format(self, event): # and run this on a schedule. def check_delivery_receipts(self, start, end): region = cloud_config.sns_region - # TODO this clumsy approach to getting the account number will be fixed as part of notify-api #258 account_number = self._extract_account_number(cloud_config.ses_domain_arn) delivered_event_set = set() log_group_name = f"sns/{region}/{account_number[4]}/DirectPublishToPhoneNumber" - print(hilite(f"LOG GROUP NAME {log_group_name}")) all_delivered_events = self._get_log(log_group_name, start, end) - print(f"ALL DELIVEREDS {len(all_delivered_events)}") + current_app.logger.info( + f"Delivered count {len(all_delivered_events)} over range {start} to {end}" + ) for event in all_delivered_events: actual_event = self.event_to_db_format(event["message"]) @@ -153,7 +154,9 @@ def check_delivery_receipts(self, start, end): f"sns/{region}/{account_number[4]}/DirectPublishToPhoneNumber/Failure" ) all_failed_events = self._get_log(log_group_name, start, end) - print(f"ALL FAILEDS {len(all_failed_events)}") + current_app.logger.info( + f"Failed count {len(all_delivered_events)} over range {start} to {end}" + ) for event in all_failed_events: actual_event = self.event_to_db_format(event["message"]) failed_event_set.add(json.dumps(actual_event)) diff --git a/app/dao/notifications_dao.py b/app/dao/notifications_dao.py index ef338dc4d..6ce97b801 100644 --- a/app/dao/notifications_dao.py +++ b/app/dao/notifications_dao.py @@ -730,16 +730,6 @@ def dao_update_delivery_receipts(receipts, delivered): new_receipts.append(r) receipts = new_receipts - print(receipts) - - statuses = {} - for r in receipts: - if r["status"].lower() == "success": - statuses[r["notification.messageId"]] = NotificationStatus.DELIVERED - else: - statuses[r["notification.messageId"]] = NotificationStatus.FAILED - - print(f"HERE ARE STATUSES {statuses}") id_to_carrier = { r["notification.messageId"]: r["delivery.phoneCarrier"] for r in receipts @@ -777,6 +767,5 @@ def dao_update_delivery_receipts(receipts, delivered): ), ) ) - print(stmt) db.session.execute(stmt) db.session.commit() From 2c2ee415426e6764fb69ddbfcf745f3ccb97cead Mon Sep 17 00:00:00 2001 From: Kenneth Kehl <@kkehl@flexion.us> Date: Wed, 18 Dec 2024 07:55:55 -0800 Subject: [PATCH 12/15] add back opt out --- app/clients/cloudwatch/aws_cloudwatch.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/app/clients/cloudwatch/aws_cloudwatch.py b/app/clients/cloudwatch/aws_cloudwatch.py index 297052741..0184a4d90 100644 --- a/app/clients/cloudwatch/aws_cloudwatch.py +++ b/app/clients/cloudwatch/aws_cloudwatch.py @@ -74,6 +74,23 @@ def _get_log(self, log_group_name, start, end): break return all_log_events + def warn_if_dev_is_opted_out(self, provider_response, notification_id): + if ( + "is opted out" in provider_response.lower() + or "has blocked sms" in provider_response.lower() + ): + if os.getenv("NOTIFY_ENVIRONMENT") in ["development", "test"]: + ansi_red = "\033[31m" + ansi_reset = "\033[0m" + logline = ( + ansi_red + + f"The phone number for notification_id {notification_id} is OPTED OUT. You need to opt back in" + + ansi_reset + ) + current_app.logger.warning(logline) + return logline + return None + def _extract_account_number(self, ses_domain_arn): account_number = ses_domain_arn.split(":") return account_number From 9d9ce137c4bb6fca3d368873254b89ebf17383b6 Mon Sep 17 00:00:00 2001 From: Kenneth Kehl <@kkehl@flexion.us> Date: Wed, 18 Dec 2024 08:12:44 -0800 Subject: [PATCH 13/15] reduce code --- app/clients/cloudwatch/aws_cloudwatch.py | 29 +- loadtest_10k.csv | 10001 +++++++++++++++++++++ 2 files changed, 10011 insertions(+), 19 deletions(-) create mode 100644 loadtest_10k.csv diff --git a/app/clients/cloudwatch/aws_cloudwatch.py b/app/clients/cloudwatch/aws_cloudwatch.py index 0184a4d90..5c34cce4d 100644 --- a/app/clients/cloudwatch/aws_cloudwatch.py +++ b/app/clients/cloudwatch/aws_cloudwatch.py @@ -155,27 +155,18 @@ def event_to_db_format(self, event): def check_delivery_receipts(self, start, end): region = cloud_config.sns_region account_number = self._extract_account_number(cloud_config.ses_domain_arn) - delivered_event_set = set() log_group_name = f"sns/{region}/{account_number[4]}/DirectPublishToPhoneNumber" - all_delivered_events = self._get_log(log_group_name, start, end) - current_app.logger.info( - f"Delivered count {len(all_delivered_events)} over range {start} to {end}" - ) - - for event in all_delivered_events: - actual_event = self.event_to_db_format(event["message"]) - delivered_event_set.add(json.dumps(actual_event)) - - failed_event_set = set() + delivered_event_set = self._get_receipts(log_group_name, start, end) log_group_name = ( f"sns/{region}/{account_number[4]}/DirectPublishToPhoneNumber/Failure" ) - all_failed_events = self._get_log(log_group_name, start, end) - current_app.logger.info( - f"Failed count {len(all_delivered_events)} over range {start} to {end}" - ) - for event in all_failed_events: - actual_event = self.event_to_db_format(event["message"]) - failed_event_set.add(json.dumps(actual_event)) - + failed_event_set = self._get_receipts(log_group_name, start, end) return delivered_event_set, failed_event_set + + def _get_receipts(self, log_group_name, start, end): + event_set = set() + all_events = self._get_log(log_group_name, start, end) + for event in all_events: + actual_event = self.event_to_db_format(event["message"]) + event_set.add(json.dumps(actual_event)) + return event_set diff --git a/loadtest_10k.csv b/loadtest_10k.csv new file mode 100644 index 000000000..86b1b5ac1 --- /dev/null +++ b/loadtest_10k.csv @@ -0,0 +1,10001 @@ +phone number ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 ++14254147755 ++14254147167 From 4bd97586b426876b9b51f723e072a08c7b796c80 Mon Sep 17 00:00:00 2001 From: Kenneth Kehl <@kkehl@flexion.us> Date: Wed, 18 Dec 2024 09:06:06 -0800 Subject: [PATCH 14/15] add test --- .../notification_dao/test_notification_dao.py | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/tests/app/dao/notification_dao/test_notification_dao.py b/tests/app/dao/notification_dao/test_notification_dao.py index e2ac10032..6e09f182a 100644 --- a/tests/app/dao/notification_dao/test_notification_dao.py +++ b/tests/app/dao/notification_dao/test_notification_dao.py @@ -1,6 +1,7 @@ import uuid from datetime import date, datetime, timedelta from functools import partial +from unittest.mock import MagicMock, patch import pytest from freezegun import freeze_time @@ -19,6 +20,7 @@ dao_get_notification_history_by_reference, dao_get_notifications_by_recipient_or_reference, dao_timeout_notifications, + dao_update_delivery_receipts, dao_update_notification, dao_update_notifications_by_reference, get_notification_by_id, @@ -1996,6 +1998,34 @@ def test_notifications_not_yet_sent_return_no_rows(sample_service, notification_ assert len(results) == 0 +def test_update_delivery_receipts(mocker): + mock_session = mocker.patch("app.dao.notifications_dao.db.session") + receipts = [ + '{"notification.messageId": "msg1", "delivery.phoneCarrier": "carrier1", "delivery.providerResponse": "resp1", "@timestamp": "2024-01-01T12:00:00"}', # noqa + '{"notification.messageId": "msg2", "delivery.phoneCarrier": "carrier2", "delivery.providerResponse": "resp2", "@timestamp": "2024-01-01T13:00:00"}', # noqa + ] + delivered = True + mock_update = MagicMock() + mock_where = MagicMock() + mock_values = MagicMock() + mock_update.where.return_value = mock_where + mock_where.values.return_value = mock_values + + mock_session.execute.return_value = None + with patch("app.dao.notifications_dao.update", return_value=mock_update): + dao_update_delivery_receipts(receipts, delivered) + mock_update.where.assert_called_once() + mock_where.values.assert_called_once() + mock_session.execute.assert_called_once_with(mock_values) + mock_session.commit.assert_called_once() + + args, kwargs = mock_where.values.call_args + assert "carrier" in kwargs + assert "status" in kwargs + assert "sent_at" in kwargs + assert "provider_response" in kwargs + + @pytest.mark.parametrize( "created_at_utc,date_to_check,expected_count", [ From 9dc7cfeb2ff41a81bc3a1058f726784bfd48833c Mon Sep 17 00:00:00 2001 From: Kenneth Kehl <@kkehl@flexion.us> Date: Fri, 20 Dec 2024 07:33:28 -0800 Subject: [PATCH 15/15] code review feedback --- app/celery/scheduled_tasks.py | 2 +- app/clients/cloudwatch/aws_cloudwatch.py | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/app/celery/scheduled_tasks.py b/app/celery/scheduled_tasks.py index 25e4d5034..2c31c3f4e 100644 --- a/app/celery/scheduled_tasks.py +++ b/app/celery/scheduled_tasks.py @@ -252,7 +252,7 @@ def process_delivery_receipts(self): it does fail, we need to go back over at some point when things are running again and process those results. """ try: - batch_size = 200 # in theory with postgresql this could be 10k to 20k? + batch_size = 1000 # in theory with postgresql this could be 10k to 20k? cloudwatch = AwsCloudwatchClient() cloudwatch.init_app(current_app) diff --git a/app/clients/cloudwatch/aws_cloudwatch.py b/app/clients/cloudwatch/aws_cloudwatch.py index 5c34cce4d..c83fd6313 100644 --- a/app/clients/cloudwatch/aws_cloudwatch.py +++ b/app/clients/cloudwatch/aws_cloudwatch.py @@ -7,7 +7,6 @@ from app.clients import AWS_CLIENT_CONFIG, Client from app.cloudfoundry_config import cloud_config -from app.utils import hilite class AwsCloudwatchClient(Client): @@ -49,7 +48,6 @@ def is_localstack(self): def _get_log(self, log_group_name, start, end): # Check all cloudwatch logs from the time the notification was sent (currently 5 minutes previously) until now - print(hilite(f"START {start} END {end}")) next_token = None all_log_events = []