Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

Started by Vitaly Davydovabout 1 year ago85 messages
#1Vitaly Davydov
v.davydov@postgrespro.ru

Dear Hackers,
 
I'd like to discuss a problem with replication slots's restart LSN. Physical slots are saved to disk at the beginning of checkpoint. At the end of checkpoint, old WAL segments are recycled or removed from disk, if they are not kept by slot's restart_lsn values.
 
If an existing physical slot is advanced in the middle of checkpoint execution, WAL segments, which are related to saved on disk restart LSN may be removed. It is because the calculation of the replication slot miminal LSN is occured at the end of checkpoint, prior to old WAL segments removal. If to hard stop (pg_stl -m immediate) the postgres instance right after checkpoint and to restart it, the slot's restart_lsn may point to the removed WAL segment. I believe, such behaviour is not good.
 
The doc [0]https://www.postgresql.org/docs/current/logicaldecoding-explanation.html describes that restart_lsn may be set to the some past value after reload. There is a discussion [1]/messages/by-id/059cc53a-8b14-653a-a24d-5f867503b0ee@postgrespro.ru on pghackers where such behaviour is discussed. The main reason of not flushing physical slots on advancing is a performance reason. I'm ok with such behaviour, except of that the corresponding WAL segments should not be removed.
 
I propose to keep WAL segments by saved on disk (flushed) restart_lsn of slots. Add a new field restart_lsn_flushed into ReplicationSlot structure. Copy restart_lsn to restart_lsn_flushed in SaveSlotToPath. It doesn't change the format of storing the slot contents on disk. I attached a patch. It is not yet complete, but demonstate a way to solve the problem.
 
I reproduced the problem by the following way:
* Add some delay in CheckPointBuffers (pg_usleep) to emulate long checkpoint execution. * Execute checkpoint and pg_replication_slot_advance right after starting of the checkpoint from another connection. * Hard restart the server right after checkpoint completion. * After restart slot's restart_lsn may point to removed WAL segment.
The proposed patch fixes it.
 
[0]: https://www.postgresql.org/docs/current/logicaldecoding-explanation.html
[1]: /messages/by-id/059cc53a-8b14-653a-a24d-5f867503b0ee@postgrespro.ru

#2Vitaly Davydov
v.davydov@postgrespro.ru
In reply to: Vitaly Davydov (#1)
1 attachment(s)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

Sorry, attached the missed patch.

On Thursday, October 31, 2024 13:18 MSK, "Vitaly Davydov" <v.davydov@postgrespro.ru> wrote:

Dear Hackers,
 
I'd like to discuss a problem with replication slots's restart LSN. Physical slots are saved to disk at the beginning of checkpoint. At the end of checkpoint, old WAL segments are recycled or removed from disk, if they are not kept by slot's restart_lsn values.
 
If an existing physical slot is advanced in the middle of checkpoint execution, WAL segments, which are related to saved on disk restart LSN may be removed. It is because the calculation of the replication slot miminal LSN is occured at the end of checkpoint, prior to old WAL segments removal. If to hard stop (pg_stl -m immediate) the postgres instance right after checkpoint and to restart it, the slot's restart_lsn may point to the removed WAL segment. I believe, such behaviour is not good.
 
The doc [0]https://www.postgresql.org/docs/current/logicaldecoding-explanation.html describes that restart_lsn may be set to the some past value after reload. There is a discussion [1]/messages/by-id/059cc53a-8b14-653a-a24d-5f867503b0ee@postgrespro.ru on pghackers where such behaviour is discussed. The main reason of not flushing physical slots on advancing is a performance reason. I'm ok with such behaviour, except of that the corresponding WAL segments should not be removed.
 
I propose to keep WAL segments by saved on disk (flushed) restart_lsn of slots. Add a new field restart_lsn_flushed into ReplicationSlot structure. Copy restart_lsn to restart_lsn_flushed in SaveSlotToPath. It doesn't change the format of storing the slot contents on disk. I attached a patch. It is not yet complete, but demonstate a way to solve the problem.
 
I reproduced the problem by the following way:
* Add some delay in CheckPointBuffers (pg_usleep) to emulate long checkpoint execution. * Execute checkpoint and pg_replication_slot_advance right after starting of the checkpoint from another connection. * Hard restart the server right after checkpoint completion. * After restart slot's restart_lsn may point to removed WAL segment.
The proposed patch fixes it.
 
[0]: https://www.postgresql.org/docs/current/logicaldecoding-explanation.html
[1]: /messages/by-id/059cc53a-8b14-653a-a24d-5f867503b0ee@postgrespro.ru

 

Attachments:

0001-Keep-WAL-segments-by-slot-s-flushed-restart-LSN.patchtext/x-patchDownload
From acae6b55fc766d2fe1bfe85eb8af85110f55dcc8 Mon Sep 17 00:00:00 2001
From: Vitaly Davydov <v.davydov@postgrespro.ru>
Date: Thu, 31 Oct 2024 12:29:12 +0300
Subject: [PATCH] Keep WAL segments by slot's flushed restart LSN

---
 src/backend/replication/slot.c | 9 +++++++--
 src/include/replication/slot.h | 4 ++++
 2 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/src/backend/replication/slot.c b/src/backend/replication/slot.c
index 6828100cf1..ee7ab3678e 100644
--- a/src/backend/replication/slot.c
+++ b/src/backend/replication/slot.c
@@ -1148,7 +1148,9 @@ ReplicationSlotsComputeRequiredLSN(void)
 			continue;
 
 		SpinLockAcquire(&s->mutex);
-		restart_lsn = s->data.restart_lsn;
+		restart_lsn = s->restart_lsn_flushed != InvalidXLogRecPtr ?
+			s->restart_lsn_flushed :
+			s->data.restart_lsn;
 		invalidated = s->data.invalidated != RS_INVAL_NONE;
 		SpinLockRelease(&s->mutex);
 
@@ -1207,7 +1209,9 @@ ReplicationSlotsComputeLogicalRestartLSN(void)
 
 		/* read once, it's ok if it increases while we're checking */
 		SpinLockAcquire(&s->mutex);
-		restart_lsn = s->data.restart_lsn;
+		restart_lsn = s->restart_lsn_flushed != InvalidXLogRecPtr ?
+			s->restart_lsn_flushed :
+			s->data.restart_lsn;
 		invalidated = s->data.invalidated != RS_INVAL_NONE;
 		SpinLockRelease(&s->mutex);
 
@@ -2097,6 +2101,7 @@ SaveSlotToPath(ReplicationSlot *slot, const char *dir, int elevel)
 	SpinLockAcquire(&slot->mutex);
 
 	memcpy(&cp.slotdata, &slot->data, sizeof(ReplicationSlotPersistentData));
+	slot->restart_lsn_flushed = slot->data.restart_lsn;
 
 	SpinLockRelease(&slot->mutex);
 
diff --git a/src/include/replication/slot.h b/src/include/replication/slot.h
index 45582cf9d8..ca4c3aab3b 100644
--- a/src/include/replication/slot.h
+++ b/src/include/replication/slot.h
@@ -207,6 +207,10 @@ typedef struct ReplicationSlot
 
 	/* The time since the slot has become inactive */
 	TimestampTz inactive_since;
+
+	/* Latest restart LSN that was flushed to disk */
+	XLogRecPtr restart_lsn_flushed;
+
 } ReplicationSlot;
 
 #define SlotIsPhysical(slot) ((slot)->data.database == InvalidOid)
-- 
2.34.1

#3Vitaly Davydov
v.davydov@postgrespro.ru
In reply to: Vitaly Davydov (#2)
1 attachment(s)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

Dear Hackers,
 
I'd like to introduce an improved version of my patch (see the attached file). My original idea was to take into account saved on disk restart_lsn (slot→restart_lsn_flushed) for persistent slots when removing WAL segment files. It helps tackle errors like: ERROR: requested WAL segment 000...0AA has already been removed.
 
Improvements:
* flushed_restart_lsn is used only for RS_PERSISTENT slots. * Save physical slot on disk when advancing only once - if restart_lsn_flushed is invalid. It is needed because slots with invalid restart LSN are not used when calculating oldest LSN for WAL truncation. Once restart_lsn becomes valid, it should be saved to disk immediately to update restart_lsn_flushed.
Regression tests seems to be ok except:
* recovery/t/001_stream_rep.pl (checkpoint is needed) * recovery/t/019_replslot_limit.pl (it seems, slot was invalidated, some adjustments are needed) * pg_basebackup/t/020_pg_receivewal.pl (not sure about it)
 
There are some problems:
* More WAL segments may be kept. It may lead to invalidations of slots in some tests (recovery/t/019_replslot_limit.pl). A couple of tests should be adjusted.
 
With best regards,
Vitaly Davydov

On Thursday, October 31, 2024 13:32 MSK, "Vitaly Davydov" <v.davydov@postgrespro.ru> wrote:

 
Sorry, attached the missed patch.

On Thursday, October 31, 2024 13:18 MSK, "Vitaly Davydov" <v.davydov@postgrespro.ru> wrote:

Dear Hackers,
 
I'd like to discuss a problem with replication slots's restart LSN. Physical slots are saved to disk at the beginning of checkpoint. At the end of checkpoint, old WAL segments are recycled or removed from disk, if they are not kept by slot's restart_lsn values.
 
If an existing physical slot is advanced in the middle of checkpoint execution, WAL segments, which are related to saved on disk restart LSN may be removed. It is because the calculation of the replication slot miminal LSN is occured at the end of checkpoint, prior to old WAL segments removal. If to hard stop (pg_stl -m immediate) the postgres instance right after checkpoint and to restart it, the slot's restart_lsn may point to the removed WAL segment. I believe, such behaviour is not good.
 
The doc [0]https://www.postgresql.org/docs/current/logicaldecoding-explanation.html describes that restart_lsn may be set to the some past value after reload. There is a discussion [1]/messages/by-id/059cc53a-8b14-653a-a24d-5f867503b0ee@postgrespro.ru on pghackers where such behaviour is discussed. The main reason of not flushing physical slots on advancing is a performance reason. I'm ok with such behaviour, except of that the corresponding WAL segments should not be removed.
 
I propose to keep WAL segments by saved on disk (flushed) restart_lsn of slots. Add a new field restart_lsn_flushed into ReplicationSlot structure. Copy restart_lsn to restart_lsn_flushed in SaveSlotToPath. It doesn't change the format of storing the slot contents on disk. I attached a patch. It is not yet complete, but demonstate a way to solve the problem.
 
I reproduced the problem by the following way:
* Add some delay in CheckPointBuffers (pg_usleep) to emulate long checkpoint execution. * Execute checkpoint and pg_replication_slot_advance right after starting of the checkpoint from another connection. * Hard restart the server right after checkpoint completion. * After restart slot's restart_lsn may point to removed WAL segment.
The proposed patch fixes it.
 
[0]: https://www.postgresql.org/docs/current/logicaldecoding-explanation.html
[1]: /messages/by-id/059cc53a-8b14-653a-a24d-5f867503b0ee@postgrespro.ru

 

 

Attachments:

0001-Keep-WAL-segments-by-slot-s-flushed-restart-LSN.patchtext/x-patchDownload
From d52e254c558e665bc41389e02e026c1069b29861 Mon Sep 17 00:00:00 2001
From: Vitaly Davydov <v.davydov@postgrespro.ru>
Date: Thu, 31 Oct 2024 12:29:12 +0300
Subject: [PATCH] Keep WAL segments by slot's flushed restart LSN

---
 src/backend/replication/slot.c      | 27 ++++++++++++++++++++++++++-
 src/backend/replication/walsender.c | 13 +++++++++++++
 src/include/replication/slot.h      |  4 ++++
 3 files changed, 43 insertions(+), 1 deletion(-)

diff --git a/src/backend/replication/slot.c b/src/backend/replication/slot.c
index 6828100cf1..e6aef1f9a3 100644
--- a/src/backend/replication/slot.c
+++ b/src/backend/replication/slot.c
@@ -409,6 +409,7 @@ ReplicationSlotCreate(const char *name, bool db_specific,
 	slot->candidate_restart_valid = InvalidXLogRecPtr;
 	slot->candidate_restart_lsn = InvalidXLogRecPtr;
 	slot->last_saved_confirmed_flush = InvalidXLogRecPtr;
+	slot->restart_lsn_flushed = InvalidXLogRecPtr;
 	slot->inactive_since = 0;
 
 	/*
@@ -1142,20 +1143,28 @@ ReplicationSlotsComputeRequiredLSN(void)
 	{
 		ReplicationSlot *s = &ReplicationSlotCtl->replication_slots[i];
 		XLogRecPtr	restart_lsn;
+		XLogRecPtr	restart_lsn_flushed;
 		bool		invalidated;
+		ReplicationSlotPersistency persistency;
 
 		if (!s->in_use)
 			continue;
 
 		SpinLockAcquire(&s->mutex);
+		persistency = s->data.persistency;
 		restart_lsn = s->data.restart_lsn;
 		invalidated = s->data.invalidated != RS_INVAL_NONE;
+		restart_lsn_flushed = s->restart_lsn_flushed;
 		SpinLockRelease(&s->mutex);
 
 		/* invalidated slots need not apply */
 		if (invalidated)
 			continue;
 
+		/* truncate WAL for persistent slots by flushed restart_lsn */
+		if (persistency == RS_PERSISTENT)
+			restart_lsn = restart_lsn_flushed;
+
 		if (restart_lsn != InvalidXLogRecPtr &&
 			(min_required == InvalidXLogRecPtr ||
 			 restart_lsn < min_required))
@@ -1193,7 +1202,9 @@ ReplicationSlotsComputeLogicalRestartLSN(void)
 	{
 		ReplicationSlot *s;
 		XLogRecPtr	restart_lsn;
+		XLogRecPtr	restart_lsn_flushed;
 		bool		invalidated;
+		ReplicationSlotPersistency persistency;
 
 		s = &ReplicationSlotCtl->replication_slots[i];
 
@@ -1207,14 +1218,20 @@ ReplicationSlotsComputeLogicalRestartLSN(void)
 
 		/* read once, it's ok if it increases while we're checking */
 		SpinLockAcquire(&s->mutex);
-		restart_lsn = s->data.restart_lsn;
+		persistency = s->data.persistency;
+		restart_lsn = s->restart_lsn_flushed;
 		invalidated = s->data.invalidated != RS_INVAL_NONE;
+		restart_lsn_flushed = s->restart_lsn_flushed;
 		SpinLockRelease(&s->mutex);
 
 		/* invalidated slots need not apply */
 		if (invalidated)
 			continue;
 
+		/* truncate WAL for persistent slots by flushed restart_lsn */
+		if (persistency == RS_PERSISTENT)
+			restart_lsn = restart_lsn_flushed;
+
 		if (restart_lsn == InvalidXLogRecPtr)
 			continue;
 
@@ -1432,6 +1449,7 @@ ReplicationSlotReserveWal(void)
 
 	Assert(slot != NULL);
 	Assert(slot->data.restart_lsn == InvalidXLogRecPtr);
+	Assert(slot->restart_lsn_flushed == InvalidXLogRecPtr);
 
 	/*
 	 * The replication slot mechanism is used to prevent removal of required
@@ -1607,6 +1625,8 @@ InvalidatePossiblyObsoleteSlot(ReplicationSlotInvalidationCause cause,
 		 */
 		SpinLockAcquire(&s->mutex);
 
+		Assert(s->data.restart_lsn >= s->restart_lsn_flushed);
+
 		restart_lsn = s->data.restart_lsn;
 
 		/* we do nothing if the slot is already invalid */
@@ -1691,7 +1711,10 @@ InvalidatePossiblyObsoleteSlot(ReplicationSlotInvalidationCause cause,
 			 * just rely on .invalidated.
 			 */
 			if (invalidation_cause == RS_INVAL_WAL_REMOVED)
+			{
 				s->data.restart_lsn = InvalidXLogRecPtr;
+				s->restart_lsn_flushed = InvalidXLogRecPtr;
+			}
 
 			/* Let caller know */
 			*invalidated = true;
@@ -2189,6 +2212,7 @@ SaveSlotToPath(ReplicationSlot *slot, const char *dir, int elevel)
 	if (!slot->just_dirtied)
 		slot->dirty = false;
 	slot->last_saved_confirmed_flush = cp.slotdata.confirmed_flush;
+	slot->restart_lsn_flushed = cp.slotdata.restart_lsn;
 	SpinLockRelease(&slot->mutex);
 
 	LWLockRelease(&slot->io_in_progress_lock);
@@ -2386,6 +2410,7 @@ RestoreSlotFromDisk(const char *name)
 		slot->effective_xmin = cp.slotdata.xmin;
 		slot->effective_catalog_xmin = cp.slotdata.catalog_xmin;
 		slot->last_saved_confirmed_flush = cp.slotdata.confirmed_flush;
+		slot->restart_lsn_flushed = cp.slotdata.restart_lsn;
 
 		slot->candidate_catalog_xmin = InvalidTransactionId;
 		slot->candidate_xmin_lsn = InvalidXLogRecPtr;
diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c
index 371eef3ddd..03cdce23f0 100644
--- a/src/backend/replication/walsender.c
+++ b/src/backend/replication/walsender.c
@@ -2329,6 +2329,7 @@ static void
 PhysicalConfirmReceivedLocation(XLogRecPtr lsn)
 {
 	bool		changed = false;
+	XLogRecPtr	restart_lsn_flushed;
 	ReplicationSlot *slot = MyReplicationSlot;
 
 	Assert(lsn != InvalidXLogRecPtr);
@@ -2336,6 +2337,7 @@ PhysicalConfirmReceivedLocation(XLogRecPtr lsn)
 	if (slot->data.restart_lsn != lsn)
 	{
 		changed = true;
+		restart_lsn_flushed = slot->restart_lsn_flushed;
 		slot->data.restart_lsn = lsn;
 	}
 	SpinLockRelease(&slot->mutex);
@@ -2343,6 +2345,17 @@ PhysicalConfirmReceivedLocation(XLogRecPtr lsn)
 	if (changed)
 	{
 		ReplicationSlotMarkDirty();
+
+		/* Save the replication slot on disk in case of its flushed restart_lsn
+		 * is invalid. Slots with invalid restart lsn are ignored when
+		 * calculating required LSN. Once we started to keep the WAL by flushed
+		 * restart LSN, we should save to disk an initial valid value.
+		 */
+		if (slot->data.persistency == RS_PERSISTENT) {
+			if (restart_lsn_flushed == InvalidXLogRecPtr && lsn != InvalidXLogRecPtr)
+				ReplicationSlotSave();
+		}
+
 		ReplicationSlotsComputeRequiredLSN();
 		PhysicalWakeupLogicalWalSnd();
 	}
diff --git a/src/include/replication/slot.h b/src/include/replication/slot.h
index 45582cf9d8..ca4c3aab3b 100644
--- a/src/include/replication/slot.h
+++ b/src/include/replication/slot.h
@@ -207,6 +207,10 @@ typedef struct ReplicationSlot
 
 	/* The time since the slot has become inactive */
 	TimestampTz inactive_since;
+
+	/* Latest restart LSN that was flushed to disk */
+	XLogRecPtr restart_lsn_flushed;
+
 } ReplicationSlot;
 
 #define SlotIsPhysical(slot) ((slot)->data.database == InvalidOid)
-- 
2.34.1

#4Vitaly Davydov
v.davydov@postgrespro.ru
In reply to: Vitaly Davydov (#3)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

Dear Hackers,
 
To ping the topic, I'd like to clarify what may be wrong with the idea described here, because I do not see any interest from the community. The topic is related to physical replication. The primary idea is to define the horizon of WAL segments (files) removal based on saved on disk restart LSN values. Now, the WAL segment removal horizon is calculated based on the current restart LSN values of slots, that can not be saved on disk at the time of the horizon calculation. The case take place when a slot is advancing during checkpoint as described earlier in the topic.
 
Such behaviour is not a problem when slots are used only for physical replication in a conventional way. But it may be a problem when physical slot is used for some other goals. For example, I have an extension which keeps the WAL using physical replication slots. It creates a new physical slot and advances it as needed. After restart, it can use restart lsn of the slot to read WAL from this LSN. In this case, there is no guarantee that restart lsn will point to an existing WAL segment.
 
The advantage of the current behaviour is that it requires a little bit less WAL to keep. The disadvantage is that physical slots do not guarantee WAL keeping starting from its' restart lsns in general.
 
I would be happy to get some advice, whether I am on the right or wrong way.  Thank you in advance.
 
With best regards,
Vitaly

On Thursday, November 07, 2024 16:30 MSK, "Vitaly Davydov" <v.davydov@postgrespro.ru> wrote:
 
Dear Hackers,
 
I'd like to introduce an improved version of my patch (see the attached file). My original idea was to take into account saved on disk restart_lsn (slot→restart_lsn_flushed) for persistent slots when removing WAL segment files. It helps tackle errors like: ERROR: requested WAL segment 000...0AA has already been removed.
 
Improvements:
* flushed_restart_lsn is used only for RS_PERSISTENT slots. * Save physical slot on disk when advancing only once - if restart_lsn_flushed is invalid. It is needed because slots with invalid restart LSN are not used when calculating oldest LSN for WAL truncation. Once restart_lsn becomes valid, it should be saved to disk immediately to update restart_lsn_flushed.
Regression tests seems to be ok except:
* recovery/t/001_stream_rep.pl (checkpoint is needed) * recovery/t/019_replslot_limit.pl (it seems, slot was invalidated, some adjustments are needed) * pg_basebackup/t/020_pg_receivewal.pl (not sure about it)
 
There are some problems:
* More WAL segments may be kept. It may lead to invalidations of slots in some tests (recovery/t/019_replslot_limit.pl). A couple of tests should be adjusted.
 
With best regards,
Vitaly Davydov

On Thursday, October 31, 2024 13:32 MSK, "Vitaly Davydov" <v.davydov@postgrespro.ru> wrote:

 
Sorry, attached the missed patch.

On Thursday, October 31, 2024 13:18 MSK, "Vitaly Davydov" <v.davydov@postgrespro.ru> wrote:

Dear Hackers,
 
I'd like to discuss a problem with replication slots's restart LSN. Physical slots are saved to disk at the beginning of checkpoint. At the end of checkpoint, old WAL segments are recycled or removed from disk, if they are not kept by slot's restart_lsn values.
 
If an existing physical slot is advanced in the middle of checkpoint execution, WAL segments, which are related to saved on disk restart LSN may be removed. It is because the calculation of the replication slot miminal LSN is occured at the end of checkpoint, prior to old WAL segments removal. If to hard stop (pg_stl -m immediate) the postgres instance right after checkpoint and to restart it, the slot's restart_lsn may point to the removed WAL segment. I believe, such behaviour is not good.
 
The doc [0]https://www.postgresql.org/docs/current/logicaldecoding-explanation.html describes that restart_lsn may be set to the some past value after reload. There is a discussion [1]/messages/by-id/059cc53a-8b14-653a-a24d-5f867503b0ee@postgrespro.ru on pghackers where such behaviour is discussed. The main reason of not flushing physical slots on advancing is a performance reason. I'm ok with such behaviour, except of that the corresponding WAL segments should not be removed.
 
I propose to keep WAL segments by saved on disk (flushed) restart_lsn of slots. Add a new field restart_lsn_flushed into ReplicationSlot structure. Copy restart_lsn to restart_lsn_flushed in SaveSlotToPath. It doesn't change the format of storing the slot contents on disk. I attached a patch. It is not yet complete, but demonstate a way to solve the problem.
 
I reproduced the problem by the following way:
* Add some delay in CheckPointBuffers (pg_usleep) to emulate long checkpoint execution. * Execute checkpoint and pg_replication_slot_advance right after starting of the checkpoint from another connection. * Hard restart the server right after checkpoint completion. * After restart slot's restart_lsn may point to removed WAL segment.
The proposed patch fixes it.
 
[0]: https://www.postgresql.org/docs/current/logicaldecoding-explanation.html
[1]: /messages/by-id/059cc53a-8b14-653a-a24d-5f867503b0ee@postgrespro.ru

 

#5Tomas Vondra
tomas@vondra.me
In reply to: Vitaly Davydov (#1)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

On 10/31/24 11:18, Vitaly Davydov wrote:

Dear Hackers,

 

I'd like to discuss a problem with replication slots's restart LSN.
Physical slots are saved to disk at the beginning of checkpoint. At the
end of checkpoint, old WAL segments are recycled or removed from disk,
if they are not kept by slot's restart_lsn values.

I agree that if we can lose WAL still needed for a replication slot,
that is a bug. Retaining the WAL is the primary purpose of slots, and we
just fixed a similar issue for logical replication.

If an existing physical slot is advanced in the middle of checkpoint
execution, WAL segments, which are related to saved on disk restart LSN
may be removed. It is because the calculation of the replication slot
miminal LSN is occured at the end of checkpoint, prior to old WAL
segments removal. If to hard stop (pg_stl -m immediate) the postgres
instance right after checkpoint and to restart it, the slot's
restart_lsn may point to the removed WAL segment. I believe, such
behaviour is not good.

Not sure I 100% follow, but let me rephrase, just so that we're on the
same page. CreateCheckPoint() does this:

... something ...

CheckPointGuts(checkPoint.redo, flags);

... something ...

RemoveOldXlogFiles(_logSegNo, RedoRecPtr, recptr,
checkPoint.ThisTimeLineID);

The slots get synced in CheckPointGuts(), so IIUC you're saying if the
slot gets advanced shortly after the sync, the RemoveOldXlogFiles() may
remove still-needed WAL, because we happen to consider a fresh
restart_lsn when calculating the logSegNo. Is that right?

The doc [0] describes that restart_lsn may be set to the some past value
after reload. There is a discussion [1] on pghackers where such
behaviour is discussed. The main reason of not flushing physical slots
on advancing is a performance reason. I'm ok with such behaviour, except
of that the corresponding WAL segments should not be removed.

I don't know which part of [0] you refer to, but I guess you're
referring to this:

The current position of each slot is persisted only at checkpoint,
so in the case of a crash the slot may return to an earlier LSN,
which will then cause recent changes to be sent again when the
server restarts. Logical decoding clients are responsible for
avoiding ill effects from handling the same message more than once.

Yes, it's fine if we discard the new in-memory restart_lsn value, and we
do this for performance reasons - flushing the slot on every advance
would be very expensive. I haven't read [1] as it's quite long, but I
guess that's what it says.

But we must not make any "permanent" actions based on the unflushed
value, I think. Like, we should not remove WAL segments, for example.

 

I propose to keep WAL segments by saved on disk (flushed) restart_lsn of
slots. Add a new field restart_lsn_flushed into ReplicationSlot
structure. Copy restart_lsn to restart_lsn_flushed in SaveSlotToPath. It
doesn't change the format of storing the slot contents on disk. I
attached a patch. It is not yet complete, but demonstate a way to solve
the problem.

That seems like a possible fix this, yes. And maybe it's the right one.

I reproduced the problem by the following way:

* Add some delay in CheckPointBuffers (pg_usleep) to emulate long
checkpoint execution.
* Execute checkpoint and pg_replication_slot_advance right after
starting of the checkpoint from another connection.
* Hard restart the server right after checkpoint completion.
* After restart slot's restart_lsn may point to removed WAL segment.

The proposed patch fixes it.

I tried to reproduce the issue using a stress test (checkpoint+restart
in a loop), but so far without success :-(

Can you clarify where exactly you added the pg_usleep(), and how long
are the waits you added? I wonder if the sleep is really needed,
considering the checkpoints are spread anyway. Also, what you mean by
"hard reset"?

What confuses me a bit is that we update the restart_lsn (and call
ReplicationSlotsComputeRequiredLSN() to recalculate the global value)
all the time. Walsender does that in PhysicalConfirmReceivedLocation for
example. So we actually see the required LSN to move during checkpoint
very often. So how come we don't see the issues much more often? Surely
I miss something important.

Another option might be that pg_replication_slot_advance() doesn't do
something it should be doing. For example, shouldn't be marking the slot
as dirty?

regards

--
Tomas Vondra

#6Tomas Vondra
tomas@vondra.me
In reply to: Vitaly Davydov (#4)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

On 11/20/24 14:40, Vitaly Davydov wrote:

Dear Hackers,

 

To ping the topic, I'd like to clarify what may be wrong with the idea
described here, because I do not see any interest from the community.
The topic is related to physical replication. The primary idea is to
define the horizon of WAL segments (files) removal based on saved on
disk restart LSN values. Now, the WAL segment removal horizon is
calculated based on the current restart LSN values of slots, that can
not be saved on disk at the time of the horizon calculation. The case
take place when a slot is advancing during checkpoint as described
earlier in the topic.

Yeah, a simple way to fix this might be to make sure we don't use the
required LSN value set after CheckPointReplicationSlots() to remove WAL.
AFAICS the problem is KeepLogSeg() gets the new LSN value by:

keep = XLogGetReplicationSlotMinimumLSN();

Let's say we get the LSN before calling CheckPointGuts(), and then pass
it to KeepLogSeg, so that it doesn't need to get the fresh value.

Wouldn't that fix the issue?

Such behaviour is not a problem when slots are used only for physical
replication in a conventional way. But it may be a problem when physical
slot is used for some other goals. For example, I have an extension
which keeps the WAL using physical replication slots. It creates a new
physical slot and advances it as needed. After restart, it can use
restart lsn of the slot to read WAL from this LSN. In this case, there
is no guarantee that restart lsn will point to an existing WAL segment.

Yeah.

The advantage of the current behaviour is that it requires a little bit
less WAL to keep. The disadvantage is that physical slots do not
guarantee WAL keeping starting from its' restart lsns in general.

If it's wrong, it doesn't really matter it has some advantages.

regards

--
Tomas Vondra

#7Tomas Vondra
tomas@vondra.me
In reply to: Tomas Vondra (#5)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

On 11/20/24 18:24, Tomas Vondra wrote:

...

What confuses me a bit is that we update the restart_lsn (and call
ReplicationSlotsComputeRequiredLSN() to recalculate the global value)
all the time. Walsender does that in PhysicalConfirmReceivedLocation for
example. So we actually see the required LSN to move during checkpoint
very often. So how come we don't see the issues much more often? Surely
I miss something important.

This question "How come we don't see this more often?" kept bugging me,
and the answer is actually pretty simple.

The restart_lsn can move backwards after a hard restart (for the reasons
explained), but physical replication does not actually rely on that. The
replica keeps track of the LSN it received (well, it uses the same LSN),
and on reconnect it sends the startpoint to the primary. And the primary
just proceeds use that instead of the (stale) restart LSN for the slot.
And the startpoint is guaranteed (I think) to be at least restart_lsn.

AFAICS this would work for pg_replication_slot_advance() too, that is if
you remember the last LSN the slot advanced to, it should be possible to
advance to it just fine. Of course, it requires a way to remember that
LSN, which for a replica is not an issue. But this just highlights we
can't rely on restart_lsn for this purpose.

(Apologies if this repeats something obvious, or something you already
said, Vitaly.)

regards

--
Tomas Vondra

#8Tomas Vondra
tomas@vondra.me
In reply to: Tomas Vondra (#7)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

On 11/20/24 23:19, Tomas Vondra wrote:

On 11/20/24 18:24, Tomas Vondra wrote:

...

What confuses me a bit is that we update the restart_lsn (and call
ReplicationSlotsComputeRequiredLSN() to recalculate the global value)
all the time. Walsender does that in PhysicalConfirmReceivedLocation for
example. So we actually see the required LSN to move during checkpoint
very often. So how come we don't see the issues much more often? Surely
I miss something important.

This question "How come we don't see this more often?" kept bugging me,
and the answer is actually pretty simple.

The restart_lsn can move backwards after a hard restart (for the reasons
explained), but physical replication does not actually rely on that. The
replica keeps track of the LSN it received (well, it uses the same LSN),
and on reconnect it sends the startpoint to the primary. And the primary
just proceeds use that instead of the (stale) restart LSN for the slot.
And the startpoint is guaranteed (I think) to be at least restart_lsn.

AFAICS this would work for pg_replication_slot_advance() too, that is if
you remember the last LSN the slot advanced to, it should be possible to
advance to it just fine. Of course, it requires a way to remember that
LSN, which for a replica is not an issue. But this just highlights we
can't rely on restart_lsn for this purpose.

I kept thinking about this (sorry it's this incremental), particularly
if this applies to logical replication too. And AFAICS it does not, or
at least not to this extent.

For streaming, the subscriber sends the startpoint (just like physical
replication), so it should be protected too.

But then there's the SQL API - pg_logical_slot_get_changes(). And it
turns out it ends up syncing the slot to disk pretty often, because for
RUNNING_XACTS we call LogicalDecodingProcessRecord() + standby_decode(),
which ends up calling SaveSlotToDisk(). And at the end we call
LogicalConfirmReceivedLocation() for good measure, which saves the slot
too, just to be sure.

FWIW I suspect this still is not perfectly safe, because we may still
crash / restart before the updated data.restart_lsn makes it to disk,
but after it was already used to remove old WAL, although that's
probably harder to hit. With streaming the subscriber will still send us
the new startpoint, so that should not fail I think. But with the SQL
API we probably can get into the "segment already removed" issues.

I haven't tried reproducing this yet, I guess it should be possible
using the injection points. Not sure when I get to this, though.

In any case, doesn't this suggest SaveSlotToDisk() really is not that
expensive, if we do it pretty often for logical replication? Which was
presented as the main reason why pg_replication_slot_advance() doesn't
do that. Maybe it should?

If the advance is substantial I don't think it really matters, because
there simply can't be that many of large advances. It amortizes, in a
way. But even with smaller advances it should be fine, I think - if the
goal is to not remove WAL prematurely, it's enough to flush when we move
to the next segment.

regards

--
Tomas Vondra

#9Vitaly Davydov
v.davydov@postgrespro.ru
In reply to: Tomas Vondra (#5)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

Hi Tomas,
 
Thank you for the reply and your interest to the investigation.

On Wednesday, November 20, 2024 20:24 MSK, Tomas Vondra <tomas@vondra.me> wrote:
 

If an existing physical slot is advanced in the middle of checkpoint
execution, WAL segments, which are related to saved on disk restart LSN
may be removed. It is because the calculation of the replication slot
miminal LSN is occured at the end of checkpoint, prior to old WAL
segments removal. If to hard stop (pg_stl -m immediate) the postgres
instance right after checkpoint and to restart it, the slot's
restart_lsn may point to the removed WAL segment. I believe, such
behaviour is not good.
 

Not sure I 100% follow, but let me rephrase, just so that we're on the
same page. CreateCheckPoint() does this:

... something ...

CheckPointGuts(checkPoint.redo, flags);

... something ...

RemoveOldXlogFiles(_logSegNo, RedoRecPtr, recptr,
checkPoint.ThisTimeLineID);

The slots get synced in CheckPointGuts(), so IIUC you're saying if the
slot gets advanced shortly after the sync, the RemoveOldXlogFiles() may
remove still-needed WAL, because we happen to consider a fresh
restart_lsn when calculating the logSegNo. Is that right?
They key action here is to restart the instance with -m immediate (or kill it and start it again) right after checkpoint. After restart, the slot's restart_lsn will be read from the disk and address to the removed WAL segment, if it's LSN was davanced enought to switch to a new WAL segment.
 

I tried to reproduce the issue using a stress test (checkpoint+restart
in a loop), but so far without success :-(

Can you clarify where exactly you added the pg_usleep(), and how long
are the waits you added? I wonder if the sleep is really needed,
considering the checkpoints are spread anyway. Also, what you mean by
"hard reset"?
 
I added pg_usleep as show below (in CheckPointBuffers function):
 
CheckPointBuffers(int flags)
{
    BufferSync(flags);
+    pg_usleep(10000000);
}
 
Below is the instruction how I run my test (pg_usleep should be added to the code):
 
CONSOLE> initdb -D pgdata
CONSOLE> pg_ctl -D pgdata -l logfile start
... open two psql terminals and connect to the database (lets call them as PSQL-1, PSQL-2)
PSQL-1>  select pg_create_physical_replication_slot('myslot', true, false);
CONSOLE> pgbench -i -s 10 postgres # create some WAL records
PSQL-1>  checkpoint; -- press ENTER key and go to PSQL-2 console and execute next line in 1 second
PSQL-2>  select pg_replication_slot_advance('myslot', pg_current_wal_lsn()); -- advance repslot during checkpoint
... wait for checkpoint to complete
CONSOLE> pg_ctl -D pgdata -m immediate stop 
CONSOLE> pg_ctl -D pgdata start
PSQL-1>  \c
PSQL-1>  create extension pg_walinspect;
PSQL-1>  select pg_get_wal_record_info(restart_lsn) from pg_replication_slots where slot_name = 'myslot';
ERROR:  requested WAL segment pg_wal/000000010000000000000001 has already been removed
 
I'm trying to create a perl test to reproduce it. Please, give me some time to create the test script.
 
I kept thinking about this (sorry it's this incremental), particularly
if this applies to logical replication too. And AFAICS it does not, or
at least not to this extent.
 
Yes, it is not applied to logical replication, because logical slot is synced when advancing.
 
eah, a simple way to fix this might be to make sure we don't use the
required LSN value set after CheckPointReplicationSlots() to remove WAL.
AFAICS the problem is KeepLogSeg() gets the new LSN value by:

keep = XLogGetReplicationSlotMinimumLSN();

Let's say we get the LSN before calling CheckPointGuts(), and then pass
it to KeepLogSeg, so that it doesn't need to get the fresh value.
 
Yes, it is another solution and it can fix the problem. The question - which solution to choose. Well, I prefer to add a new in-memory state variable in the slot structure. Such variable may be useful if we want to check whether the slot data is synced or not. The calculation of the keep value before CheckPointGuts(), IMHO, requires to change signatures of a number of functions. I may prepare a new patch where your solution is implemented.
 
I'm sorry, if I missed to answer to some other questions. I will answer later.
 
With best regards,
Vitaly

 

#10Давыдов Виталий
v.davydov@postgrespro.ru
In reply to: Vitaly Davydov (#9)
1 attachment(s)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

On Thursday, November 21, 2024 17:56 MSK, "Vitaly Davydov" <v.davydov@postgrespro.ru> wrote:

I'm trying to create a perl test to reproduce it. Please, give me some time to create the test script.

Attached is the test script which reproduces my problem. It should be run on a patched postgresql with the following changes (see below). It is the easiest way to emulate long checkpoint during high load.

CheckPointBuffers(int flags)
{
BufferSync(flags);
+ pg_usleep(10000000);
}

I used the following command line to run the script, where <postgresqldir> - the directory with postgresql sources. The module IPC::Run should be installed as well. PATH and LD_LIBRARY_PATH should be set to a proper postgresql binary and libraries as well.

perl -I <postgresqldir>/src/test/perl/ restartlsn.pl

Finally, it should produce the following error into the log:

error running SQL: 'psql:<stdin>:1: ERROR: requested WAL segment pg_wal/000000010000000000000001 has already been removed'

With best regards,
Vitaly

Attachments:

restartlsn.plapplication/x-perlDownload
#11Tomas Vondra
tomas@vondra.me
In reply to: Tomas Vondra (#8)
2 attachment(s)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

On 11/21/24 14:59, Tomas Vondra wrote:

...

But then there's the SQL API - pg_logical_slot_get_changes(). And it
turns out it ends up syncing the slot to disk pretty often, because for
RUNNING_XACTS we call LogicalDecodingProcessRecord() + standby_decode(),
which ends up calling SaveSlotToDisk(). And at the end we call
LogicalConfirmReceivedLocation() for good measure, which saves the slot
too, just to be sure.

FWIW I suspect this still is not perfectly safe, because we may still
crash / restart before the updated data.restart_lsn makes it to disk,
but after it was already used to remove old WAL, although that's
probably harder to hit. With streaming the subscriber will still send us
the new startpoint, so that should not fail I think. But with the SQL
API we probably can get into the "segment already removed" issues.

I haven't tried reproducing this yet, I guess it should be possible
using the injection points. Not sure when I get to this, though.

I kept pulling on this loose thread, and the deeper I look the more I'm
concvinced ReplicationSlotsComputeRequiredLSN() is fundamentally unsafe.
I may be missing something, of course, in which case I'd be grateful if
someone could correct me.

I believe the main problem is that ReplicationSlotsComputeRequiredLSN()
operates on data that may not be on-disk yet. It just iterates over
slots in shared memory, looks at the data.restart_lsn, and rolls with
that. So some of the data may be lost after a crash or "immediate"
restart, which for restart_lsn means it can move backwards by some
unknown amount.

Unfortunately, some of the callers use the value as if it was durable,
and do irreversible actions based on it. This whole thread is about
checkpointer using the value to discard WAL supposedly not required by
any slot, only to find out we're missing WAL.

That seems like a rather fundamental problem, and the only reason why we
don't see this causing trouble more often is that (a) abrupt restarts
are not very common, (b) most slots are likely not lagging very much,
and thus not in danger of actually losing WAL, and (c) the streaming
replication tracks startpoint, which masks the issue.

But with the SQL API it's quite simple to cause issues with the right
timing, as I'll show in a bit.

There's an interesting difference in how different places update the
slot. For example LogicalConfirmReceivedLocation() does this:

1) update slot->data.restart_lsn
2) mark slot dirty: ReplicationSlotMarkDirty()
3) save slot to disk: ReplicationSlotSave()
4) recalculate required LSN: ReplicationSlotsComputeRequiredLSN()

while pg_replication_slot_advance() does only this:

1) update slot->data.restart_lsn
2) mark slot dirty: ReplicationSlotMarkDirty()
3) recalculate required LSN: ReplicationSlotsComputeRequiredLSN()

That is, it doesn't save the slot to disk. It just updates the LSN and
them proceeds to recalculate the "required LSN" for all slots. That
makes is very easy to hit the issue, as demonstrated by Vitaly.

However, it doesn't mean LogicalConfirmReceivedLocation() is safe. It
would be safe without concurrency, but it can happen that the logical
decoding does (1) and maybe (2), but before the slot gets persisted,
some other session gets to call ReplicationSlotsComputeRequiredLSN().

It might be logical decoding on another slot, or advance of a physical
slot. I haven't checked what else can trigger that.

So ultimately logical slots have exactly the same issue.

Attached are two patches, demonstrating the issue. 0001 adds injection
points into two places - before (2) in LogicalConfirmReceivedLocation,
and before removal of old WAL in a checkpoint. 0002 then adds a simple
TAP test triggering the issue in pg_logical_slot_get_changes(), leading to:

ERROR: requested WAL segment pg_wal/000000010000000000000001 has
already been removed

The same issue could be demonstrated on a physical slot - it would
actually be simpler, I think.

I've been unable to cause issues for streaming replication (both
physical and logical), because the subscriber sends startpoint which
adjusts the restart_lsn to a "good" value. But I'm not sure if that's
reliable in all cases, or if the replication could break too.

It's entirely possible this behavior is common knowledge, but it was a
surprise for me. Even if the streaming replication is safe, it does seem
to make using the SQL functions less reliable (not that it doesn't have
other challenges, e.g. with Ctrl-C). But maybe it could be made safer?

I don't have a great idea how to improve this. It seems wrong for
ReplicationSlotsComputeRequiredLSN() to calculate the LSN using values
from dirty slots, so maybe it should simply retry if any slot is dirty?
Or retry on that one slot? But various places update the restart_lsn
before marking the slot as dirty, so right now this won't work.

regards

--
Tomas Vondra

Attachments:

0002-TAP-test.patchtext/x-patch; charset=UTF-8; name=0002-TAP-test.patchDownload
From 79a045728b09237234f23130a2a710e1bdde7870 Mon Sep 17 00:00:00 2001
From: Tomas Vondra <tomas@vondra.me>
Date: Thu, 21 Nov 2024 23:07:22 +0100
Subject: [PATCH 2/2] TAP test

---
 src/test/modules/test_required_lsn/Makefile   |  18 +++
 .../modules/test_required_lsn/meson.build     |  15 +++
 .../test_required_lsn/t/001_logical_slot.pl   | 126 ++++++++++++++++++
 3 files changed, 159 insertions(+)
 create mode 100644 src/test/modules/test_required_lsn/Makefile
 create mode 100644 src/test/modules/test_required_lsn/meson.build
 create mode 100644 src/test/modules/test_required_lsn/t/001_logical_slot.pl

diff --git a/src/test/modules/test_required_lsn/Makefile b/src/test/modules/test_required_lsn/Makefile
new file mode 100644
index 00000000000..3eb2b02d38f
--- /dev/null
+++ b/src/test/modules/test_required_lsn/Makefile
@@ -0,0 +1,18 @@
+# src/test/modules/test_required_lsn/Makefile
+
+EXTRA_INSTALL=src/test/modules/injection_points \
+	contrib/test_decoding
+
+export enable_injection_points
+TAP_TESTS = 1
+
+ifdef USE_PGXS
+PG_CONFIG = pg_config
+PGXS := $(shell $(PG_CONFIG) --pgxs)
+include $(PGXS)
+else
+subdir = src/test/modules/test_required_lsn
+top_builddir = ../../../..
+include $(top_builddir)/src/Makefile.global
+include $(top_srcdir)/contrib/contrib-global.mk
+endif
diff --git a/src/test/modules/test_required_lsn/meson.build b/src/test/modules/test_required_lsn/meson.build
new file mode 100644
index 00000000000..99ef3a60a4e
--- /dev/null
+++ b/src/test/modules/test_required_lsn/meson.build
@@ -0,0 +1,15 @@
+# Copyright (c) 2022-2024, PostgreSQL Global Development Group
+
+tests += {
+  'name': 'test_required_lsn',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'env': {
+       'enable_injection_points': get_option('injection_points') ? 'yes' : 'no',
+    },
+    'tests': [
+      't/001_logical_replication.pl'
+    ],
+  },
+}
diff --git a/src/test/modules/test_required_lsn/t/001_logical_slot.pl b/src/test/modules/test_required_lsn/t/001_logical_slot.pl
new file mode 100644
index 00000000000..41261f4aa6b
--- /dev/null
+++ b/src/test/modules/test_required_lsn/t/001_logical_slot.pl
@@ -0,0 +1,126 @@
+# Copyright (c) 2024, PostgreSQL Global Development Group
+
+# This test verifies edge case of reading a multixact:
+# when we have multixact that is followed by exactly one another multixact,
+# and another multixact have no offset yet, we must wait until this offset
+# becomes observable. Previously we used to wait for 1ms in a loop in this
+# case, but now we use CV for this. This test is exercising such a sleep.
+
+use strict;
+use warnings FATAL => 'all';
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+
+use Test::More;
+
+if ($ENV{enable_injection_points} ne 'yes')
+{
+	plan skip_all => 'Injection points not supported by this build';
+}
+
+my ($node, $result);
+
+$node = PostgreSQL::Test::Cluster->new('mike');
+$node->init;
+$node->append_conf('postgresql.conf',
+	"shared_preload_libraries = 'injection_points'");
+$node->append_conf('postgresql.conf',
+	"wal_level = 'logical'");
+$node->start;
+$node->safe_psql('postgres', q(CREATE EXTENSION injection_points));
+
+# create a simple table to generate data into
+$node->safe_psql('postgres',
+	q{create table t (id serial primary key, b text)});
+
+# create the two slots we'll need
+$node->safe_psql('postgres',
+	q{select pg_create_logical_replication_slot('slot_logical', 'test_decoding')});
+$node->safe_psql('postgres',
+	q{select pg_create_physical_replication_slot('slot_physical', true)});
+
+# advance both to current position, just to have everything "valid"
+$node->safe_psql('postgres',
+	q{select count(*) from pg_logical_slot_get_changes('slot_logical', null, null)});
+$node->safe_psql('postgres',
+	q{select pg_replication_slot_advance('slot_physical', pg_current_wal_lsn())});
+
+# run checkpoint, to flush current state to disk and set a baseline
+$node->safe_psql('postgres', q{checkpoint});
+
+# generate transactions to get RUNNING_XACTS
+my $xacts = $node->background_psql('postgres');
+$xacts->query_until(qr/run_xacts/,
+q(\echo run_xacts
+SELECT 1 \watch 0.1
+\q
+));
+
+# insert 2M rows, that's about 260MB (~20 segments) worth of WAL
+$node->safe_psql('postgres',
+	q{insert into t (b) select md5(i::text) from generate_series(1,1000000) s(i)});
+
+# run another checkpoint, to set a new restore LSN
+$node->safe_psql('postgres', q{checkpoint});
+
+# another 2M rows, that's about 260MB (~20 segments) worth of WAL
+$node->safe_psql('postgres',
+	q{insert into t (b) select md5(i::text) from generate_series(1,1000000) s(i)});
+
+# run another checkpoint, this time in the background, and make it wait
+# on the injection point), so that the checkpoint stops right before
+# removing old WAL segments
+print('starting checkpoint\n');
+
+my $checkpoint = $node->background_psql('postgres');
+$checkpoint->query_safe(q(select injection_points_attach('checkpoint-before-old-wal-removal','wait')));
+$checkpoint->query_until(qr/starting_checkpoint/,
+q(\echo starting_checkpoint
+checkpoint;
+\q
+));
+
+print('waiting for injection_point\n');
+# wait until the checkpoint stops right before removing WAL segments
+$node->wait_for_event('checkpointer', 'checkpoint-before-old-wal-removal');
+
+
+# try to advance the logical slot, but make it stop when it moves to the
+# next WAL segment (has to happen in the background too)
+my $logical = $node->background_psql('postgres');
+$logical->query_safe(q{select injection_points_attach('logical-replication-slot-advance-segment','wait');});
+$logical->query_until(qr/get_changes/,
+q(
+\echo get_changes
+select count(*) from pg_logical_slot_get_changes('slot_logical', null, null) \watch 1
+\q
+));
+
+
+# wait until the checkpoint stops right before removing WAL segments
+$node->wait_for_event('client backend', 'logical-replication-slot-advance-segment');
+
+
+# OK, we're in the right situation,  time to advance the physical slot,
+# which recalculates the required LSN, and then unblock the checkpoint,
+# which removes the WAL still needed by the logical slot
+$node->safe_psql('postgres',
+	q{select pg_replication_slot_advance('slot_physical', pg_current_wal_lsn())});
+
+$node->safe_psql('postgres',
+	q{select injection_points_wakeup('checkpoint-before-old-wal-removal')});
+
+# abruptly stop the server (1 second should be enough for the checkpoint
+# to finish, would be better )
+$node->stop('immediate');
+
+$node->start;
+
+$node->safe_psql('postgres', q{select count(*) from pg_logical_slot_get_changes('slot_logical', null, null);});
+
+$node->stop;
+
+# If we reached this point - everything is OK.
+ok(1);
+done_testing();
-- 
2.47.0

0001-injection-points.patchtext/x-patch; charset=UTF-8; name=0001-injection-points.patchDownload
From eef5f02a5c22ccc520c20623d70eaf093a039f09 Mon Sep 17 00:00:00 2001
From: Tomas Vondra <tomas@vondra.me>
Date: Thu, 21 Nov 2024 20:37:00 +0100
Subject: [PATCH 1/2] injection points

---
 src/backend/access/transam/xlog.c         |  4 ++++
 src/backend/replication/logical/logical.c | 18 ++++++++++++++++++
 2 files changed, 22 insertions(+)

diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index 6f58412bcab..8f9629866c3 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -7310,6 +7310,10 @@ CreateCheckPoint(int flags)
 	if (PriorRedoPtr != InvalidXLogRecPtr)
 		UpdateCheckPointDistanceEstimate(RedoRecPtr - PriorRedoPtr);
 
+#ifdef USE_INJECTION_POINTS
+	INJECTION_POINT("checkpoint-before-old-wal-removal");
+#endif
+
 	/*
 	 * Delete old log files, those no longer needed for last checkpoint to
 	 * prevent the disk holding the xlog from growing full.
diff --git a/src/backend/replication/logical/logical.c b/src/backend/replication/logical/logical.c
index e941bb491d8..569c1925ecc 100644
--- a/src/backend/replication/logical/logical.c
+++ b/src/backend/replication/logical/logical.c
@@ -30,6 +30,7 @@
 
 #include "access/xact.h"
 #include "access/xlogutils.h"
+#include "access/xlog_internal.h"
 #include "fmgr.h"
 #include "miscadmin.h"
 #include "pgstat.h"
@@ -41,6 +42,7 @@
 #include "storage/proc.h"
 #include "storage/procarray.h"
 #include "utils/builtins.h"
+#include "utils/injection_point.h"
 #include "utils/inval.h"
 #include "utils/memutils.h"
 
@@ -1844,9 +1846,13 @@ LogicalConfirmReceivedLocation(XLogRecPtr lsn)
 	{
 		bool		updated_xmin = false;
 		bool		updated_restart = false;
+		XLogRecPtr	restart_lsn;
 
 		SpinLockAcquire(&MyReplicationSlot->mutex);
 
+		/* remember the old restart lsn */
+		restart_lsn = MyReplicationSlot->data.restart_lsn;
+
 		MyReplicationSlot->data.confirmed_flush = lsn;
 
 		/* if we're past the location required for bumping xmin, do so */
@@ -1888,6 +1894,18 @@ LogicalConfirmReceivedLocation(XLogRecPtr lsn)
 		/* first write new xmin to disk, so we know what's up after a crash */
 		if (updated_xmin || updated_restart)
 		{
+#ifdef USE_INJECTION_POINTS
+			XLogSegNo	seg1,
+						seg2;
+
+			XLByteToSeg(restart_lsn, seg1, wal_segment_size);
+			XLByteToSeg(MyReplicationSlot->data.restart_lsn, seg2, wal_segment_size);
+
+			/* trigger injection point, but only if segment changes */
+			if (seg1 != seg2)
+				INJECTION_POINT("logical-replication-slot-advance-segment");
+#endif
+
 			ReplicationSlotMarkDirty();
 			ReplicationSlotSave();
 			elog(DEBUG1, "updated xmin: %u restart: %u", updated_xmin, updated_restart);
-- 
2.47.0

#12Vitaly Davydov
v.davydov@postgrespro.ru
In reply to: Tomas Vondra (#11)
2 attachment(s)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

On 11/21/24 14:59, Tomas Vondra wrote:

I don't have a great idea how to improve this. It seems wrong for
ReplicationSlotsComputeRequiredLSN() to calculate the LSN using values
from dirty slots, so maybe it should simply retry if any slot is dirty?
Or retry on that one slot? But various places update the restart_lsn
before marking the slot as dirty, so right now this won't work.

To ping the topic, I would like to propose a new version of my patch. All the check-world tests seems to pass ok.

The idea of the patch is pretty simple - keep flushed restart_lsn in memory and use this value to calculate required lsn in ReplicationSlotsComputeRequiredLSN().

One note - if restart_lsn_flushed is invalid, the restart_lsn value will be used. If we take invalid restart_lsn_flushed instead of valid restart_lsn the slot will be skipped. At the moment I have no other ideas how to deal with invalid restart_lsn_flushed.

With best regards,
Vitaly

Attachments:

0001-Keep-WAL-segments-by-slot-s-flushed-restart-LSN.patchtext/x-patchDownload
From a6fb33969213e5f5dd994853ac052df64372b85f Mon Sep 17 00:00:00 2001
From: Vitaly Davydov <v.davydov@postgrespro.ru>
Date: Thu, 31 Oct 2024 12:29:12 +0300
Subject: [PATCH 1/2] Keep WAL segments by slot's flushed restart LSN

---
 src/backend/replication/slot.c      | 37 +++++++++++++++++++++++++++++
 src/backend/replication/walsender.c | 13 ++++++++++
 src/include/replication/slot.h      |  4 ++++
 3 files changed, 54 insertions(+)

diff --git a/src/backend/replication/slot.c b/src/backend/replication/slot.c
index 4a206f9527..c3c44fe9f8 100644
--- a/src/backend/replication/slot.c
+++ b/src/backend/replication/slot.c
@@ -409,6 +409,7 @@ ReplicationSlotCreate(const char *name, bool db_specific,
 	slot->candidate_restart_valid = InvalidXLogRecPtr;
 	slot->candidate_restart_lsn = InvalidXLogRecPtr;
 	slot->last_saved_confirmed_flush = InvalidXLogRecPtr;
+	slot->restart_lsn_flushed = InvalidXLogRecPtr;
 	slot->inactive_since = 0;
 
 	/*
@@ -1142,20 +1143,34 @@ ReplicationSlotsComputeRequiredLSN(void)
 	{
 		ReplicationSlot *s = &ReplicationSlotCtl->replication_slots[i];
 		XLogRecPtr	restart_lsn;
+		XLogRecPtr	restart_lsn_flushed;
 		bool		invalidated;
+		ReplicationSlotPersistency persistency;
 
 		if (!s->in_use)
 			continue;
 
 		SpinLockAcquire(&s->mutex);
+		persistency = s->data.persistency;
 		restart_lsn = s->data.restart_lsn;
 		invalidated = s->data.invalidated != RS_INVAL_NONE;
+		restart_lsn_flushed = s->restart_lsn_flushed;
 		SpinLockRelease(&s->mutex);
 
 		/* invalidated slots need not apply */
 		if (invalidated)
 			continue;
 
+		/* truncate WAL for persistent slots by flushed restart_lsn */
+		if (persistency == RS_PERSISTENT)
+		{
+			if (restart_lsn_flushed != InvalidXLogRecPtr &&
+				restart_lsn > restart_lsn_flushed)
+			{
+				restart_lsn = restart_lsn_flushed;
+			}
+		}
+
 		if (restart_lsn != InvalidXLogRecPtr &&
 			(min_required == InvalidXLogRecPtr ||
 			 restart_lsn < min_required))
@@ -1193,7 +1208,9 @@ ReplicationSlotsComputeLogicalRestartLSN(void)
 	{
 		ReplicationSlot *s;
 		XLogRecPtr	restart_lsn;
+		XLogRecPtr	restart_lsn_flushed;
 		bool		invalidated;
+		ReplicationSlotPersistency persistency;
 
 		s = &ReplicationSlotCtl->replication_slots[i];
 
@@ -1207,14 +1224,26 @@ ReplicationSlotsComputeLogicalRestartLSN(void)
 
 		/* read once, it's ok if it increases while we're checking */
 		SpinLockAcquire(&s->mutex);
+		persistency = s->data.persistency;
 		restart_lsn = s->data.restart_lsn;
 		invalidated = s->data.invalidated != RS_INVAL_NONE;
+		restart_lsn_flushed = s->restart_lsn_flushed;
 		SpinLockRelease(&s->mutex);
 
 		/* invalidated slots need not apply */
 		if (invalidated)
 			continue;
 
+		/* truncate WAL for persistent slots by flushed restart_lsn */
+		if (persistency == RS_PERSISTENT)
+		{
+			if (restart_lsn_flushed != InvalidXLogRecPtr &&
+				restart_lsn > restart_lsn_flushed)
+			{
+				restart_lsn = restart_lsn_flushed;
+			}
+		}
+
 		if (restart_lsn == InvalidXLogRecPtr)
 			continue;
 
@@ -1432,6 +1461,7 @@ ReplicationSlotReserveWal(void)
 
 	Assert(slot != NULL);
 	Assert(slot->data.restart_lsn == InvalidXLogRecPtr);
+	Assert(slot->restart_lsn_flushed == InvalidXLogRecPtr);
 
 	/*
 	 * The replication slot mechanism is used to prevent removal of required
@@ -1607,6 +1637,8 @@ InvalidatePossiblyObsoleteSlot(ReplicationSlotInvalidationCause cause,
 		 */
 		SpinLockAcquire(&s->mutex);
 
+		Assert(s->data.restart_lsn >= s->restart_lsn_flushed);
+
 		restart_lsn = s->data.restart_lsn;
 
 		/* we do nothing if the slot is already invalid */
@@ -1691,7 +1723,10 @@ InvalidatePossiblyObsoleteSlot(ReplicationSlotInvalidationCause cause,
 			 * just rely on .invalidated.
 			 */
 			if (invalidation_cause == RS_INVAL_WAL_REMOVED)
+			{
 				s->data.restart_lsn = InvalidXLogRecPtr;
+				s->restart_lsn_flushed = InvalidXLogRecPtr;
+			}
 
 			/* Let caller know */
 			*invalidated = true;
@@ -2189,6 +2224,7 @@ SaveSlotToPath(ReplicationSlot *slot, const char *dir, int elevel)
 	if (!slot->just_dirtied)
 		slot->dirty = false;
 	slot->last_saved_confirmed_flush = cp.slotdata.confirmed_flush;
+	slot->restart_lsn_flushed = cp.slotdata.restart_lsn;
 	SpinLockRelease(&slot->mutex);
 
 	LWLockRelease(&slot->io_in_progress_lock);
@@ -2386,6 +2422,7 @@ RestoreSlotFromDisk(const char *name)
 		slot->effective_xmin = cp.slotdata.xmin;
 		slot->effective_catalog_xmin = cp.slotdata.catalog_xmin;
 		slot->last_saved_confirmed_flush = cp.slotdata.confirmed_flush;
+		slot->restart_lsn_flushed = cp.slotdata.restart_lsn;
 
 		slot->candidate_catalog_xmin = InvalidTransactionId;
 		slot->candidate_xmin_lsn = InvalidXLogRecPtr;
diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c
index 371eef3ddd..03cdce23f0 100644
--- a/src/backend/replication/walsender.c
+++ b/src/backend/replication/walsender.c
@@ -2329,6 +2329,7 @@ static void
 PhysicalConfirmReceivedLocation(XLogRecPtr lsn)
 {
 	bool		changed = false;
+	XLogRecPtr	restart_lsn_flushed;
 	ReplicationSlot *slot = MyReplicationSlot;
 
 	Assert(lsn != InvalidXLogRecPtr);
@@ -2336,6 +2337,7 @@ PhysicalConfirmReceivedLocation(XLogRecPtr lsn)
 	if (slot->data.restart_lsn != lsn)
 	{
 		changed = true;
+		restart_lsn_flushed = slot->restart_lsn_flushed;
 		slot->data.restart_lsn = lsn;
 	}
 	SpinLockRelease(&slot->mutex);
@@ -2343,6 +2345,17 @@ PhysicalConfirmReceivedLocation(XLogRecPtr lsn)
 	if (changed)
 	{
 		ReplicationSlotMarkDirty();
+
+		/* Save the replication slot on disk in case of its flushed restart_lsn
+		 * is invalid. Slots with invalid restart lsn are ignored when
+		 * calculating required LSN. Once we started to keep the WAL by flushed
+		 * restart LSN, we should save to disk an initial valid value.
+		 */
+		if (slot->data.persistency == RS_PERSISTENT) {
+			if (restart_lsn_flushed == InvalidXLogRecPtr && lsn != InvalidXLogRecPtr)
+				ReplicationSlotSave();
+		}
+
 		ReplicationSlotsComputeRequiredLSN();
 		PhysicalWakeupLogicalWalSnd();
 	}
diff --git a/src/include/replication/slot.h b/src/include/replication/slot.h
index d2cf786fd5..e66248b82d 100644
--- a/src/include/replication/slot.h
+++ b/src/include/replication/slot.h
@@ -211,6 +211,10 @@ typedef struct ReplicationSlot
 	 * recently stopped.
 	 */
 	TimestampTz inactive_since;
+
+	/* Latest restart LSN that was flushed to disk */
+	XLogRecPtr restart_lsn_flushed;
+
 } ReplicationSlot;
 
 #define SlotIsPhysical(slot) ((slot)->data.database == InvalidOid)
-- 
2.34.1

0002-Fix-src-recovery-t-001_stream_rep.pl-after-changes-i.patchtext/x-patchDownload
From f950bb109563ce407a5972abbd2fc931ef18dbeb Mon Sep 17 00:00:00 2001
From: Vitaly Davydov <v.davydov@postgrespro.ru>
Date: Fri, 13 Dec 2024 16:02:14 +0300
Subject: [PATCH 2/2] Fix src/recovery/t/001_stream_rep.pl after changes in
 restart lsn

---
 src/test/recovery/t/001_stream_rep.pl | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/src/test/recovery/t/001_stream_rep.pl b/src/test/recovery/t/001_stream_rep.pl
index f3ea45ac4a..95f61cabfc 100644
--- a/src/test/recovery/t/001_stream_rep.pl
+++ b/src/test/recovery/t/001_stream_rep.pl
@@ -553,6 +553,9 @@ chomp($phys_restart_lsn_post);
 ok( ($phys_restart_lsn_pre cmp $phys_restart_lsn_post) == 0,
 	"physical slot advance persists across restarts");
 
+# Cleanup unused WAL segments
+$node_primary->safe_psql('postgres', "CHECKPOINT;");
+
 # Check if the previous segment gets correctly recycled after the
 # server stopped cleanly, causing a shutdown checkpoint to be generated.
 my $primary_data = $node_primary->data_dir;
-- 
2.34.1

#13Vitaly Davydov
v.davydov@postgrespro.ru
In reply to: Vitaly Davydov (#12)
2 attachment(s)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

Dear Hackers,

Let me please introduce a new version of the patch.

Patch description:

The slot data is flushed to the disk at the beginning of checkpoint. If
an existing slot is advanced in the middle of checkpoint execution, its
advanced restart LSN is taken to calculate the oldest LSN for WAL
segments removal at the end of checkpoint. If the node is restarted just
after the checkpoint, the slots data will be read from the disk at
recovery with the oldest restart LSN which can refer to removed WAL
segments.

The patch introduces a new in-memory state for slots -
flushed_restart_lsn which is used to calculate the oldest LSN for WAL
segments removal. This state is updated every time with the current
restart_lsn at the moment, when the slot is saving to disk.

With best regards,
Vitaly

Attachments:

0001-Keep-WAL-segments-by-slot-s-flushed-restart-LSN.patchtext/x-patchDownload
From 480ab108499d95c8befd95911524c4d77cec6e2e Mon Sep 17 00:00:00 2001
From: Vitaly Davydov <v.davydov@postgrespro.ru>
Date: Mon, 3 Mar 2025 17:02:15 +0300
Subject: [PATCH 1/2] Keep WAL segments by slot's flushed restart LSN

The slot data is flushed to the disk at the beginning of checkpoint. If
an existing slot is advanced in the middle of checkpoint execution, its
advanced restart LSN is taken to calculate the oldest LSN for WAL
segments removal at the end of checkpoint. If the node is restarted just
after the checkpoint, the slots data will be read from the disk at
recovery with the oldest restart LSN which can refer to removed WAL
segments.

The patch introduces a new in-memory state for slots -
flushed_restart_lsn which is used to calculate the oldest LSN for WAL
segments removal. This state is updated every time with the current
restart_lsn at the moment, when the slot is saving to disk.
---
 src/backend/replication/slot.c | 41 ++++++++++++++++++++++++++++++++++
 src/include/replication/slot.h |  7 ++++++
 2 files changed, 48 insertions(+)

diff --git a/src/backend/replication/slot.c b/src/backend/replication/slot.c
index 719e531eb90..294418df217 100644
--- a/src/backend/replication/slot.c
+++ b/src/backend/replication/slot.c
@@ -424,6 +424,7 @@ ReplicationSlotCreate(const char *name, bool db_specific,
 	slot->candidate_restart_valid = InvalidXLogRecPtr;
 	slot->candidate_restart_lsn = InvalidXLogRecPtr;
 	slot->last_saved_confirmed_flush = InvalidXLogRecPtr;
+	slot->restart_lsn_flushed = InvalidXLogRecPtr;
 	slot->inactive_since = 0;
 
 	/*
@@ -1165,20 +1166,36 @@ ReplicationSlotsComputeRequiredLSN(void)
 	{
 		ReplicationSlot *s = &ReplicationSlotCtl->replication_slots[i];
 		XLogRecPtr	restart_lsn;
+		XLogRecPtr	restart_lsn_flushed;
 		bool		invalidated;
+		ReplicationSlotPersistency persistency;
 
 		if (!s->in_use)
 			continue;
 
 		SpinLockAcquire(&s->mutex);
+		persistency = s->data.persistency;
 		restart_lsn = s->data.restart_lsn;
 		invalidated = s->data.invalidated != RS_INVAL_NONE;
+		restart_lsn_flushed = s->restart_lsn_flushed;
 		SpinLockRelease(&s->mutex);
 
 		/* invalidated slots need not apply */
 		if (invalidated)
 			continue;
 
+		/* Get the flushed restart_lsn for the persistent slot to compute
+		 * the oldest LSN for WAL segments removals.
+		 */
+		if (persistency == RS_PERSISTENT)
+		{
+			if (restart_lsn_flushed != InvalidXLogRecPtr &&
+				restart_lsn > restart_lsn_flushed)
+			{
+				restart_lsn = restart_lsn_flushed;
+			}
+		}
+
 		if (restart_lsn != InvalidXLogRecPtr &&
 			(min_required == InvalidXLogRecPtr ||
 			 restart_lsn < min_required))
@@ -1216,7 +1233,9 @@ ReplicationSlotsComputeLogicalRestartLSN(void)
 	{
 		ReplicationSlot *s;
 		XLogRecPtr	restart_lsn;
+		XLogRecPtr	restart_lsn_flushed;
 		bool		invalidated;
+		ReplicationSlotPersistency persistency;
 
 		s = &ReplicationSlotCtl->replication_slots[i];
 
@@ -1230,14 +1249,28 @@ ReplicationSlotsComputeLogicalRestartLSN(void)
 
 		/* read once, it's ok if it increases while we're checking */
 		SpinLockAcquire(&s->mutex);
+		persistency = s->data.persistency;
 		restart_lsn = s->data.restart_lsn;
 		invalidated = s->data.invalidated != RS_INVAL_NONE;
+		restart_lsn_flushed = s->restart_lsn_flushed;
 		SpinLockRelease(&s->mutex);
 
 		/* invalidated slots need not apply */
 		if (invalidated)
 			continue;
 
+		/* Get the flushed restart_lsn for the persistent slot to compute
+		 * the oldest LSN for WAL segments removals.
+		 */
+		if (persistency == RS_PERSISTENT)
+		{
+			if (restart_lsn_flushed != InvalidXLogRecPtr &&
+				restart_lsn > restart_lsn_flushed)
+			{
+				restart_lsn = restart_lsn_flushed;
+			}
+		}
+
 		if (restart_lsn == InvalidXLogRecPtr)
 			continue;
 
@@ -1455,6 +1488,7 @@ ReplicationSlotReserveWal(void)
 
 	Assert(slot != NULL);
 	Assert(slot->data.restart_lsn == InvalidXLogRecPtr);
+	Assert(slot->restart_lsn_flushed == InvalidXLogRecPtr);
 
 	/*
 	 * The replication slot mechanism is used to prevent removal of required
@@ -1766,6 +1800,8 @@ InvalidatePossiblyObsoleteSlot(uint32 possible_causes,
 		 */
 		SpinLockAcquire(&s->mutex);
 
+		Assert(s->data.restart_lsn >= s->restart_lsn_flushed);
+
 		restart_lsn = s->data.restart_lsn;
 
 		/* we do nothing if the slot is already invalid */
@@ -1835,7 +1871,10 @@ InvalidatePossiblyObsoleteSlot(uint32 possible_causes,
 			 * just rely on .invalidated.
 			 */
 			if (invalidation_cause == RS_INVAL_WAL_REMOVED)
+			{
 				s->data.restart_lsn = InvalidXLogRecPtr;
+				s->restart_lsn_flushed = InvalidXLogRecPtr;
+			}
 
 			/* Let caller know */
 			*invalidated = true;
@@ -2354,6 +2393,7 @@ SaveSlotToPath(ReplicationSlot *slot, const char *dir, int elevel)
 	if (!slot->just_dirtied)
 		slot->dirty = false;
 	slot->last_saved_confirmed_flush = cp.slotdata.confirmed_flush;
+	slot->restart_lsn_flushed = cp.slotdata.restart_lsn;
 	SpinLockRelease(&slot->mutex);
 
 	LWLockRelease(&slot->io_in_progress_lock);
@@ -2569,6 +2609,7 @@ RestoreSlotFromDisk(const char *name)
 		slot->effective_xmin = cp.slotdata.xmin;
 		slot->effective_catalog_xmin = cp.slotdata.catalog_xmin;
 		slot->last_saved_confirmed_flush = cp.slotdata.confirmed_flush;
+		slot->restart_lsn_flushed = cp.slotdata.restart_lsn;
 
 		slot->candidate_catalog_xmin = InvalidTransactionId;
 		slot->candidate_xmin_lsn = InvalidXLogRecPtr;
diff --git a/src/include/replication/slot.h b/src/include/replication/slot.h
index f5a24ccfbf2..b04d2401d6e 100644
--- a/src/include/replication/slot.h
+++ b/src/include/replication/slot.h
@@ -215,6 +215,13 @@ typedef struct ReplicationSlot
 	 * recently stopped.
 	 */
 	TimestampTz inactive_since;
+
+	/* Latest restart_lsn that has been flushed to disk. For persistent slots
+	 * the flushed LSN should be taken into account when calculating the oldest
+	 * LSN for WAL segments removal.
+	 */
+	XLogRecPtr restart_lsn_flushed;
+
 } ReplicationSlot;
 
 #define SlotIsPhysical(slot) ((slot)->data.database == InvalidOid)
-- 
2.34.1

0002-Fix-src-recovery-t-001_stream_rep.pl.patchtext/x-patchDownload
From 2413ab4468b94280d19316b203848912ed6d713f Mon Sep 17 00:00:00 2001
From: Vitaly Davydov <v.davydov@postgrespro.ru>
Date: Fri, 13 Dec 2024 16:02:14 +0300
Subject: [PATCH 2/2] Fix src/recovery/t/001_stream_rep.pl

---
 src/test/recovery/t/001_stream_rep.pl | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/src/test/recovery/t/001_stream_rep.pl b/src/test/recovery/t/001_stream_rep.pl
index ee57d234c86..eae9d00b9b4 100644
--- a/src/test/recovery/t/001_stream_rep.pl
+++ b/src/test/recovery/t/001_stream_rep.pl
@@ -553,6 +553,9 @@ chomp($phys_restart_lsn_post);
 ok( ($phys_restart_lsn_pre cmp $phys_restart_lsn_post) == 0,
 	"physical slot advance persists across restarts");
 
+# Cleanup unused WAL segments
+$node_primary->safe_psql('postgres', "CHECKPOINT;");
+
 # Check if the previous segment gets correctly recycled after the
 # server stopped cleanly, causing a shutdown checkpoint to be generated.
 my $primary_data = $node_primary->data_dir;
-- 
2.34.1

#14Alexander Korotkov
aekorotkov@gmail.com
In reply to: Vitaly Davydov (#13)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

Hi, Vitaly!

On Mon, Mar 3, 2025 at 5:12 PM Vitaly Davydov <v.davydov@postgrespro.ru> wrote:

The slot data is flushed to the disk at the beginning of checkpoint. If
an existing slot is advanced in the middle of checkpoint execution, its
advanced restart LSN is taken to calculate the oldest LSN for WAL
segments removal at the end of checkpoint. If the node is restarted just
after the checkpoint, the slots data will be read from the disk at
recovery with the oldest restart LSN which can refer to removed WAL
segments.

The patch introduces a new in-memory state for slots -
flushed_restart_lsn which is used to calculate the oldest LSN for WAL
segments removal. This state is updated every time with the current
restart_lsn at the moment, when the slot is saving to disk.

Thank you for your work on this subject. I think generally your
approach is correct. When we're truncating the WAL log, we need to
reply on the position that would be used in the case of server crush.
That is the position flushed to the disk.

While your patch is generality looks good, I'd like make following notes:

1) As ReplicationSlotsComputeRequiredLSN() is called each time we need
to advance the position of WAL needed by replication slots, the usage
pattern probably could be changed. Thus, we probably need to call
ReplicationSlotsComputeRequiredLSN() somewhere after change of
restart_lsn_flushed while restart_lsn is not changed. And probably
can skip ReplicationSlotsComputeRequiredLSN() in some cases when only
restart_lsn is changed.
2) I think it's essential to include into the patch test caches which
fail without patch. You could start from integrating [1] test into
your patch, and then add more similar tests for different situations.

Links.
1. /messages/by-id/e3ac0535-e7a2-4a96-9b36-9f765e9cfec5@vondra.me

------
Regards,
Alexander Korotkov
Supabase

#15Vitaly Davydov
v.davydov@postgrespro.ru
In reply to: Alexander Korotkov (#14)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

Hi Alexander,

Thank you for the review. I apologize for a late reply. I missed your email.

1) As ReplicationSlotsComputeRequiredLSN() is called each time we need
to advance the position of WAL needed by replication slots, the usage
pattern probably could be changed. Thus, we probably need to call
ReplicationSlotsComputeRequiredLSN() somewhere after change of
restart_lsn_flushed while restart_lsn is not changed. And probably
can skip ReplicationSlotsComputeRequiredLSN() in some cases when only
restart_lsn is changed.

Yes, it is a good idea for investigation, thank you! I guess, It may work for
persistent slots but I'm not sure about other types of slots (ephemeral and
temporary). I have no clear understanding of consequences at the moment. I
propose to postpone it for future, because the proposed changes will me more
invasive.

2) I think it's essential to include into the patch test caches which
fail without patch. You could start from integrating [1] test into
your patch, and then add more similar tests for different situations.

The problem with TAP tests - it is hard to reproduce without injection points.
The Tomas Vondra's tests create two new injection points. I have to add more
injection points for new tests as well. Injection points help to test the code
but make the code unreadable. I'm not sure, what is the policy of creating
injection points? Personally, I would not like to add new injection points
only to check this particular rare case. I'm trying to create a test without
injection points that should fail occasionally, but I haven't succeeded at
the moment.

I have a question - is there any interest to backport the solution into
existing major releases? I can prepare a patch where restart_lsn_flushed stored
outside of ReplicationSlot structure and doesn't affect the existing API.

With best regards,
Vitaly

On Friday, April 04, 2025 06:22 MSK, Alexander Korotkov <aekorotkov@gmail.com> wrote:

Show quoted text

Hi, Vitaly!

On Mon, Mar 3, 2025 at 5:12 PM Vitaly Davydov <v.davydov@postgrespro.ru> wrote:

The slot data is flushed to the disk at the beginning of checkpoint. If
an existing slot is advanced in the middle of checkpoint execution, its
advanced restart LSN is taken to calculate the oldest LSN for WAL
segments removal at the end of checkpoint. If the node is restarted just
after the checkpoint, the slots data will be read from the disk at
recovery with the oldest restart LSN which can refer to removed WAL
segments.

The patch introduces a new in-memory state for slots -
flushed_restart_lsn which is used to calculate the oldest LSN for WAL
segments removal. This state is updated every time with the current
restart_lsn at the moment, when the slot is saving to disk.

Thank you for your work on this subject. I think generally your
approach is correct. When we're truncating the WAL log, we need to
reply on the position that would be used in the case of server crush.
That is the position flushed to the disk.

While your patch is generality looks good, I'd like make following notes:

1) As ReplicationSlotsComputeRequiredLSN() is called each time we need
to advance the position of WAL needed by replication slots, the usage
pattern probably could be changed. Thus, we probably need to call
ReplicationSlotsComputeRequiredLSN() somewhere after change of
restart_lsn_flushed while restart_lsn is not changed. And probably
can skip ReplicationSlotsComputeRequiredLSN() in some cases when only
restart_lsn is changed.
2) I think it's essential to include into the patch test caches which
fail without patch. You could start from integrating [1] test into
your patch, and then add more similar tests for different situations.

Links.
1. /messages/by-id/e3ac0535-e7a2-4a96-9b36-9f765e9cfec5@vondra.me

------
Regards,
Alexander Korotkov
Supabase

#16Alexander Korotkov
aekorotkov@gmail.com
In reply to: Vitaly Davydov (#15)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

On Thu, Apr 24, 2025 at 5:32 PM Vitaly Davydov <v.davydov@postgrespro.ru> wrote:

Thank you for the review. I apologize for a late reply. I missed your email.

1) As ReplicationSlotsComputeRequiredLSN() is called each time we need
to advance the position of WAL needed by replication slots, the usage
pattern probably could be changed. Thus, we probably need to call
ReplicationSlotsComputeRequiredLSN() somewhere after change of
restart_lsn_flushed while restart_lsn is not changed. And probably
can skip ReplicationSlotsComputeRequiredLSN() in some cases when only
restart_lsn is changed.

Yes, it is a good idea for investigation, thank you! I guess, It may work for
persistent slots but I'm not sure about other types of slots (ephemeral and
temporary). I have no clear understanding of consequences at the moment. I
propose to postpone it for future, because the proposed changes will me more
invasive.

Yes, that's different for different types of slots. So, removing
ReplicationSlotsComputeRequiredLSN() doesn't look safe. But at least,
we need to analyze if we need to add extra calls.

2) I think it's essential to include into the patch test caches which
fail without patch. You could start from integrating [1] test into
your patch, and then add more similar tests for different situations.

The problem with TAP tests - it is hard to reproduce without injection points.
The Tomas Vondra's tests create two new injection points. I have to add more
injection points for new tests as well. Injection points help to test the code
but make the code unreadable. I'm not sure, what is the policy of creating
injection points? Personally, I would not like to add new injection points
only to check this particular rare case. I'm trying to create a test without
injection points that should fail occasionally, but I haven't succeeded at
the moment.

I don't know if there is an explicit policy. I think we just add them
as needed to reproduce important situations in TAP tests. So, feel
free to them as many as you want to reproduce all the problematic
situations. During review we can find if they seem too many, but
don't bother about this at present stage.

I have a question - is there any interest to backport the solution into
existing major releases?

As long as this is the bug, it should be backpatched to all supported
affected releases.

I can prepare a patch where restart_lsn_flushed stored
outside of ReplicationSlot structure and doesn't affect the existing API.

Yes, please!

------
Regards,
Alexander Korotkov
Supabase

#17Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Alexander Korotkov (#16)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

On Mon, Apr 28, 2025 at 8:17 AM Alexander Korotkov <aekorotkov@gmail.com> wrote:

I have a question - is there any interest to backport the solution into
existing major releases?

As long as this is the bug, it should be backpatched to all supported
affected releases.

Yes, but I think we cannot back-patch the proposed fix to back
branches as it changes the ReplicationSlot struct defined in slot.h,
which breaks ABI compatibility.

Regards,

--
Masahiko Sawada
Amazon Web Services: https://aws.amazon.com

#18Alexander Korotkov
aekorotkov@gmail.com
In reply to: Masahiko Sawada (#17)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

On Tue, Apr 29, 2025 at 4:03 AM Masahiko Sawada <sawada.mshk@gmail.com> wrote:

On Mon, Apr 28, 2025 at 8:17 AM Alexander Korotkov <aekorotkov@gmail.com> wrote:

I have a question - is there any interest to backport the solution into
existing major releases?

As long as this is the bug, it should be backpatched to all supported
affected releases.

Yes, but I think we cannot back-patch the proposed fix to back
branches as it changes the ReplicationSlot struct defined in slot.h,
which breaks ABI compatibility.

Yes, and I think Vitaly already proposed to address this issue. This
aspect also needs to be carefully reviewed for sure.

On Thu, Apr 24, 2025 at 5:32 PM Vitaly Davydov <v.davydov@postgrespro.ru> wrote:

I can prepare a patch where restart_lsn_flushed stored
outside of ReplicationSlot structure and doesn't affect the existing API.

------
Regards,
Alexander Korotkov
Supabase

#19Masahiko Sawada
sawada.mshk@gmail.com
In reply to: Alexander Korotkov (#18)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

On Mon, Apr 28, 2025 at 6:39 PM Alexander Korotkov <aekorotkov@gmail.com> wrote:

On Tue, Apr 29, 2025 at 4:03 AM Masahiko Sawada <sawada.mshk@gmail.com> wrote:

On Mon, Apr 28, 2025 at 8:17 AM Alexander Korotkov <aekorotkov@gmail.com> wrote:

I have a question - is there any interest to backport the solution into
existing major releases?

As long as this is the bug, it should be backpatched to all supported
affected releases.

Yes, but I think we cannot back-patch the proposed fix to back
branches as it changes the ReplicationSlot struct defined in slot.h,
which breaks ABI compatibility.

Yes, and I think Vitaly already proposed to address this issue. This
aspect also needs to be carefully reviewed for sure.

On Thu, Apr 24, 2025 at 5:32 PM Vitaly Davydov <v.davydov@postgrespro.ru> wrote:

I can prepare a patch where restart_lsn_flushed stored
outside of ReplicationSlot structure and doesn't affect the existing API.

Oh, I totally missed this part. Sorry for making noise. I'll review
the patch once submitted.

Regarding the proposed patch, I think we can somewhat follow
last_saved_confirmed_flush field of ReplicationSlot. For example, we
can set restart_lsn_flushed when restoring the slot from the disk,
etc.

Regards,

--
Masahiko Sawada
Amazon Web Services: https://aws.amazon.com

#20Vitaly Davydov
v.davydov@postgrespro.ru
In reply to: Masahiko Sawada (#19)
5 attachment(s)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

Dear All,

Thank you for the attention to the patch. I updated a patch with a better
solution for the master branch which can be easily backported to the other
branches as we agree on the final solution.

Two tests are introduced which are based on Tomas Vondra's test for logical slots
with injection points from the discussion (patches: [1]0001-Add-injection-points-to-test-replication-slot-advanc.v2.patch, [2]0002-Add-TAP-test-to-check-logical-repl-slot-advance-duri.v2.patch, [3]0003-Add-TAP-test-to-check-physical-repl-slot-advance-dur.v2.patch). Tests
are implemented as module tests in src/test/modules/test_replslot_required_lsn
directory. I slightly modified the original test for logical slots and created a
new simpler test for physical slots without any additional injection points.

I prepared a new solution (patch [4]0004-Keep-WAL-segments-by-slot-s-flushed-restart-LSN.v2.patch) which is also based on Tomas Vondra's
proposal. With a fresh eye, I realized that it can fix the issue as well. It is
easy and less invasive to implement. The new solution differs from my original
solution: it is backward compatible (doesn't require any changes in ReplicationSlot
structure). My original solution can be backward compatible as well if to
allocate flushed_restart_lsn in a separate array in shmem, not in the
ReplicationSlot structure, but I believe the new solution is the better one. If
you still think that my previous solution is the better (I don't think so), I
will prepare a backward compatible patch with my previous solution.

I also proposed one more commit (patch [5]0005-Remove-redundant-ReplicationSlotsComputeRequiredLSN-.v2.patch) which removes unnecessary calls of
ReplicationSlotsComputeRequiredLSN function which seems to be redundant. This
function updates the oldest required LSN for slots and it is called every time
when slots' restart_lsn is changed. Once, we use the oldest required LSN in
CreateCheckPoint/CreateRestartPoint to remove old WAL segments, I believe, there
is no need to calculate the oldest value immediately when the slot is advancing
and in other cases when restart_lsn is changed. It may affect on
GetWALAvailability function because the oldest required LSN will be not up to
date, but this function seems to be used in the system view
pg_get_replication_slots and doesn't affect the logic of old WAL segments
removal. I also have some doubts concerning advancing of logical replication
slots: the call of ReplicationSlotsComputeRequiredLSN was removed. Not sure, how
it can affect on ReplicationSlotsComputeRequiredXmin. This commit is not
necessary for the fix but I think it is worth to consider. It may be dropped or
applied only to the master branch.

This patch can be easily backported to the major release branches. I will
quickly prepare the patches for the major releases as we agree on the final
solution.

I apologize for such too late change in patch when it is already on commitfest.
I'm not well experienced yet in the internals of PostgreSQL at the moment,
sometimes the better solution needs some time to grow. In doing we learn :)

[1]: 0001-Add-injection-points-to-test-replication-slot-advanc.v2.patch
[2]: 0002-Add-TAP-test-to-check-logical-repl-slot-advance-duri.v2.patch
[3]: 0003-Add-TAP-test-to-check-physical-repl-slot-advance-dur.v2.patch
[4]: 0004-Keep-WAL-segments-by-slot-s-flushed-restart-LSN.v2.patch
[5]: 0005-Remove-redundant-ReplicationSlotsComputeRequiredLSN-.v2.patch

With best regards,
Vitaly

Attachments:

0003-Add-TAP-test-to-check-physical-repl-slot-advance-dur.v2.patchtext/x-patchDownload
From a8693c3003df7f9850af0be5284bb6f0e7a82fa6 Mon Sep 17 00:00:00 2001
From: Vitaly Davydov <v.davydov@postgrespro.ru>
Date: Wed, 30 Apr 2025 12:48:27 +0300
Subject: [PATCH 3/5] Add TAP test to check physical repl slot advance during
 checkpoint

The test verifies that the physical replication slot is still valid
after immediate restart on checkpoint completion in case when the slot
was advanced during checkpoint.

Discussion: https://www.postgresql.org/message-id/flat/1d12d2-67235980-35-19a406a0%4063439497
---
 .../test_replslot_required_lsn/meson.build    |   3 +-
 .../t/002_physical_slot.pl                    | 126 ++++++++++++++++++
 2 files changed, 128 insertions(+), 1 deletion(-)
 create mode 100644 src/test/modules/test_replslot_required_lsn/t/002_physical_slot.pl

diff --git a/src/test/modules/test_replslot_required_lsn/meson.build b/src/test/modules/test_replslot_required_lsn/meson.build
index 999c16201fb..44d2546632b 100644
--- a/src/test/modules/test_replslot_required_lsn/meson.build
+++ b/src/test/modules/test_replslot_required_lsn/meson.build
@@ -9,7 +9,8 @@ tests += {
        'enable_injection_points': get_option('injection_points') ? 'yes' : 'no',
     },
     'tests': [
-      't/001_logical_slot.pl'
+      't/001_logical_slot.pl',
+      't/002_physical_slot.pl'
     ],
   },
 }
diff --git a/src/test/modules/test_replslot_required_lsn/t/002_physical_slot.pl b/src/test/modules/test_replslot_required_lsn/t/002_physical_slot.pl
new file mode 100644
index 00000000000..f89aec1da32
--- /dev/null
+++ b/src/test/modules/test_replslot_required_lsn/t/002_physical_slot.pl
@@ -0,0 +1,126 @@
+# Copyright (c) 2025, PostgreSQL Global Development Group
+#
+# This test verifies the case when the physical slot is advanced during
+# checkpoint. The test checks that the physical slot's restart_lsn still refers
+# to an existed WAL segment after immediate restart.
+#
+# Discussion:
+# https://www.postgresql.org/message-id/flat/1d12d2-67235980-35-19a406a0%4063439497
+#
+use strict;
+use warnings FATAL => 'all';
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+
+use Test::More;
+
+if ($ENV{enable_injection_points} ne 'yes')
+{
+	plan skip_all => 'Injection points not supported by this build';
+}
+
+my ($node, $result);
+
+$node = PostgreSQL::Test::Cluster->new('mike');
+$node->init();
+$node->append_conf('postgresql.conf',
+	"shared_preload_libraries = 'injection_points'");
+$node->append_conf('postgresql.conf',
+	"wal_level = 'replica'");
+$node->start();
+$node->safe_psql('postgres', q(CREATE EXTENSION injection_points));
+
+# create a simple table to generate data into
+$node->safe_psql('postgres',
+	q{create table t (id serial primary key, b text)});
+
+# create a physical replication slot
+$node->safe_psql('postgres',
+	q{select pg_create_physical_replication_slot('slot_physical', true)});
+
+# advance slot to current position, just to have everything "valid"
+$node->safe_psql('postgres',
+	q{select pg_replication_slot_advance('slot_physical', pg_current_wal_lsn())});
+
+# run checkpoint, to flush current state to disk and set a baseline
+$node->safe_psql('postgres', q{checkpoint});
+
+# insert 2M rows, that's about 260MB (~20 segments) worth of WAL
+$node->safe_psql('postgres',
+	q{insert into t (b) select md5(i::text) from generate_series(1,100000) s(i)});
+
+# advance slot to current position, just to have everything "valid"
+$node->safe_psql('postgres',
+	q{select pg_replication_slot_advance('slot_physical', pg_current_wal_lsn())});
+
+# run another checkpoint, to set a new restore LSN
+$node->safe_psql('postgres', q{checkpoint});
+
+# another 2M rows, that's about 260MB (~20 segments) worth of WAL
+$node->safe_psql('postgres',
+	q{insert into t (b) select md5(i::text) from generate_series(1,1000000) s(i)});
+
+my $restart_lsn_init = $node->safe_psql('postgres',
+	q{select restart_lsn from pg_replication_slots where slot_name = 'slot_physical'});
+chomp($restart_lsn_init);
+note("restart lsn before checkpoint: $restart_lsn_init");
+
+# run another checkpoint, this time in the background, and make it wait
+# on the injection point), so that the checkpoint stops right before
+# removing old WAL segments
+note('starting checkpoint');
+
+my $checkpoint = $node->background_psql('postgres');
+$checkpoint->query_safe(
+	q{select injection_points_attach('checkpoint-before-old-wal-removal','wait')});
+$checkpoint->query_until(qr/starting_checkpoint/,
+q(\echo starting_checkpoint
+checkpoint;
+\q
+));
+
+# wait until the checkpoint stops right before removing WAL segments
+note('waiting for injection_point');
+$node->wait_for_event('checkpointer', 'checkpoint-before-old-wal-removal');
+note('injection_point is reached');
+
+# OK, we're in the right situation,  time to advance the physical slot,
+# which recalculates the required LSN, and then unblock the checkpoint,
+# which removes the WAL still needed by the logical slot
+$node->safe_psql('postgres',
+	q{select pg_replication_slot_advance('slot_physical', pg_current_wal_lsn())});
+
+# Continue checkpoint
+$node->safe_psql('postgres',
+	q{select injection_points_wakeup('checkpoint-before-old-wal-removal')});
+
+my $restart_lsn_old = $node->safe_psql('postgres',
+	q{select restart_lsn from pg_replication_slots where slot_name = 'slot_physical'});
+chomp($restart_lsn_old);
+note("restart lsn before stop: $restart_lsn_old");
+
+# abruptly stop the server (1 second should be enough for the checkpoint
+# to finish, would be better )
+$node->stop('immediate');
+
+$node->start;
+
+# Get the restart_lsn of the slot right after restarting
+my $restart_lsn = $node->safe_psql('postgres',
+	q{select restart_lsn from pg_replication_slots where slot_name = 'slot_physical'});
+chomp($restart_lsn);
+note("restart lsn: $restart_lsn");
+
+# Get wal segment name for slot's restart_lsn
+my $restart_lsn_segment = $node->safe_psql('postgres',
+	"SELECT pg_walfile_name('$restart_lsn'::pg_lsn)");
+chomp($restart_lsn_segment);
+
+# Check if the required wal segment exists
+note("required by slot segment name: $restart_lsn_segment");
+my $datadir = $node->data_dir;
+ok(-f "$datadir/pg_wal/$restart_lsn_segment",
+	"WAL segment $restart_lsn_segment for physical slot's restart_lsn $restart_lsn exists");
+
+done_testing();
-- 
2.34.1

0004-Keep-WAL-segments-by-slot-s-flushed-restart-LSN.v2.patchtext/x-patchDownload
From f17ba2642b7c7ef13163c3e411f3d9218a1faa11 Mon Sep 17 00:00:00 2001
From: Vitaly Davydov <v.davydov@postgrespro.ru>
Date: Wed, 30 Apr 2025 14:09:21 +0300
Subject: [PATCH 4/5] Keep WAL segments by slot's flushed restart LSN

The patch fixes the issue with unexpected removal of old WAL segments
after checkpoint followed by immediate restart. The issue occurs when a
slot is advanced after the start of checkpoint and before old WAL
segments removal at end of checkpoint.

The idea of the patch is to get the minimal restart_lsn at the beginning
of checkpoint (or restart point) creation and use this value when
calculating oldest LSN for WAL segments removal at the end of
checkpoint. This idea was proposed by Tomas Vondra in the discussion.

Discussion:
https://www.postgresql.org/message-id/flat/1d12d2-67235980-35-19a406a0%4063439497
---
 src/backend/access/transam/xlog.c | 37 ++++++++++++++++++++++++-------
 1 file changed, 29 insertions(+), 8 deletions(-)

diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index 1f2256a3b86..79a21e2d088 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -677,7 +677,8 @@ static XLogRecPtr CreateOverwriteContrecordRecord(XLogRecPtr aborted_lsn,
 												  XLogRecPtr pagePtr,
 												  TimeLineID newTLI);
 static void CheckPointGuts(XLogRecPtr checkPointRedo, int flags);
-static void KeepLogSeg(XLogRecPtr recptr, XLogSegNo *logSegNo);
+static void KeepLogSeg(XLogRecPtr recptr, XLogRecPtr slotsMinLSN,
+					   XLogSegNo *logSegNo);
 static XLogRecPtr XLogGetReplicationSlotMinimumLSN(void);
 
 static void AdvanceXLInsertBuffer(XLogRecPtr upto, TimeLineID tli,
@@ -7087,6 +7088,7 @@ CreateCheckPoint(int flags)
 	VirtualTransactionId *vxids;
 	int			nvxids;
 	int			oldXLogAllowed = 0;
+	XLogRecPtr	slotsMinReqLSN;
 
 	/*
 	 * An end-of-recovery checkpoint is really a shutdown checkpoint, just
@@ -7315,6 +7317,11 @@ CreateCheckPoint(int flags)
 	 */
 	END_CRIT_SECTION();
 
+	/*
+	 * Get the current minimum LSN to be used later in WAL segments cleanup.
+	 */
+	slotsMinReqLSN = XLogGetReplicationSlotMinimumLSN();
+
 	/*
 	 * In some cases there are groups of actions that must all occur on one
 	 * side or the other of a checkpoint record. Before flushing the
@@ -7507,17 +7514,20 @@ CreateCheckPoint(int flags)
 	 * prevent the disk holding the xlog from growing full.
 	 */
 	XLByteToSeg(RedoRecPtr, _logSegNo, wal_segment_size);
-	KeepLogSeg(recptr, &_logSegNo);
+	KeepLogSeg(recptr, slotsMinReqLSN, &_logSegNo);
 	if (InvalidateObsoleteReplicationSlots(RS_INVAL_WAL_REMOVED | RS_INVAL_IDLE_TIMEOUT,
 										   _logSegNo, InvalidOid,
 										   InvalidTransactionId))
 	{
+		slotsMinReqLSN = XLogGetReplicationSlotMinimumLSN();
+		CheckPointReplicationSlots(shutdown);
+
 		/*
 		 * Some slots have been invalidated; recalculate the old-segment
 		 * horizon, starting again from RedoRecPtr.
 		 */
 		XLByteToSeg(RedoRecPtr, _logSegNo, wal_segment_size);
-		KeepLogSeg(recptr, &_logSegNo);
+		KeepLogSeg(recptr, slotsMinReqLSN, &_logSegNo);
 	}
 	_logSegNo--;
 	RemoveOldXlogFiles(_logSegNo, RedoRecPtr, recptr,
@@ -7792,6 +7802,7 @@ CreateRestartPoint(int flags)
 	XLogRecPtr	endptr;
 	XLogSegNo	_logSegNo;
 	TimestampTz xtime;
+	XLogRecPtr	slotsMinReqLSN;
 
 	/* Concurrent checkpoint/restartpoint cannot happen */
 	Assert(!IsUnderPostmaster || MyBackendType == B_CHECKPOINTER);
@@ -7874,6 +7885,11 @@ CreateRestartPoint(int flags)
 	MemSet(&CheckpointStats, 0, sizeof(CheckpointStats));
 	CheckpointStats.ckpt_start_t = GetCurrentTimestamp();
 
+	/*
+	 * Get the current minimum LSN to be used later in WAL segments cleanup.
+	 */
+	slotsMinReqLSN = XLogGetReplicationSlotMinimumLSN();
+
 	if (log_checkpoints)
 		LogCheckpointStart(flags, true);
 
@@ -7962,17 +7978,20 @@ CreateRestartPoint(int flags)
 	receivePtr = GetWalRcvFlushRecPtr(NULL, NULL);
 	replayPtr = GetXLogReplayRecPtr(&replayTLI);
 	endptr = (receivePtr < replayPtr) ? replayPtr : receivePtr;
-	KeepLogSeg(endptr, &_logSegNo);
+	KeepLogSeg(endptr, slotsMinReqLSN, &_logSegNo);
 	if (InvalidateObsoleteReplicationSlots(RS_INVAL_WAL_REMOVED | RS_INVAL_IDLE_TIMEOUT,
 										   _logSegNo, InvalidOid,
 										   InvalidTransactionId))
 	{
+		slotsMinReqLSN = XLogGetReplicationSlotMinimumLSN();
+		CheckPointReplicationSlots(flags & CHECKPOINT_IS_SHUTDOWN);
+
 		/*
 		 * Some slots have been invalidated; recalculate the old-segment
 		 * horizon, starting again from RedoRecPtr.
 		 */
 		XLByteToSeg(RedoRecPtr, _logSegNo, wal_segment_size);
-		KeepLogSeg(endptr, &_logSegNo);
+		KeepLogSeg(endptr, slotsMinReqLSN, &_logSegNo);
 	}
 	_logSegNo--;
 
@@ -8067,6 +8086,7 @@ GetWALAvailability(XLogRecPtr targetLSN)
 	XLogSegNo	oldestSegMaxWalSize;	/* oldest segid kept by max_wal_size */
 	XLogSegNo	oldestSlotSeg;	/* oldest segid kept by slot */
 	uint64		keepSegs;
+	XLogRecPtr	slotsMinReqLSN;
 
 	/*
 	 * slot does not reserve WAL. Either deactivated, or has never been active
@@ -8080,8 +8100,9 @@ GetWALAvailability(XLogRecPtr targetLSN)
 	 * oldestSlotSeg to the current segment.
 	 */
 	currpos = GetXLogWriteRecPtr();
+	slotsMinReqLSN = XLogGetReplicationSlotMinimumLSN();
 	XLByteToSeg(currpos, oldestSlotSeg, wal_segment_size);
-	KeepLogSeg(currpos, &oldestSlotSeg);
+	KeepLogSeg(currpos, slotsMinReqLSN, &oldestSlotSeg);
 
 	/*
 	 * Find the oldest extant segment file. We get 1 until checkpoint removes
@@ -8142,7 +8163,7 @@ GetWALAvailability(XLogRecPtr targetLSN)
  * invalidation is optionally done here, instead.
  */
 static void
-KeepLogSeg(XLogRecPtr recptr, XLogSegNo *logSegNo)
+KeepLogSeg(XLogRecPtr recptr, XLogRecPtr slotsMinReqLSN, XLogSegNo *logSegNo)
 {
 	XLogSegNo	currSegNo;
 	XLogSegNo	segno;
@@ -8155,7 +8176,7 @@ KeepLogSeg(XLogRecPtr recptr, XLogSegNo *logSegNo)
 	 * Calculate how many segments are kept by slots first, adjusting for
 	 * max_slot_wal_keep_size.
 	 */
-	keep = XLogGetReplicationSlotMinimumLSN();
+	keep = slotsMinReqLSN;
 	if (keep != InvalidXLogRecPtr && keep < recptr)
 	{
 		XLByteToSeg(keep, segno, wal_segment_size);
-- 
2.34.1

0001-Add-injection-points-to-test-replication-slot-advanc.v2.patchtext/x-patchDownload
From 68b16da5448ec64661319bca07939e07066fe2a6 Mon Sep 17 00:00:00 2001
From: Tomas Vondra <tomas@vondra.me>
Date: Thu, 21 Nov 2024 20:37:00 +0100
Subject: [PATCH 1/5] Add injection points to test replication slot advance

New injection points:

* checkpoint-before-old-wal-removal - triggered in the checkpointer
  process just before old WAL segments cleanup.

* logical-replication-slot-advance-segment - triggered in
  LogicalConfirmReceivedLocation when restart_lsn was changed enough to
  point to a next WAL segment.

Original patch by: Tomas Vondra <tomas@vondra.me>
Modified by: Vitaly Davydov <v.davydov@postgrespro.ru>
Discussion: https://www.postgresql.org/message-id/flat/1d12d2-67235980-35-19a406a0%4063439497
---
 src/backend/access/transam/xlog.c         |  4 ++++
 src/backend/replication/logical/logical.c | 18 ++++++++++++++++++
 2 files changed, 22 insertions(+)

diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index 2d4c346473b..1f2256a3b86 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -7498,6 +7498,10 @@ CreateCheckPoint(int flags)
 	if (PriorRedoPtr != InvalidXLogRecPtr)
 		UpdateCheckPointDistanceEstimate(RedoRecPtr - PriorRedoPtr);
 
+#ifdef USE_INJECTION_POINTS
+	INJECTION_POINT("checkpoint-before-old-wal-removal");
+#endif
+
 	/*
 	 * Delete old log files, those no longer needed for last checkpoint to
 	 * prevent the disk holding the xlog from growing full.
diff --git a/src/backend/replication/logical/logical.c b/src/backend/replication/logical/logical.c
index a8d2e024d34..2163dc5e275 100644
--- a/src/backend/replication/logical/logical.c
+++ b/src/backend/replication/logical/logical.c
@@ -30,6 +30,7 @@
 
 #include "access/xact.h"
 #include "access/xlogutils.h"
+#include "access/xlog_internal.h"
 #include "fmgr.h"
 #include "miscadmin.h"
 #include "pgstat.h"
@@ -41,6 +42,7 @@
 #include "storage/proc.h"
 #include "storage/procarray.h"
 #include "utils/builtins.h"
+#include "utils/injection_point.h"
 #include "utils/inval.h"
 #include "utils/memutils.h"
 
@@ -1825,9 +1827,13 @@ LogicalConfirmReceivedLocation(XLogRecPtr lsn)
 	{
 		bool		updated_xmin = false;
 		bool		updated_restart = false;
+		XLogRecPtr	restart_lsn pg_attribute_unused();
 
 		SpinLockAcquire(&MyReplicationSlot->mutex);
 
+		/* remember the old restart lsn */
+		restart_lsn = MyReplicationSlot->data.restart_lsn;
+
 		MyReplicationSlot->data.confirmed_flush = lsn;
 
 		/* if we're past the location required for bumping xmin, do so */
@@ -1869,6 +1875,18 @@ LogicalConfirmReceivedLocation(XLogRecPtr lsn)
 		/* first write new xmin to disk, so we know what's up after a crash */
 		if (updated_xmin || updated_restart)
 		{
+#ifdef USE_INJECTION_POINTS
+			XLogSegNo	seg1,
+						seg2;
+
+			XLByteToSeg(restart_lsn, seg1, wal_segment_size);
+			XLByteToSeg(MyReplicationSlot->data.restart_lsn, seg2, wal_segment_size);
+
+			/* trigger injection point, but only if segment changes */
+			if (seg1 != seg2)
+				INJECTION_POINT("logical-replication-slot-advance-segment");
+#endif
+
 			ReplicationSlotMarkDirty();
 			ReplicationSlotSave();
 			elog(DEBUG1, "updated xmin: %u restart: %u", updated_xmin, updated_restart);
-- 
2.34.1

0005-Remove-redundant-ReplicationSlotsComputeRequiredLSN-.v2.patchtext/x-patchDownload
From 5836ce690d6167d4f79181cc3af0531245969df6 Mon Sep 17 00:00:00 2001
From: Vitaly Davydov <v.davydov@postgrespro.ru>
Date: Thu, 1 May 2025 12:18:52 +0300
Subject: [PATCH 5/5] Remove redundant ReplicationSlotsComputeRequiredLSN calls

The function ReplicationSlotsComputeRequiredLSN is used to calculate the
oldest slots' required LSN. It is called every time when restart_lsn
value of any slot is changed (for example, when a slot is advancing).
The slot's oldest required LSN is used to remote old WAL segments in two
places - when checkpoint or restart point is created (CreateCheckPoint,
CreateRestartPoint functions). Old WAL segments seems to be truncated in
these two functions only.

The idea of the patch is to call ReplicationSlotsComputeRequiredLSN in
CreateCheckPoint or CreateRestartPoint functions only, before call of
RemoveOldXlogFiles function where old WAL segments are removed. There
is no obvious need to recalculate oldest required LSN every time when a
slot's restart_lsn is changed.

The value of the oldest required lsn can affect on slot invalidation.
The function InvalidateObsoleteReplicationSlots with non zero second
parameter (oldestSegno) is called in CreateCheckPoint,
CreateRestartPoint functions only where slot invalidation occurs with
reason RS_INVAL_WAL_REMOVED. Once we update the oldest slots' required
lsn in the beginning of these functions, the proposed patch should not
break the behaviour of slot invalidation function in this case.
---
 src/backend/access/transam/xlog.c          | 4 ++++
 src/backend/replication/logical/logical.c  | 1 -
 src/backend/replication/logical/slotsync.c | 4 ----
 src/backend/replication/slot.c             | 5 -----
 src/backend/replication/slotfuncs.c        | 2 --
 src/backend/replication/walsender.c        | 1 -
 6 files changed, 4 insertions(+), 13 deletions(-)

diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index 79a21e2d088..5875b5f7b9c 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -7320,6 +7320,7 @@ CreateCheckPoint(int flags)
 	/*
 	 * Get the current minimum LSN to be used later in WAL segments cleanup.
 	 */
+	ReplicationSlotsComputeRequiredLSN();
 	slotsMinReqLSN = XLogGetReplicationSlotMinimumLSN();
 
 	/*
@@ -7519,6 +7520,7 @@ CreateCheckPoint(int flags)
 										   _logSegNo, InvalidOid,
 										   InvalidTransactionId))
 	{
+		ReplicationSlotsComputeRequiredLSN();
 		slotsMinReqLSN = XLogGetReplicationSlotMinimumLSN();
 		CheckPointReplicationSlots(shutdown);
 
@@ -7888,6 +7890,7 @@ CreateRestartPoint(int flags)
 	/*
 	 * Get the current minimum LSN to be used later in WAL segments cleanup.
 	 */
+	ReplicationSlotsComputeRequiredLSN();
 	slotsMinReqLSN = XLogGetReplicationSlotMinimumLSN();
 
 	if (log_checkpoints)
@@ -7983,6 +7986,7 @@ CreateRestartPoint(int flags)
 										   _logSegNo, InvalidOid,
 										   InvalidTransactionId))
 	{
+		ReplicationSlotsComputeRequiredLSN();
 		slotsMinReqLSN = XLogGetReplicationSlotMinimumLSN();
 		CheckPointReplicationSlots(flags & CHECKPOINT_IS_SHUTDOWN);
 
diff --git a/src/backend/replication/logical/logical.c b/src/backend/replication/logical/logical.c
index 2163dc5e275..e796023033c 100644
--- a/src/backend/replication/logical/logical.c
+++ b/src/backend/replication/logical/logical.c
@@ -1905,7 +1905,6 @@ LogicalConfirmReceivedLocation(XLogRecPtr lsn)
 			SpinLockRelease(&MyReplicationSlot->mutex);
 
 			ReplicationSlotsComputeRequiredXmin(false);
-			ReplicationSlotsComputeRequiredLSN();
 		}
 	}
 	else
diff --git a/src/backend/replication/logical/slotsync.c b/src/backend/replication/logical/slotsync.c
index 656e66e0ae0..30662c09275 100644
--- a/src/backend/replication/logical/slotsync.c
+++ b/src/backend/replication/logical/slotsync.c
@@ -335,7 +335,6 @@ update_local_synced_slot(RemoteSlot *remote_slot, Oid remote_dbid,
 		SpinLockRelease(&slot->mutex);
 
 		ReplicationSlotsComputeRequiredXmin(false);
-		ReplicationSlotsComputeRequiredLSN();
 	}
 
 	return updated_config || updated_xmin_or_lsn;
@@ -502,9 +501,6 @@ reserve_wal_for_local_slot(XLogRecPtr restart_lsn)
 		slot->data.restart_lsn = restart_lsn;
 		SpinLockRelease(&slot->mutex);
 
-		/* Prevent WAL removal as fast as possible */
-		ReplicationSlotsComputeRequiredLSN();
-
 		XLByteToSeg(slot->data.restart_lsn, segno, wal_segment_size);
 
 		/*
diff --git a/src/backend/replication/slot.c b/src/backend/replication/slot.c
index 600b87fa9cb..dd18fe10f7d 100644
--- a/src/backend/replication/slot.c
+++ b/src/backend/replication/slot.c
@@ -1008,7 +1008,6 @@ ReplicationSlotDropPtr(ReplicationSlot *slot)
 	 * limits.
 	 */
 	ReplicationSlotsComputeRequiredXmin(false);
-	ReplicationSlotsComputeRequiredLSN();
 
 	/*
 	 * If removing the directory fails, the worst thing that will happen is
@@ -1494,9 +1493,6 @@ ReplicationSlotReserveWal(void)
 		slot->data.restart_lsn = restart_lsn;
 		SpinLockRelease(&slot->mutex);
 
-		/* prevent WAL removal as fast as possible */
-		ReplicationSlotsComputeRequiredLSN();
-
 		/*
 		 * If all required WAL is still there, great, otherwise retry. The
 		 * slot should prevent further removal of WAL, unless there's a
@@ -2014,7 +2010,6 @@ restart:
 	if (invalidated)
 	{
 		ReplicationSlotsComputeRequiredXmin(false);
-		ReplicationSlotsComputeRequiredLSN();
 	}
 
 	return invalidated;
diff --git a/src/backend/replication/slotfuncs.c b/src/backend/replication/slotfuncs.c
index 36cc2ed4e44..3300fb9b1c9 100644
--- a/src/backend/replication/slotfuncs.c
+++ b/src/backend/replication/slotfuncs.c
@@ -583,7 +583,6 @@ pg_replication_slot_advance(PG_FUNCTION_ARGS)
 	 * advancing potentially done.
 	 */
 	ReplicationSlotsComputeRequiredXmin(false);
-	ReplicationSlotsComputeRequiredLSN();
 
 	ReplicationSlotRelease();
 
@@ -819,7 +818,6 @@ copy_replication_slot(FunctionCallInfo fcinfo, bool logical_slot)
 
 		ReplicationSlotMarkDirty();
 		ReplicationSlotsComputeRequiredXmin(false);
-		ReplicationSlotsComputeRequiredLSN();
 		ReplicationSlotSave();
 
 #ifdef USE_ASSERT_CHECKING
diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c
index 9fa8beb6103..0767c2803d9 100644
--- a/src/backend/replication/walsender.c
+++ b/src/backend/replication/walsender.c
@@ -2384,7 +2384,6 @@ PhysicalConfirmReceivedLocation(XLogRecPtr lsn)
 	if (changed)
 	{
 		ReplicationSlotMarkDirty();
-		ReplicationSlotsComputeRequiredLSN();
 		PhysicalWakeupLogicalWalSnd();
 	}
 
-- 
2.34.1

0002-Add-TAP-test-to-check-logical-repl-slot-advance-duri.v2.patchtext/x-patchDownload
From 2a5ead4a45c9624eace2dbad63f18ca76c307db6 Mon Sep 17 00:00:00 2001
From: Tomas Vondra <tomas@vondra.me>
Date: Thu, 21 Nov 2024 23:07:22 +0100
Subject: [PATCH 2/5] Add TAP test to check logical repl slot advance during
 checkpoint

The test verifies that logical replication slot is still valid after
immediate restart on checkpoint completion in case when the slot was
advanced during checkpoint.

Original patch by: Tomas Vondra <tomas@vondra.me>
Modified by: Vitaly Davydov <v.davydov@postgrespro.ru>
Discussion: https://www.postgresql.org/message-id/flat/1d12d2-67235980-35-19a406a0%4063439497
---
 src/test/modules/Makefile                     |   4 +-
 src/test/modules/meson.build                  |   1 +
 .../test_replslot_required_lsn/Makefile       |  18 +++
 .../test_replslot_required_lsn/meson.build    |  15 +++
 .../t/001_logical_slot.pl                     | 124 ++++++++++++++++++
 5 files changed, 160 insertions(+), 2 deletions(-)
 create mode 100644 src/test/modules/test_replslot_required_lsn/Makefile
 create mode 100644 src/test/modules/test_replslot_required_lsn/meson.build
 create mode 100644 src/test/modules/test_replslot_required_lsn/t/001_logical_slot.pl

diff --git a/src/test/modules/Makefile b/src/test/modules/Makefile
index aa1d27bbed3..53d3dd8e0ed 100644
--- a/src/test/modules/Makefile
+++ b/src/test/modules/Makefile
@@ -46,9 +46,9 @@ SUBDIRS = \
 
 
 ifeq ($(enable_injection_points),yes)
-SUBDIRS += injection_points gin typcache
+SUBDIRS += injection_points gin typcache test_replslot_required_lsn
 else
-ALWAYS_SUBDIRS += injection_points gin typcache
+ALWAYS_SUBDIRS += injection_points gin typcache test_replslot_required_lsn
 endif
 
 ifeq ($(with_ssl),openssl)
diff --git a/src/test/modules/meson.build b/src/test/modules/meson.build
index 9de0057bd1d..ac0dbd1f10f 100644
--- a/src/test/modules/meson.build
+++ b/src/test/modules/meson.build
@@ -43,3 +43,4 @@ subdir('typcache')
 subdir('unsafe_tests')
 subdir('worker_spi')
 subdir('xid_wraparound')
+subdir('test_replslot_required_lsn')
diff --git a/src/test/modules/test_replslot_required_lsn/Makefile b/src/test/modules/test_replslot_required_lsn/Makefile
new file mode 100644
index 00000000000..e5ff8af255b
--- /dev/null
+++ b/src/test/modules/test_replslot_required_lsn/Makefile
@@ -0,0 +1,18 @@
+# src/test/modules/test_replslot_required_lsn/Makefile
+
+EXTRA_INSTALL=src/test/modules/injection_points \
+	contrib/test_decoding
+
+export enable_injection_points
+TAP_TESTS = 1
+
+ifdef USE_PGXS
+PG_CONFIG = pg_config
+PGXS := $(shell $(PG_CONFIG) --pgxs)
+include $(PGXS)
+else
+subdir = src/test/modules/test_replslot_required_lsn
+top_builddir = ../../../..
+include $(top_builddir)/src/Makefile.global
+include $(top_srcdir)/contrib/contrib-global.mk
+endif
diff --git a/src/test/modules/test_replslot_required_lsn/meson.build b/src/test/modules/test_replslot_required_lsn/meson.build
new file mode 100644
index 00000000000..999c16201fb
--- /dev/null
+++ b/src/test/modules/test_replslot_required_lsn/meson.build
@@ -0,0 +1,15 @@
+# Copyright (c) 2025, PostgreSQL Global Development Group
+
+tests += {
+  'name': 'test_replslot_required_lsn',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'env': {
+       'enable_injection_points': get_option('injection_points') ? 'yes' : 'no',
+    },
+    'tests': [
+      't/001_logical_slot.pl'
+    ],
+  },
+}
diff --git a/src/test/modules/test_replslot_required_lsn/t/001_logical_slot.pl b/src/test/modules/test_replslot_required_lsn/t/001_logical_slot.pl
new file mode 100644
index 00000000000..ff13c741ad0
--- /dev/null
+++ b/src/test/modules/test_replslot_required_lsn/t/001_logical_slot.pl
@@ -0,0 +1,124 @@
+# Copyright (c) 2025, PostgreSQL Global Development Group
+#
+# This test verifies the case when the logical slot is advanced during
+# checkpoint. The test checks that the logical slot's restart_lsn still refers
+# to an existed WAL segment after immediate restart.
+#
+# Discussion:
+# https://www.postgresql.org/message-id/flat/1d12d2-67235980-35-19a406a0%4063439497
+#
+use strict;
+use warnings FATAL => 'all';
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+
+use Test::More;
+
+if ($ENV{enable_injection_points} ne 'yes')
+{
+	plan skip_all => 'Injection points not supported by this build';
+}
+
+my ($node, $result);
+
+$node = PostgreSQL::Test::Cluster->new('mike');
+$node->init;
+$node->append_conf('postgresql.conf',
+	"shared_preload_libraries = 'injection_points'");
+$node->append_conf('postgresql.conf',
+	"wal_level = 'logical'");
+$node->start;
+$node->safe_psql('postgres', q(CREATE EXTENSION injection_points));
+
+# create a simple table to generate data into
+$node->safe_psql('postgres',
+	q{create table t (id serial primary key, b text)});
+
+# create the two slots we'll need
+$node->safe_psql('postgres',
+	q{select pg_create_logical_replication_slot('slot_logical', 'test_decoding')});
+$node->safe_psql('postgres',
+	q{select pg_create_physical_replication_slot('slot_physical', true)});
+
+# advance both to current position, just to have everything "valid"
+$node->safe_psql('postgres',
+	q{select count(*) from pg_logical_slot_get_changes('slot_logical', null, null)});
+$node->safe_psql('postgres',
+	q{select pg_replication_slot_advance('slot_physical', pg_current_wal_lsn())});
+
+# run checkpoint, to flush current state to disk and set a baseline
+$node->safe_psql('postgres', q{checkpoint});
+
+# generate transactions to get RUNNING_XACTS
+my $xacts = $node->background_psql('postgres');
+$xacts->query_until(qr/run_xacts/,
+q(\echo run_xacts
+SELECT 1 \watch 0.1
+\q
+));
+
+# insert 2M rows, that's about 260MB (~20 segments) worth of WAL
+$node->safe_psql('postgres',
+	q{insert into t (b) select md5(i::text) from generate_series(1,1000000) s(i)});
+
+# run another checkpoint, to set a new restore LSN
+$node->safe_psql('postgres', q{checkpoint});
+
+# another 2M rows, that's about 260MB (~20 segments) worth of WAL
+$node->safe_psql('postgres',
+	q{insert into t (b) select md5(i::text) from generate_series(1,1000000) s(i)});
+
+# run another checkpoint, this time in the background, and make it wait
+# on the injection point), so that the checkpoint stops right before
+# removing old WAL segments
+print('starting checkpoint\n');
+
+my $checkpoint = $node->background_psql('postgres');
+$checkpoint->query_safe(q(select injection_points_attach('checkpoint-before-old-wal-removal','wait')));
+$checkpoint->query_until(qr/starting_checkpoint/,
+q(\echo starting_checkpoint
+checkpoint;
+\q
+));
+
+print('waiting for injection_point\n');
+# wait until the checkpoint stops right before removing WAL segments
+$node->wait_for_event('checkpointer', 'checkpoint-before-old-wal-removal');
+
+
+# try to advance the logical slot, but make it stop when it moves to the
+# next WAL segment (has to happen in the background too)
+my $logical = $node->background_psql('postgres');
+$logical->query_safe(q{select injection_points_attach('logical-replication-slot-advance-segment','wait');});
+$logical->query_until(qr/get_changes/,
+q(
+\echo get_changes
+select count(*) from pg_logical_slot_get_changes('slot_logical', null, null) \watch 1
+\q
+));
+
+# wait until the checkpoint stops right before removing WAL segments
+$node->wait_for_event('client backend', 'logical-replication-slot-advance-segment');
+
+# OK, we're in the right situation,  time to advance the physical slot,
+# which recalculates the required LSN, and then unblock the checkpoint,
+# which removes the WAL still needed by the logical slot
+$node->safe_psql('postgres',
+	q{select pg_replication_slot_advance('slot_physical', pg_current_wal_lsn())});
+
+$node->safe_psql('postgres',
+	q{select injection_points_wakeup('checkpoint-before-old-wal-removal')});
+
+# abruptly stop the server (1 second should be enough for the checkpoint
+# to finish, would be better )
+$node->stop('immediate');
+
+$node->start;
+
+eval {
+	$node->safe_psql('postgres', q{select count(*) from pg_logical_slot_get_changes('slot_logical', null, null);});
+};
+is($@, '', "Logical slot still valid");
+
+done_testing();
-- 
2.34.1

#21Alexander Korotkov
aekorotkov@gmail.com
In reply to: Vitaly Davydov (#20)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

Hi Vitaly!

On Fri, May 2, 2025 at 8:47 PM Vitaly Davydov <v.davydov@postgrespro.ru> wrote:

Thank you for the attention to the patch. I updated a patch with a better
solution for the master branch which can be easily backported to the other
branches as we agree on the final solution.

Two tests are introduced which are based on Tomas Vondra's test for logical slots
with injection points from the discussion (patches: [1], [2], [3]). Tests
are implemented as module tests in src/test/modules/test_replslot_required_lsn
directory. I slightly modified the original test for logical slots and created a
new simpler test for physical slots without any additional injection points.

The patchset doesn't seem to build after 371f2db8b0, which adjusted
the signature of the INJECTION_POINT() macro. Could you, please,
update the patchset accordingly.

I prepared a new solution (patch [4]) which is also based on Tomas Vondra's
proposal. With a fresh eye, I realized that it can fix the issue as well. It is
easy and less invasive to implement. The new solution differs from my original
solution: it is backward compatible (doesn't require any changes in ReplicationSlot
structure). My original solution can be backward compatible as well if to
allocate flushed_restart_lsn in a separate array in shmem, not in the
ReplicationSlot structure, but I believe the new solution is the better one. If
you still think that my previous solution is the better (I don't think so), I
will prepare a backward compatible patch with my previous solution.

I see in 0004 patch we're calling XLogGetReplicationSlotMinimumLSN()
before slots synchronization then use it for WAL truncation.
Generally looks good. But what about the "if
(InvalidateObsoleteReplicationSlots(...))" branch? It calls
XLogGetReplicationSlotMinimumLSN() again. Why would the value
obtained from the latter call reflect slots as they are synchronized
to the disk?

------
Regards,
Alexander Korotkov
Supabase

#22Vitaly Davydov
v.davydov@postgrespro.ru
In reply to: Alexander Korotkov (#21)
6 attachment(s)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

Hi Alexander,

Thank you very much for the review!

The patchset doesn't seem to build after 371f2db8b0, which adjusted
the signature of the INJECTION_POINT() macro. Could you, please,
update the patchset accordingly.

I've updated the patch (see attached). Thanks.

I see in 0004 patch we're calling XLogGetReplicationSlotMinimumLSN()
before slots synchronization then use it for WAL truncation.
Generally looks good. But what about the "if
(InvalidateObsoleteReplicationSlots(...))" branch? It calls
XLogGetReplicationSlotMinimumLSN() again. Why would the value
obtained from the latter call reflect slots as they are synchronized
to the disk?

In patch 0004 I call XLogGetReplicationSlotMinimumLSN() again to keep the old
behaviour - this function was called in KeepLogSeg prior to my change. I also
call CheckPointReplicationSlots at the next line to save the invalidated and
other dirty slots on disk again to make sure, the new oldest LSN is in sync.

The problem I tried to solve in this if-branch is to fix test
src/test/recovery/t/019_replslot_limit.pl which was failed because the WAL was
not truncated enought for the test to pass ok. In general, this branch is not
necessary and we may fix the test by calling checkpoint twice (please, see the
alternative.rej patch for this case). If you think, we should incorporate this
new change, I'm ok to do it. But the WAL will be truncating more lazily.

Furthermore, I think we can save slots on disk right after invalidation, not in
CheckPointGuts to avoid saving invalidated slots twice.

With best regards,
Vitaly

Attachments:

0002-Add-TAP-test-to-check-logical-repl-slot-advance-duri.v3.patchtext/x-patchDownload
From 41eed2a90d68f4d9ac1ee3d00c89879358d19fd1 Mon Sep 17 00:00:00 2001
From: Tomas Vondra <tomas@vondra.me>
Date: Thu, 21 Nov 2024 23:07:22 +0100
Subject: [PATCH 2/5] Add TAP test to check logical repl slot advance during
 checkpoint

The test verifies that logical replication slot is still valid after
immediate restart on checkpoint completion in case when the slot was
advanced during checkpoint.

Original patch by: Tomas Vondra <tomas@vondra.me>
Modified by: Vitaly Davydov <v.davydov@postgrespro.ru>
Discussion: https://www.postgresql.org/message-id/flat/1d12d2-67235980-35-19a406a0%4063439497
---
 src/test/modules/Makefile                     |   4 +-
 src/test/modules/meson.build                  |   1 +
 .../test_replslot_required_lsn/Makefile       |  18 +++
 .../test_replslot_required_lsn/meson.build    |  15 +++
 .../t/001_logical_slot.pl                     | 124 ++++++++++++++++++
 5 files changed, 160 insertions(+), 2 deletions(-)
 create mode 100644 src/test/modules/test_replslot_required_lsn/Makefile
 create mode 100644 src/test/modules/test_replslot_required_lsn/meson.build
 create mode 100644 src/test/modules/test_replslot_required_lsn/t/001_logical_slot.pl

diff --git a/src/test/modules/Makefile b/src/test/modules/Makefile
index aa1d27bbed3..53d3dd8e0ed 100644
--- a/src/test/modules/Makefile
+++ b/src/test/modules/Makefile
@@ -46,9 +46,9 @@ SUBDIRS = \
 
 
 ifeq ($(enable_injection_points),yes)
-SUBDIRS += injection_points gin typcache
+SUBDIRS += injection_points gin typcache test_replslot_required_lsn
 else
-ALWAYS_SUBDIRS += injection_points gin typcache
+ALWAYS_SUBDIRS += injection_points gin typcache test_replslot_required_lsn
 endif
 
 ifeq ($(with_ssl),openssl)
diff --git a/src/test/modules/meson.build b/src/test/modules/meson.build
index 9de0057bd1d..ac0dbd1f10f 100644
--- a/src/test/modules/meson.build
+++ b/src/test/modules/meson.build
@@ -43,3 +43,4 @@ subdir('typcache')
 subdir('unsafe_tests')
 subdir('worker_spi')
 subdir('xid_wraparound')
+subdir('test_replslot_required_lsn')
diff --git a/src/test/modules/test_replslot_required_lsn/Makefile b/src/test/modules/test_replslot_required_lsn/Makefile
new file mode 100644
index 00000000000..e5ff8af255b
--- /dev/null
+++ b/src/test/modules/test_replslot_required_lsn/Makefile
@@ -0,0 +1,18 @@
+# src/test/modules/test_replslot_required_lsn/Makefile
+
+EXTRA_INSTALL=src/test/modules/injection_points \
+	contrib/test_decoding
+
+export enable_injection_points
+TAP_TESTS = 1
+
+ifdef USE_PGXS
+PG_CONFIG = pg_config
+PGXS := $(shell $(PG_CONFIG) --pgxs)
+include $(PGXS)
+else
+subdir = src/test/modules/test_replslot_required_lsn
+top_builddir = ../../../..
+include $(top_builddir)/src/Makefile.global
+include $(top_srcdir)/contrib/contrib-global.mk
+endif
diff --git a/src/test/modules/test_replslot_required_lsn/meson.build b/src/test/modules/test_replslot_required_lsn/meson.build
new file mode 100644
index 00000000000..999c16201fb
--- /dev/null
+++ b/src/test/modules/test_replslot_required_lsn/meson.build
@@ -0,0 +1,15 @@
+# Copyright (c) 2025, PostgreSQL Global Development Group
+
+tests += {
+  'name': 'test_replslot_required_lsn',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'env': {
+       'enable_injection_points': get_option('injection_points') ? 'yes' : 'no',
+    },
+    'tests': [
+      't/001_logical_slot.pl'
+    ],
+  },
+}
diff --git a/src/test/modules/test_replslot_required_lsn/t/001_logical_slot.pl b/src/test/modules/test_replslot_required_lsn/t/001_logical_slot.pl
new file mode 100644
index 00000000000..ff13c741ad0
--- /dev/null
+++ b/src/test/modules/test_replslot_required_lsn/t/001_logical_slot.pl
@@ -0,0 +1,124 @@
+# Copyright (c) 2025, PostgreSQL Global Development Group
+#
+# This test verifies the case when the logical slot is advanced during
+# checkpoint. The test checks that the logical slot's restart_lsn still refers
+# to an existed WAL segment after immediate restart.
+#
+# Discussion:
+# https://www.postgresql.org/message-id/flat/1d12d2-67235980-35-19a406a0%4063439497
+#
+use strict;
+use warnings FATAL => 'all';
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+
+use Test::More;
+
+if ($ENV{enable_injection_points} ne 'yes')
+{
+	plan skip_all => 'Injection points not supported by this build';
+}
+
+my ($node, $result);
+
+$node = PostgreSQL::Test::Cluster->new('mike');
+$node->init;
+$node->append_conf('postgresql.conf',
+	"shared_preload_libraries = 'injection_points'");
+$node->append_conf('postgresql.conf',
+	"wal_level = 'logical'");
+$node->start;
+$node->safe_psql('postgres', q(CREATE EXTENSION injection_points));
+
+# create a simple table to generate data into
+$node->safe_psql('postgres',
+	q{create table t (id serial primary key, b text)});
+
+# create the two slots we'll need
+$node->safe_psql('postgres',
+	q{select pg_create_logical_replication_slot('slot_logical', 'test_decoding')});
+$node->safe_psql('postgres',
+	q{select pg_create_physical_replication_slot('slot_physical', true)});
+
+# advance both to current position, just to have everything "valid"
+$node->safe_psql('postgres',
+	q{select count(*) from pg_logical_slot_get_changes('slot_logical', null, null)});
+$node->safe_psql('postgres',
+	q{select pg_replication_slot_advance('slot_physical', pg_current_wal_lsn())});
+
+# run checkpoint, to flush current state to disk and set a baseline
+$node->safe_psql('postgres', q{checkpoint});
+
+# generate transactions to get RUNNING_XACTS
+my $xacts = $node->background_psql('postgres');
+$xacts->query_until(qr/run_xacts/,
+q(\echo run_xacts
+SELECT 1 \watch 0.1
+\q
+));
+
+# insert 2M rows, that's about 260MB (~20 segments) worth of WAL
+$node->safe_psql('postgres',
+	q{insert into t (b) select md5(i::text) from generate_series(1,1000000) s(i)});
+
+# run another checkpoint, to set a new restore LSN
+$node->safe_psql('postgres', q{checkpoint});
+
+# another 2M rows, that's about 260MB (~20 segments) worth of WAL
+$node->safe_psql('postgres',
+	q{insert into t (b) select md5(i::text) from generate_series(1,1000000) s(i)});
+
+# run another checkpoint, this time in the background, and make it wait
+# on the injection point), so that the checkpoint stops right before
+# removing old WAL segments
+print('starting checkpoint\n');
+
+my $checkpoint = $node->background_psql('postgres');
+$checkpoint->query_safe(q(select injection_points_attach('checkpoint-before-old-wal-removal','wait')));
+$checkpoint->query_until(qr/starting_checkpoint/,
+q(\echo starting_checkpoint
+checkpoint;
+\q
+));
+
+print('waiting for injection_point\n');
+# wait until the checkpoint stops right before removing WAL segments
+$node->wait_for_event('checkpointer', 'checkpoint-before-old-wal-removal');
+
+
+# try to advance the logical slot, but make it stop when it moves to the
+# next WAL segment (has to happen in the background too)
+my $logical = $node->background_psql('postgres');
+$logical->query_safe(q{select injection_points_attach('logical-replication-slot-advance-segment','wait');});
+$logical->query_until(qr/get_changes/,
+q(
+\echo get_changes
+select count(*) from pg_logical_slot_get_changes('slot_logical', null, null) \watch 1
+\q
+));
+
+# wait until the checkpoint stops right before removing WAL segments
+$node->wait_for_event('client backend', 'logical-replication-slot-advance-segment');
+
+# OK, we're in the right situation,  time to advance the physical slot,
+# which recalculates the required LSN, and then unblock the checkpoint,
+# which removes the WAL still needed by the logical slot
+$node->safe_psql('postgres',
+	q{select pg_replication_slot_advance('slot_physical', pg_current_wal_lsn())});
+
+$node->safe_psql('postgres',
+	q{select injection_points_wakeup('checkpoint-before-old-wal-removal')});
+
+# abruptly stop the server (1 second should be enough for the checkpoint
+# to finish, would be better )
+$node->stop('immediate');
+
+$node->start;
+
+eval {
+	$node->safe_psql('postgres', q{select count(*) from pg_logical_slot_get_changes('slot_logical', null, null);});
+};
+is($@, '', "Logical slot still valid");
+
+done_testing();
-- 
2.34.1

0004-Keep-WAL-segments-by-slot-s-flushed-restart-LSN.v3.patchtext/x-patchDownload
From 88078156f67aabeaa91d226ca4967c827dee977f Mon Sep 17 00:00:00 2001
From: Vitaly Davydov <v.davydov@postgrespro.ru>
Date: Wed, 30 Apr 2025 14:09:21 +0300
Subject: [PATCH 4/5] Keep WAL segments by slot's flushed restart LSN

The patch fixes the issue with unexpected removal of old WAL segments
after checkpoint followed by immediate restart. The issue occurs when a
slot is advanced after the start of checkpoint and before old WAL
segments removal at end of checkpoint.

The idea of the patch is to get the minimal restart_lsn at the beginning
of checkpoint (or restart point) creation and use this value when
calculating oldest LSN for WAL segments removal at the end of
checkpoint. This idea was proposed by Tomas Vondra in the discussion.

Discussion:
https://www.postgresql.org/message-id/flat/1d12d2-67235980-35-19a406a0%4063439497
---
 src/backend/access/transam/xlog.c | 37 ++++++++++++++++++++++++-------
 1 file changed, 29 insertions(+), 8 deletions(-)

diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index 47ffc0a2307..9c0f9a0af28 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -677,7 +677,8 @@ static XLogRecPtr CreateOverwriteContrecordRecord(XLogRecPtr aborted_lsn,
 												  XLogRecPtr pagePtr,
 												  TimeLineID newTLI);
 static void CheckPointGuts(XLogRecPtr checkPointRedo, int flags);
-static void KeepLogSeg(XLogRecPtr recptr, XLogSegNo *logSegNo);
+static void KeepLogSeg(XLogRecPtr recptr, XLogRecPtr slotsMinLSN,
+					   XLogSegNo *logSegNo);
 static XLogRecPtr XLogGetReplicationSlotMinimumLSN(void);
 
 static void AdvanceXLInsertBuffer(XLogRecPtr upto, TimeLineID tli,
@@ -7087,6 +7088,7 @@ CreateCheckPoint(int flags)
 	VirtualTransactionId *vxids;
 	int			nvxids;
 	int			oldXLogAllowed = 0;
+	XLogRecPtr	slotsMinReqLSN;
 
 	/*
 	 * An end-of-recovery checkpoint is really a shutdown checkpoint, just
@@ -7315,6 +7317,11 @@ CreateCheckPoint(int flags)
 	 */
 	END_CRIT_SECTION();
 
+	/*
+	 * Get the current minimum LSN to be used later in WAL segments cleanup.
+	 */
+	slotsMinReqLSN = XLogGetReplicationSlotMinimumLSN();
+
 	/*
 	 * In some cases there are groups of actions that must all occur on one
 	 * side or the other of a checkpoint record. Before flushing the
@@ -7507,17 +7514,20 @@ CreateCheckPoint(int flags)
 	 * prevent the disk holding the xlog from growing full.
 	 */
 	XLByteToSeg(RedoRecPtr, _logSegNo, wal_segment_size);
-	KeepLogSeg(recptr, &_logSegNo);
+	KeepLogSeg(recptr, slotsMinReqLSN, &_logSegNo);
 	if (InvalidateObsoleteReplicationSlots(RS_INVAL_WAL_REMOVED | RS_INVAL_IDLE_TIMEOUT,
 										   _logSegNo, InvalidOid,
 										   InvalidTransactionId))
 	{
+		slotsMinReqLSN = XLogGetReplicationSlotMinimumLSN();
+		CheckPointReplicationSlots(shutdown);
+
 		/*
 		 * Some slots have been invalidated; recalculate the old-segment
 		 * horizon, starting again from RedoRecPtr.
 		 */
 		XLByteToSeg(RedoRecPtr, _logSegNo, wal_segment_size);
-		KeepLogSeg(recptr, &_logSegNo);
+		KeepLogSeg(recptr, slotsMinReqLSN, &_logSegNo);
 	}
 	_logSegNo--;
 	RemoveOldXlogFiles(_logSegNo, RedoRecPtr, recptr,
@@ -7792,6 +7802,7 @@ CreateRestartPoint(int flags)
 	XLogRecPtr	endptr;
 	XLogSegNo	_logSegNo;
 	TimestampTz xtime;
+	XLogRecPtr	slotsMinReqLSN;
 
 	/* Concurrent checkpoint/restartpoint cannot happen */
 	Assert(!IsUnderPostmaster || MyBackendType == B_CHECKPOINTER);
@@ -7874,6 +7885,11 @@ CreateRestartPoint(int flags)
 	MemSet(&CheckpointStats, 0, sizeof(CheckpointStats));
 	CheckpointStats.ckpt_start_t = GetCurrentTimestamp();
 
+	/*
+	 * Get the current minimum LSN to be used later in WAL segments cleanup.
+	 */
+	slotsMinReqLSN = XLogGetReplicationSlotMinimumLSN();
+
 	if (log_checkpoints)
 		LogCheckpointStart(flags, true);
 
@@ -7962,17 +7978,20 @@ CreateRestartPoint(int flags)
 	receivePtr = GetWalRcvFlushRecPtr(NULL, NULL);
 	replayPtr = GetXLogReplayRecPtr(&replayTLI);
 	endptr = (receivePtr < replayPtr) ? replayPtr : receivePtr;
-	KeepLogSeg(endptr, &_logSegNo);
+	KeepLogSeg(endptr, slotsMinReqLSN, &_logSegNo);
 	if (InvalidateObsoleteReplicationSlots(RS_INVAL_WAL_REMOVED | RS_INVAL_IDLE_TIMEOUT,
 										   _logSegNo, InvalidOid,
 										   InvalidTransactionId))
 	{
+		slotsMinReqLSN = XLogGetReplicationSlotMinimumLSN();
+		CheckPointReplicationSlots(flags & CHECKPOINT_IS_SHUTDOWN);
+
 		/*
 		 * Some slots have been invalidated; recalculate the old-segment
 		 * horizon, starting again from RedoRecPtr.
 		 */
 		XLByteToSeg(RedoRecPtr, _logSegNo, wal_segment_size);
-		KeepLogSeg(endptr, &_logSegNo);
+		KeepLogSeg(endptr, slotsMinReqLSN, &_logSegNo);
 	}
 	_logSegNo--;
 
@@ -8067,6 +8086,7 @@ GetWALAvailability(XLogRecPtr targetLSN)
 	XLogSegNo	oldestSegMaxWalSize;	/* oldest segid kept by max_wal_size */
 	XLogSegNo	oldestSlotSeg;	/* oldest segid kept by slot */
 	uint64		keepSegs;
+	XLogRecPtr	slotsMinReqLSN;
 
 	/*
 	 * slot does not reserve WAL. Either deactivated, or has never been active
@@ -8080,8 +8100,9 @@ GetWALAvailability(XLogRecPtr targetLSN)
 	 * oldestSlotSeg to the current segment.
 	 */
 	currpos = GetXLogWriteRecPtr();
+	slotsMinReqLSN = XLogGetReplicationSlotMinimumLSN();
 	XLByteToSeg(currpos, oldestSlotSeg, wal_segment_size);
-	KeepLogSeg(currpos, &oldestSlotSeg);
+	KeepLogSeg(currpos, slotsMinReqLSN, &oldestSlotSeg);
 
 	/*
 	 * Find the oldest extant segment file. We get 1 until checkpoint removes
@@ -8142,7 +8163,7 @@ GetWALAvailability(XLogRecPtr targetLSN)
  * invalidation is optionally done here, instead.
  */
 static void
-KeepLogSeg(XLogRecPtr recptr, XLogSegNo *logSegNo)
+KeepLogSeg(XLogRecPtr recptr, XLogRecPtr slotsMinReqLSN, XLogSegNo *logSegNo)
 {
 	XLogSegNo	currSegNo;
 	XLogSegNo	segno;
@@ -8155,7 +8176,7 @@ KeepLogSeg(XLogRecPtr recptr, XLogSegNo *logSegNo)
 	 * Calculate how many segments are kept by slots first, adjusting for
 	 * max_slot_wal_keep_size.
 	 */
-	keep = XLogGetReplicationSlotMinimumLSN();
+	keep = slotsMinReqLSN;
 	if (keep != InvalidXLogRecPtr && keep < recptr)
 	{
 		XLByteToSeg(keep, segno, wal_segment_size);
-- 
2.34.1

alternative.rejtext/x-rejectDownload
From 114c91d8dd8b9070222b1a59abfa61a9daece4f0 Mon Sep 17 00:00:00 2001
From: Vitaly Davydov <v.davydov@postgrespro.ru>
Date: Tue, 20 May 2025 18:07:19 +0300
Subject: [PATCH] Alternative solution with 019_replslot_limit.pl fix

---
 src/backend/access/transam/xlog.c         | 16 ++++------------
 src/test/recovery/t/019_replslot_limit.pl | 16 ++++++++++++++++
 2 files changed, 20 insertions(+), 12 deletions(-)

diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index 624be87a609..4c3b68a94dc 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -7520,16 +7520,12 @@ CreateCheckPoint(int flags)
 										   _logSegNo, InvalidOid,
 										   InvalidTransactionId))
 	{
-		ReplicationSlotsComputeRequiredLSN();
-		slotsMinReqLSN = XLogGetReplicationSlotMinimumLSN();
-		CheckPointReplicationSlots(shutdown);
-
 		/*
 		 * Some slots have been invalidated; recalculate the old-segment
 		 * horizon, starting again from RedoRecPtr.
 		 */
-		XLByteToSeg(RedoRecPtr, _logSegNo, wal_segment_size);
-		KeepLogSeg(recptr, slotsMinReqLSN, &_logSegNo);
+		/* XLByteToSeg(RedoRecPtr, _logSegNo, wal_segment_size); */
+		/* KeepLogSeg(recptr, slotsMinReqLSN, &_logSegNo); */
 	}
 	_logSegNo--;
 	RemoveOldXlogFiles(_logSegNo, RedoRecPtr, recptr,
@@ -7986,16 +7982,12 @@ CreateRestartPoint(int flags)
 										   _logSegNo, InvalidOid,
 										   InvalidTransactionId))
 	{
-		ReplicationSlotsComputeRequiredLSN();
-		slotsMinReqLSN = XLogGetReplicationSlotMinimumLSN();
-		CheckPointReplicationSlots(flags & CHECKPOINT_IS_SHUTDOWN);
-
 		/*
 		 * Some slots have been invalidated; recalculate the old-segment
 		 * horizon, starting again from RedoRecPtr.
 		 */
-		XLByteToSeg(RedoRecPtr, _logSegNo, wal_segment_size);
-		KeepLogSeg(endptr, slotsMinReqLSN, &_logSegNo);
+		/* XLByteToSeg(RedoRecPtr, _logSegNo, wal_segment_size); */
+		/* KeepLogSeg(endptr, slotsMinReqLSN, &_logSegNo); */
 	}
 	_logSegNo--;
 
diff --git a/src/test/recovery/t/019_replslot_limit.pl b/src/test/recovery/t/019_replslot_limit.pl
index 6468784b83d..2ce1882cc59 100644
--- a/src/test/recovery/t/019_replslot_limit.pl
+++ b/src/test/recovery/t/019_replslot_limit.pl
@@ -212,6 +212,22 @@ for (my $i = 0; $i < 10 * $PostgreSQL::Test::Utils::timeout_default; $i++)
 }
 ok($checkpoint_ended, 'waited for checkpoint to end');
 
+# Execute one more checkpoint to advance the old-segment horizon after slot
+# invalidation. Slots are invalidated in the checkpoint after the old segment
+# horizon is calculated.
+$node_primary->safe_psql('postgres', "CHECKPOINT;");
+$checkpoint_ended = 0;
+for (my $i = 0; $i < 10 * $PostgreSQL::Test::Utils::timeout_default; $i++)
+{
+	if ($node_primary->log_contains("checkpoint complete: ", $logstart))
+	{
+		$checkpoint_ended = 1;
+		last;
+	}
+	usleep(100_000);
+}
+ok($checkpoint_ended, 'waited for checkpoint to end');
+
 # The invalidated slot shouldn't keep the old-segment horizon back;
 # see bug #17103: https://postgr.es/m/17103-004130e8f27782c9@postgresql.org
 # Test for this by creating a new slot and comparing its restart LSN
-- 
2.34.1

0003-Add-TAP-test-to-check-physical-repl-slot-advance-dur.v3.patchtext/x-patchDownload
From 2131771f97fc3497906568612f9fdda027238d42 Mon Sep 17 00:00:00 2001
From: Vitaly Davydov <v.davydov@postgrespro.ru>
Date: Wed, 30 Apr 2025 12:48:27 +0300
Subject: [PATCH 3/5] Add TAP test to check physical repl slot advance during
 checkpoint

The test verifies that the physical replication slot is still valid
after immediate restart on checkpoint completion in case when the slot
was advanced during checkpoint.

Discussion: https://www.postgresql.org/message-id/flat/1d12d2-67235980-35-19a406a0%4063439497
---
 .../test_replslot_required_lsn/meson.build    |   3 +-
 .../t/002_physical_slot.pl                    | 126 ++++++++++++++++++
 2 files changed, 128 insertions(+), 1 deletion(-)
 create mode 100644 src/test/modules/test_replslot_required_lsn/t/002_physical_slot.pl

diff --git a/src/test/modules/test_replslot_required_lsn/meson.build b/src/test/modules/test_replslot_required_lsn/meson.build
index 999c16201fb..44d2546632b 100644
--- a/src/test/modules/test_replslot_required_lsn/meson.build
+++ b/src/test/modules/test_replslot_required_lsn/meson.build
@@ -9,7 +9,8 @@ tests += {
        'enable_injection_points': get_option('injection_points') ? 'yes' : 'no',
     },
     'tests': [
-      't/001_logical_slot.pl'
+      't/001_logical_slot.pl',
+      't/002_physical_slot.pl'
     ],
   },
 }
diff --git a/src/test/modules/test_replslot_required_lsn/t/002_physical_slot.pl b/src/test/modules/test_replslot_required_lsn/t/002_physical_slot.pl
new file mode 100644
index 00000000000..f89aec1da32
--- /dev/null
+++ b/src/test/modules/test_replslot_required_lsn/t/002_physical_slot.pl
@@ -0,0 +1,126 @@
+# Copyright (c) 2025, PostgreSQL Global Development Group
+#
+# This test verifies the case when the physical slot is advanced during
+# checkpoint. The test checks that the physical slot's restart_lsn still refers
+# to an existed WAL segment after immediate restart.
+#
+# Discussion:
+# https://www.postgresql.org/message-id/flat/1d12d2-67235980-35-19a406a0%4063439497
+#
+use strict;
+use warnings FATAL => 'all';
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+
+use Test::More;
+
+if ($ENV{enable_injection_points} ne 'yes')
+{
+	plan skip_all => 'Injection points not supported by this build';
+}
+
+my ($node, $result);
+
+$node = PostgreSQL::Test::Cluster->new('mike');
+$node->init();
+$node->append_conf('postgresql.conf',
+	"shared_preload_libraries = 'injection_points'");
+$node->append_conf('postgresql.conf',
+	"wal_level = 'replica'");
+$node->start();
+$node->safe_psql('postgres', q(CREATE EXTENSION injection_points));
+
+# create a simple table to generate data into
+$node->safe_psql('postgres',
+	q{create table t (id serial primary key, b text)});
+
+# create a physical replication slot
+$node->safe_psql('postgres',
+	q{select pg_create_physical_replication_slot('slot_physical', true)});
+
+# advance slot to current position, just to have everything "valid"
+$node->safe_psql('postgres',
+	q{select pg_replication_slot_advance('slot_physical', pg_current_wal_lsn())});
+
+# run checkpoint, to flush current state to disk and set a baseline
+$node->safe_psql('postgres', q{checkpoint});
+
+# insert 2M rows, that's about 260MB (~20 segments) worth of WAL
+$node->safe_psql('postgres',
+	q{insert into t (b) select md5(i::text) from generate_series(1,100000) s(i)});
+
+# advance slot to current position, just to have everything "valid"
+$node->safe_psql('postgres',
+	q{select pg_replication_slot_advance('slot_physical', pg_current_wal_lsn())});
+
+# run another checkpoint, to set a new restore LSN
+$node->safe_psql('postgres', q{checkpoint});
+
+# another 2M rows, that's about 260MB (~20 segments) worth of WAL
+$node->safe_psql('postgres',
+	q{insert into t (b) select md5(i::text) from generate_series(1,1000000) s(i)});
+
+my $restart_lsn_init = $node->safe_psql('postgres',
+	q{select restart_lsn from pg_replication_slots where slot_name = 'slot_physical'});
+chomp($restart_lsn_init);
+note("restart lsn before checkpoint: $restart_lsn_init");
+
+# run another checkpoint, this time in the background, and make it wait
+# on the injection point), so that the checkpoint stops right before
+# removing old WAL segments
+note('starting checkpoint');
+
+my $checkpoint = $node->background_psql('postgres');
+$checkpoint->query_safe(
+	q{select injection_points_attach('checkpoint-before-old-wal-removal','wait')});
+$checkpoint->query_until(qr/starting_checkpoint/,
+q(\echo starting_checkpoint
+checkpoint;
+\q
+));
+
+# wait until the checkpoint stops right before removing WAL segments
+note('waiting for injection_point');
+$node->wait_for_event('checkpointer', 'checkpoint-before-old-wal-removal');
+note('injection_point is reached');
+
+# OK, we're in the right situation,  time to advance the physical slot,
+# which recalculates the required LSN, and then unblock the checkpoint,
+# which removes the WAL still needed by the logical slot
+$node->safe_psql('postgres',
+	q{select pg_replication_slot_advance('slot_physical', pg_current_wal_lsn())});
+
+# Continue checkpoint
+$node->safe_psql('postgres',
+	q{select injection_points_wakeup('checkpoint-before-old-wal-removal')});
+
+my $restart_lsn_old = $node->safe_psql('postgres',
+	q{select restart_lsn from pg_replication_slots where slot_name = 'slot_physical'});
+chomp($restart_lsn_old);
+note("restart lsn before stop: $restart_lsn_old");
+
+# abruptly stop the server (1 second should be enough for the checkpoint
+# to finish, would be better )
+$node->stop('immediate');
+
+$node->start;
+
+# Get the restart_lsn of the slot right after restarting
+my $restart_lsn = $node->safe_psql('postgres',
+	q{select restart_lsn from pg_replication_slots where slot_name = 'slot_physical'});
+chomp($restart_lsn);
+note("restart lsn: $restart_lsn");
+
+# Get wal segment name for slot's restart_lsn
+my $restart_lsn_segment = $node->safe_psql('postgres',
+	"SELECT pg_walfile_name('$restart_lsn'::pg_lsn)");
+chomp($restart_lsn_segment);
+
+# Check if the required wal segment exists
+note("required by slot segment name: $restart_lsn_segment");
+my $datadir = $node->data_dir;
+ok(-f "$datadir/pg_wal/$restart_lsn_segment",
+	"WAL segment $restart_lsn_segment for physical slot's restart_lsn $restart_lsn exists");
+
+done_testing();
-- 
2.34.1

0005-Remove-redundant-ReplicationSlotsComputeRequiredLSN-.v3.patchtext/x-patchDownload
From 7a7f0c8404bee31291f7cd0c07b307b04805aab1 Mon Sep 17 00:00:00 2001
From: Vitaly Davydov <v.davydov@postgrespro.ru>
Date: Thu, 1 May 2025 12:18:52 +0300
Subject: [PATCH 5/5] Remove redundant ReplicationSlotsComputeRequiredLSN calls

The function ReplicationSlotsComputeRequiredLSN is used to calculate the
oldest slots' required LSN. It is called every time when restart_lsn
value of any slot is changed (for example, when a slot is advancing).
The slot's oldest required LSN is used to remote old WAL segments in two
places - when checkpoint or restart point is created (CreateCheckPoint,
CreateRestartPoint functions). Old WAL segments seems to be truncated in
these two functions only.

The idea of the patch is to call ReplicationSlotsComputeRequiredLSN in
CreateCheckPoint or CreateRestartPoint functions only, before call of
RemoveOldXlogFiles function where old WAL segments are removed. There
is no obvious need to recalculate oldest required LSN every time when a
slot's restart_lsn is changed.

The value of the oldest required lsn can affect on slot invalidation.
The function InvalidateObsoleteReplicationSlots with non zero second
parameter (oldestSegno) is called in CreateCheckPoint,
CreateRestartPoint functions only where slot invalidation occurs with
reason RS_INVAL_WAL_REMOVED. Once we update the oldest slots' required
lsn in the beginning of these functions, the proposed patch should not
break the behaviour of slot invalidation function in this case.
---
 src/backend/access/transam/xlog.c          | 4 ++++
 src/backend/replication/logical/logical.c  | 1 -
 src/backend/replication/logical/slotsync.c | 4 ----
 src/backend/replication/slot.c             | 5 -----
 src/backend/replication/slotfuncs.c        | 2 --
 src/backend/replication/walsender.c        | 1 -
 6 files changed, 4 insertions(+), 13 deletions(-)

diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index 9c0f9a0af28..624be87a609 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -7320,6 +7320,7 @@ CreateCheckPoint(int flags)
 	/*
 	 * Get the current minimum LSN to be used later in WAL segments cleanup.
 	 */
+	ReplicationSlotsComputeRequiredLSN();
 	slotsMinReqLSN = XLogGetReplicationSlotMinimumLSN();
 
 	/*
@@ -7519,6 +7520,7 @@ CreateCheckPoint(int flags)
 										   _logSegNo, InvalidOid,
 										   InvalidTransactionId))
 	{
+		ReplicationSlotsComputeRequiredLSN();
 		slotsMinReqLSN = XLogGetReplicationSlotMinimumLSN();
 		CheckPointReplicationSlots(shutdown);
 
@@ -7888,6 +7890,7 @@ CreateRestartPoint(int flags)
 	/*
 	 * Get the current minimum LSN to be used later in WAL segments cleanup.
 	 */
+	ReplicationSlotsComputeRequiredLSN();
 	slotsMinReqLSN = XLogGetReplicationSlotMinimumLSN();
 
 	if (log_checkpoints)
@@ -7983,6 +7986,7 @@ CreateRestartPoint(int flags)
 										   _logSegNo, InvalidOid,
 										   InvalidTransactionId))
 	{
+		ReplicationSlotsComputeRequiredLSN();
 		slotsMinReqLSN = XLogGetReplicationSlotMinimumLSN();
 		CheckPointReplicationSlots(flags & CHECKPOINT_IS_SHUTDOWN);
 
diff --git a/src/backend/replication/logical/logical.c b/src/backend/replication/logical/logical.c
index de4d86afa22..bc88ccb0207 100644
--- a/src/backend/replication/logical/logical.c
+++ b/src/backend/replication/logical/logical.c
@@ -1917,7 +1917,6 @@ LogicalConfirmReceivedLocation(XLogRecPtr lsn)
 			SpinLockRelease(&MyReplicationSlot->mutex);
 
 			ReplicationSlotsComputeRequiredXmin(false);
-			ReplicationSlotsComputeRequiredLSN();
 		}
 	}
 	else
diff --git a/src/backend/replication/logical/slotsync.c b/src/backend/replication/logical/slotsync.c
index 656e66e0ae0..30662c09275 100644
--- a/src/backend/replication/logical/slotsync.c
+++ b/src/backend/replication/logical/slotsync.c
@@ -335,7 +335,6 @@ update_local_synced_slot(RemoteSlot *remote_slot, Oid remote_dbid,
 		SpinLockRelease(&slot->mutex);
 
 		ReplicationSlotsComputeRequiredXmin(false);
-		ReplicationSlotsComputeRequiredLSN();
 	}
 
 	return updated_config || updated_xmin_or_lsn;
@@ -502,9 +501,6 @@ reserve_wal_for_local_slot(XLogRecPtr restart_lsn)
 		slot->data.restart_lsn = restart_lsn;
 		SpinLockRelease(&slot->mutex);
 
-		/* Prevent WAL removal as fast as possible */
-		ReplicationSlotsComputeRequiredLSN();
-
 		XLByteToSeg(slot->data.restart_lsn, segno, wal_segment_size);
 
 		/*
diff --git a/src/backend/replication/slot.c b/src/backend/replication/slot.c
index 600b87fa9cb..dd18fe10f7d 100644
--- a/src/backend/replication/slot.c
+++ b/src/backend/replication/slot.c
@@ -1008,7 +1008,6 @@ ReplicationSlotDropPtr(ReplicationSlot *slot)
 	 * limits.
 	 */
 	ReplicationSlotsComputeRequiredXmin(false);
-	ReplicationSlotsComputeRequiredLSN();
 
 	/*
 	 * If removing the directory fails, the worst thing that will happen is
@@ -1494,9 +1493,6 @@ ReplicationSlotReserveWal(void)
 		slot->data.restart_lsn = restart_lsn;
 		SpinLockRelease(&slot->mutex);
 
-		/* prevent WAL removal as fast as possible */
-		ReplicationSlotsComputeRequiredLSN();
-
 		/*
 		 * If all required WAL is still there, great, otherwise retry. The
 		 * slot should prevent further removal of WAL, unless there's a
@@ -2014,7 +2010,6 @@ restart:
 	if (invalidated)
 	{
 		ReplicationSlotsComputeRequiredXmin(false);
-		ReplicationSlotsComputeRequiredLSN();
 	}
 
 	return invalidated;
diff --git a/src/backend/replication/slotfuncs.c b/src/backend/replication/slotfuncs.c
index 36cc2ed4e44..3300fb9b1c9 100644
--- a/src/backend/replication/slotfuncs.c
+++ b/src/backend/replication/slotfuncs.c
@@ -583,7 +583,6 @@ pg_replication_slot_advance(PG_FUNCTION_ARGS)
 	 * advancing potentially done.
 	 */
 	ReplicationSlotsComputeRequiredXmin(false);
-	ReplicationSlotsComputeRequiredLSN();
 
 	ReplicationSlotRelease();
 
@@ -819,7 +818,6 @@ copy_replication_slot(FunctionCallInfo fcinfo, bool logical_slot)
 
 		ReplicationSlotMarkDirty();
 		ReplicationSlotsComputeRequiredXmin(false);
-		ReplicationSlotsComputeRequiredLSN();
 		ReplicationSlotSave();
 
 #ifdef USE_ASSERT_CHECKING
diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c
index 9fa8beb6103..0767c2803d9 100644
--- a/src/backend/replication/walsender.c
+++ b/src/backend/replication/walsender.c
@@ -2384,7 +2384,6 @@ PhysicalConfirmReceivedLocation(XLogRecPtr lsn)
 	if (changed)
 	{
 		ReplicationSlotMarkDirty();
-		ReplicationSlotsComputeRequiredLSN();
 		PhysicalWakeupLogicalWalSnd();
 	}
 
-- 
2.34.1

0001-Add-injection-points-to-test-replication-slot-advanc.v3.patchtext/x-patchDownload
From 372dca207ea1275aa21b95c7bc5b8e07f71b075e Mon Sep 17 00:00:00 2001
From: Tomas Vondra <tomas@vondra.me>
Date: Thu, 21 Nov 2024 20:37:00 +0100
Subject: [PATCH 1/5] Add injection points to test replication slot advance

New injection points:

* checkpoint-before-old-wal-removal - triggered in the checkpointer
  process just before old WAL segments cleanup.

* logical-replication-slot-advance-segment - triggered in
  LogicalConfirmReceivedLocation when restart_lsn was changed enough to
  point to a next WAL segment.

Original patch by: Tomas Vondra <tomas@vondra.me>
Modified by: Vitaly Davydov <v.davydov@postgrespro.ru>
Discussion: https://www.postgresql.org/message-id/flat/1d12d2-67235980-35-19a406a0%4063439497
---
 src/backend/access/transam/xlog.c         |  4 ++++
 src/backend/replication/logical/logical.c | 18 ++++++++++++++++++
 2 files changed, 22 insertions(+)

diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index 1914859b2ee..47ffc0a2307 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -7498,6 +7498,10 @@ CreateCheckPoint(int flags)
 	if (PriorRedoPtr != InvalidXLogRecPtr)
 		UpdateCheckPointDistanceEstimate(RedoRecPtr - PriorRedoPtr);
 
+#ifdef USE_INJECTION_POINTS
+	INJECTION_POINT("checkpoint-before-old-wal-removal", NULL);
+#endif
+
 	/*
 	 * Delete old log files, those no longer needed for last checkpoint to
 	 * prevent the disk holding the xlog from growing full.
diff --git a/src/backend/replication/logical/logical.c b/src/backend/replication/logical/logical.c
index 1d56d0c4ef3..de4d86afa22 100644
--- a/src/backend/replication/logical/logical.c
+++ b/src/backend/replication/logical/logical.c
@@ -30,6 +30,7 @@
 
 #include "access/xact.h"
 #include "access/xlogutils.h"
+#include "access/xlog_internal.h"
 #include "fmgr.h"
 #include "miscadmin.h"
 #include "pgstat.h"
@@ -41,6 +42,7 @@
 #include "storage/proc.h"
 #include "storage/procarray.h"
 #include "utils/builtins.h"
+#include "utils/injection_point.h"
 #include "utils/inval.h"
 #include "utils/memutils.h"
 
@@ -1825,9 +1827,13 @@ LogicalConfirmReceivedLocation(XLogRecPtr lsn)
 	{
 		bool		updated_xmin = false;
 		bool		updated_restart = false;
+		XLogRecPtr	restart_lsn pg_attribute_unused();
 
 		SpinLockAcquire(&MyReplicationSlot->mutex);
 
+		/* remember the old restart lsn */
+		restart_lsn = MyReplicationSlot->data.restart_lsn;
+
 		/*
 		 * Prevent moving the confirmed_flush backwards, as this could lead to
 		 * data duplication issues caused by replicating already replicated
@@ -1881,6 +1887,18 @@ LogicalConfirmReceivedLocation(XLogRecPtr lsn)
 		/* first write new xmin to disk, so we know what's up after a crash */
 		if (updated_xmin || updated_restart)
 		{
+#ifdef USE_INJECTION_POINTS
+			XLogSegNo	seg1,
+						seg2;
+
+			XLByteToSeg(restart_lsn, seg1, wal_segment_size);
+			XLByteToSeg(MyReplicationSlot->data.restart_lsn, seg2, wal_segment_size);
+
+			/* trigger injection point, but only if segment changes */
+			if (seg1 != seg2)
+				INJECTION_POINT("logical-replication-slot-advance-segment", NULL);
+#endif
+
 			ReplicationSlotMarkDirty();
 			ReplicationSlotSave();
 			elog(DEBUG1, "updated xmin: %u restart: %u", updated_xmin, updated_restart);
-- 
2.34.1

#23Alexander Korotkov
aekorotkov@gmail.com
In reply to: Vitaly Davydov (#22)
3 attachment(s)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

Hi, Vitaly!

On Tue, May 20, 2025 at 6:44 PM Vitaly Davydov <v.davydov@postgrespro.ru> wrote:

Thank you very much for the review!

The patchset doesn't seem to build after 371f2db8b0, which adjusted
the signature of the INJECTION_POINT() macro. Could you, please,
update the patchset accordingly.

I've updated the patch (see attached). Thanks.

I see in 0004 patch we're calling XLogGetReplicationSlotMinimumLSN()
before slots synchronization then use it for WAL truncation.
Generally looks good. But what about the "if
(InvalidateObsoleteReplicationSlots(...))" branch? It calls
XLogGetReplicationSlotMinimumLSN() again. Why would the value
obtained from the latter call reflect slots as they are synchronized
to the disk?

In patch 0004 I call XLogGetReplicationSlotMinimumLSN() again to keep the old
behaviour - this function was called in KeepLogSeg prior to my change. I also
call CheckPointReplicationSlots at the next line to save the invalidated and
other dirty slots on disk again to make sure, the new oldest LSN is in sync.

The problem I tried to solve in this if-branch is to fix test
src/test/recovery/t/019_replslot_limit.pl which was failed because the WAL was
not truncated enought for the test to pass ok. In general, this branch is not
necessary and we may fix the test by calling checkpoint twice (please, see the
alternative.rej patch for this case). If you think, we should incorporate this
new change, I'm ok to do it. But the WAL will be truncating more lazily.

Furthermore, I think we can save slots on disk right after invalidation, not in
CheckPointGuts to avoid saving invalidated slots twice.

Thank you for the clarification. It's all good. I just missed that
CheckPointReplicationSlots() syncs slots inside the "if" branch.

I've reordered the patchset. Fix should come first, tests comes
second. So, tests pass after each commit. Also I've joined both
tests and injection points into single commit. I don't see reason to
place tests into src/test/modules, because there is no module. I've
moved them into src/test/recovery.

I also improved some comments and commit messages. I think 0001
should go to all supported releases as it fixes material bug, while
0002 should be backpatched to 17, where injection points fist appears.
0003 should go to pg19 after branching. I'm continuing reviewing
this.

------
Regards,
Alexander Korotkov
Supabase

Attachments:

v4-0001-Keep-WAL-segments-by-the-flushed-value-of-the-slo.patchapplication/x-patch; name=v4-0001-Keep-WAL-segments-by-the-flushed-value-of-the-slo.patchDownload
From c409a441be6487063d49c2671d3a3aecb9ba6994 Mon Sep 17 00:00:00 2001
From: Vitaly Davydov <v.davydov@postgrespro.ru>
Date: Wed, 30 Apr 2025 14:09:21 +0300
Subject: [PATCH v4 1/3] Keep WAL segments by the flushed value of the slot's
 restart LSN

The patch fixes the issue with the unexpected removal of old WAL segments
after checkpoint, followed by an immediate restart. The issue occurs when
a slot is advanced after the start of the checkpoint and before old WAL
segments are removed at the end of the checkpoint.

The idea of the patch is to get the minimal restart_lsn at the beginning
of checkpoint (or restart point) creation and use this value when calculating
the oldest LSN for WAL segments removal at the end of checkpoint. This idea
was proposed by Tomas Vondra in the discussion.

Discussion: https://postgr.es/m/flat/1d12d2-67235980-35-19a406a0%4063439497
Author: Vitaly Davydov <v.davydov@postgrespro.ru>
Reviewed-by: Tomas Vondra <tomas@vondra.me>
Reviewed-by: Alexander Korotkov <aekorotkov@gmail.com>
Backpatch-through: 13
---
 src/backend/access/transam/xlog.c | 37 ++++++++++++++++++++++++-------
 1 file changed, 29 insertions(+), 8 deletions(-)

diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index 1914859b2ee..30ae65fce53 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -677,7 +677,8 @@ static XLogRecPtr CreateOverwriteContrecordRecord(XLogRecPtr aborted_lsn,
 												  XLogRecPtr pagePtr,
 												  TimeLineID newTLI);
 static void CheckPointGuts(XLogRecPtr checkPointRedo, int flags);
-static void KeepLogSeg(XLogRecPtr recptr, XLogSegNo *logSegNo);
+static void KeepLogSeg(XLogRecPtr recptr, XLogRecPtr slotsMinLSN,
+					   XLogSegNo *logSegNo);
 static XLogRecPtr XLogGetReplicationSlotMinimumLSN(void);
 
 static void AdvanceXLInsertBuffer(XLogRecPtr upto, TimeLineID tli,
@@ -7087,6 +7088,7 @@ CreateCheckPoint(int flags)
 	VirtualTransactionId *vxids;
 	int			nvxids;
 	int			oldXLogAllowed = 0;
+	XLogRecPtr	slotsMinReqLSN;
 
 	/*
 	 * An end-of-recovery checkpoint is really a shutdown checkpoint, just
@@ -7315,6 +7317,11 @@ CreateCheckPoint(int flags)
 	 */
 	END_CRIT_SECTION();
 
+	/*
+	 * Get the current minimum LSN to be used later in WAL segments cleanup.
+	 */
+	slotsMinReqLSN = XLogGetReplicationSlotMinimumLSN();
+
 	/*
 	 * In some cases there are groups of actions that must all occur on one
 	 * side or the other of a checkpoint record. Before flushing the
@@ -7503,17 +7510,20 @@ CreateCheckPoint(int flags)
 	 * prevent the disk holding the xlog from growing full.
 	 */
 	XLByteToSeg(RedoRecPtr, _logSegNo, wal_segment_size);
-	KeepLogSeg(recptr, &_logSegNo);
+	KeepLogSeg(recptr, slotsMinReqLSN, &_logSegNo);
 	if (InvalidateObsoleteReplicationSlots(RS_INVAL_WAL_REMOVED | RS_INVAL_IDLE_TIMEOUT,
 										   _logSegNo, InvalidOid,
 										   InvalidTransactionId))
 	{
+		slotsMinReqLSN = XLogGetReplicationSlotMinimumLSN();
+		CheckPointReplicationSlots(shutdown);
+
 		/*
 		 * Some slots have been invalidated; recalculate the old-segment
 		 * horizon, starting again from RedoRecPtr.
 		 */
 		XLByteToSeg(RedoRecPtr, _logSegNo, wal_segment_size);
-		KeepLogSeg(recptr, &_logSegNo);
+		KeepLogSeg(recptr, slotsMinReqLSN, &_logSegNo);
 	}
 	_logSegNo--;
 	RemoveOldXlogFiles(_logSegNo, RedoRecPtr, recptr,
@@ -7788,6 +7798,7 @@ CreateRestartPoint(int flags)
 	XLogRecPtr	endptr;
 	XLogSegNo	_logSegNo;
 	TimestampTz xtime;
+	XLogRecPtr	slotsMinReqLSN;
 
 	/* Concurrent checkpoint/restartpoint cannot happen */
 	Assert(!IsUnderPostmaster || MyBackendType == B_CHECKPOINTER);
@@ -7870,6 +7881,11 @@ CreateRestartPoint(int flags)
 	MemSet(&CheckpointStats, 0, sizeof(CheckpointStats));
 	CheckpointStats.ckpt_start_t = GetCurrentTimestamp();
 
+	/*
+	 * Get the current minimum LSN to be used later in WAL segments cleanup.
+	 */
+	slotsMinReqLSN = XLogGetReplicationSlotMinimumLSN();
+
 	if (log_checkpoints)
 		LogCheckpointStart(flags, true);
 
@@ -7958,17 +7974,20 @@ CreateRestartPoint(int flags)
 	receivePtr = GetWalRcvFlushRecPtr(NULL, NULL);
 	replayPtr = GetXLogReplayRecPtr(&replayTLI);
 	endptr = (receivePtr < replayPtr) ? replayPtr : receivePtr;
-	KeepLogSeg(endptr, &_logSegNo);
+	KeepLogSeg(endptr, slotsMinReqLSN, &_logSegNo);
 	if (InvalidateObsoleteReplicationSlots(RS_INVAL_WAL_REMOVED | RS_INVAL_IDLE_TIMEOUT,
 										   _logSegNo, InvalidOid,
 										   InvalidTransactionId))
 	{
+		slotsMinReqLSN = XLogGetReplicationSlotMinimumLSN();
+		CheckPointReplicationSlots(flags & CHECKPOINT_IS_SHUTDOWN);
+
 		/*
 		 * Some slots have been invalidated; recalculate the old-segment
 		 * horizon, starting again from RedoRecPtr.
 		 */
 		XLByteToSeg(RedoRecPtr, _logSegNo, wal_segment_size);
-		KeepLogSeg(endptr, &_logSegNo);
+		KeepLogSeg(endptr, slotsMinReqLSN, &_logSegNo);
 	}
 	_logSegNo--;
 
@@ -8063,6 +8082,7 @@ GetWALAvailability(XLogRecPtr targetLSN)
 	XLogSegNo	oldestSegMaxWalSize;	/* oldest segid kept by max_wal_size */
 	XLogSegNo	oldestSlotSeg;	/* oldest segid kept by slot */
 	uint64		keepSegs;
+	XLogRecPtr	slotsMinReqLSN;
 
 	/*
 	 * slot does not reserve WAL. Either deactivated, or has never been active
@@ -8076,8 +8096,9 @@ GetWALAvailability(XLogRecPtr targetLSN)
 	 * oldestSlotSeg to the current segment.
 	 */
 	currpos = GetXLogWriteRecPtr();
+	slotsMinReqLSN = XLogGetReplicationSlotMinimumLSN();
 	XLByteToSeg(currpos, oldestSlotSeg, wal_segment_size);
-	KeepLogSeg(currpos, &oldestSlotSeg);
+	KeepLogSeg(currpos, slotsMinReqLSN, &oldestSlotSeg);
 
 	/*
 	 * Find the oldest extant segment file. We get 1 until checkpoint removes
@@ -8138,7 +8159,7 @@ GetWALAvailability(XLogRecPtr targetLSN)
  * invalidation is optionally done here, instead.
  */
 static void
-KeepLogSeg(XLogRecPtr recptr, XLogSegNo *logSegNo)
+KeepLogSeg(XLogRecPtr recptr, XLogRecPtr slotsMinReqLSN, XLogSegNo *logSegNo)
 {
 	XLogSegNo	currSegNo;
 	XLogSegNo	segno;
@@ -8151,7 +8172,7 @@ KeepLogSeg(XLogRecPtr recptr, XLogSegNo *logSegNo)
 	 * Calculate how many segments are kept by slots first, adjusting for
 	 * max_slot_wal_keep_size.
 	 */
-	keep = XLogGetReplicationSlotMinimumLSN();
+	keep = slotsMinReqLSN;
 	if (keep != InvalidXLogRecPtr && keep < recptr)
 	{
 		XLByteToSeg(keep, segno, wal_segment_size);
-- 
2.39.5 (Apple Git-154)

v4-0002-Add-TAP-tests-to-check-replication-slot-advance-d.patchapplication/x-patch; name=v4-0002-Add-TAP-tests-to-check-replication-slot-advance-d.patchDownload
From 6f2afd8239cdefc62a519825a670db2eb8a4e111 Mon Sep 17 00:00:00 2001
From: Tomas Vondra <tomas@vondra.me>
Date: Thu, 21 Nov 2024 20:37:00 +0100
Subject: [PATCH v4 2/3] Add TAP tests to check replication slot advance during
 the checkpoint

The new tests verify that logical and physical replication slots are still
valid after an immediate restart on checkpoint completion when the slot was
advanced during the checkpoint.

This commit introduces two new injection points to make these tests possible:

* checkpoint-before-old-wal-removal - triggered in the checkpointer process
  just before old WAL segments cleanup;
* logical-replication-slot-advance-segment - triggered in
  LogicalConfirmReceivedLocation() when restart_lsn was changed enough to
  point to the next WAL segment.

Discussion: https://postgr.es/m/flat/1d12d2-67235980-35-19a406a0%4063439497
Author: Vitaly Davydov <v.davydov@postgrespro.ru>
Author: Tomas Vondra <tomas@vondra.me>
Reviewed-by: Alexander Korotkov <aekorotkov@gmail.com>
Backpatch-through: 17
---
 src/backend/access/transam/xlog.c             |   4 +
 src/backend/replication/logical/logical.c     |  18 +++
 .../test_replslot_required_lsn/Makefile       |  18 +++
 .../test_replslot_required_lsn/meson.build    |  16 ++
 src/test/recovery/meson.build                 |   2 +
 src/test/recovery/t/046_logical_slot.pl       | 139 ++++++++++++++++++
 src/test/recovery/t/047_physical_slot.pl      | 136 +++++++++++++++++
 7 files changed, 333 insertions(+)
 create mode 100644 src/test/modules/test_replslot_required_lsn/Makefile
 create mode 100644 src/test/modules/test_replslot_required_lsn/meson.build
 create mode 100644 src/test/recovery/t/046_logical_slot.pl
 create mode 100644 src/test/recovery/t/047_physical_slot.pl

diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index 30ae65fce53..9c0f9a0af28 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -7505,6 +7505,10 @@ CreateCheckPoint(int flags)
 	if (PriorRedoPtr != InvalidXLogRecPtr)
 		UpdateCheckPointDistanceEstimate(RedoRecPtr - PriorRedoPtr);
 
+#ifdef USE_INJECTION_POINTS
+	INJECTION_POINT("checkpoint-before-old-wal-removal", NULL);
+#endif
+
 	/*
 	 * Delete old log files, those no longer needed for last checkpoint to
 	 * prevent the disk holding the xlog from growing full.
diff --git a/src/backend/replication/logical/logical.c b/src/backend/replication/logical/logical.c
index 1d56d0c4ef3..f1eb798f3e9 100644
--- a/src/backend/replication/logical/logical.c
+++ b/src/backend/replication/logical/logical.c
@@ -29,6 +29,7 @@
 #include "postgres.h"
 
 #include "access/xact.h"
+#include "access/xlog_internal.h"
 #include "access/xlogutils.h"
 #include "fmgr.h"
 #include "miscadmin.h"
@@ -41,6 +42,7 @@
 #include "storage/proc.h"
 #include "storage/procarray.h"
 #include "utils/builtins.h"
+#include "utils/injection_point.h"
 #include "utils/inval.h"
 #include "utils/memutils.h"
 
@@ -1825,9 +1827,13 @@ LogicalConfirmReceivedLocation(XLogRecPtr lsn)
 	{
 		bool		updated_xmin = false;
 		bool		updated_restart = false;
+		XLogRecPtr	restart_lsn pg_attribute_unused();
 
 		SpinLockAcquire(&MyReplicationSlot->mutex);
 
+		/* remember the old restart lsn */
+		restart_lsn = MyReplicationSlot->data.restart_lsn;
+
 		/*
 		 * Prevent moving the confirmed_flush backwards, as this could lead to
 		 * data duplication issues caused by replicating already replicated
@@ -1881,6 +1887,18 @@ LogicalConfirmReceivedLocation(XLogRecPtr lsn)
 		/* first write new xmin to disk, so we know what's up after a crash */
 		if (updated_xmin || updated_restart)
 		{
+#ifdef USE_INJECTION_POINTS
+			XLogSegNo	seg1,
+						seg2;
+
+			XLByteToSeg(restart_lsn, seg1, wal_segment_size);
+			XLByteToSeg(MyReplicationSlot->data.restart_lsn, seg2, wal_segment_size);
+
+			/* trigger injection point, but only if segment changes */
+			if (seg1 != seg2)
+				INJECTION_POINT("logical-replication-slot-advance-segment", NULL);
+#endif
+
 			ReplicationSlotMarkDirty();
 			ReplicationSlotSave();
 			elog(DEBUG1, "updated xmin: %u restart: %u", updated_xmin, updated_restart);
diff --git a/src/test/modules/test_replslot_required_lsn/Makefile b/src/test/modules/test_replslot_required_lsn/Makefile
new file mode 100644
index 00000000000..e5ff8af255b
--- /dev/null
+++ b/src/test/modules/test_replslot_required_lsn/Makefile
@@ -0,0 +1,18 @@
+# src/test/modules/test_replslot_required_lsn/Makefile
+
+EXTRA_INSTALL=src/test/modules/injection_points \
+	contrib/test_decoding
+
+export enable_injection_points
+TAP_TESTS = 1
+
+ifdef USE_PGXS
+PG_CONFIG = pg_config
+PGXS := $(shell $(PG_CONFIG) --pgxs)
+include $(PGXS)
+else
+subdir = src/test/modules/test_replslot_required_lsn
+top_builddir = ../../../..
+include $(top_builddir)/src/Makefile.global
+include $(top_srcdir)/contrib/contrib-global.mk
+endif
diff --git a/src/test/modules/test_replslot_required_lsn/meson.build b/src/test/modules/test_replslot_required_lsn/meson.build
new file mode 100644
index 00000000000..44d2546632b
--- /dev/null
+++ b/src/test/modules/test_replslot_required_lsn/meson.build
@@ -0,0 +1,16 @@
+# Copyright (c) 2025, PostgreSQL Global Development Group
+
+tests += {
+  'name': 'test_replslot_required_lsn',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'env': {
+       'enable_injection_points': get_option('injection_points') ? 'yes' : 'no',
+    },
+    'tests': [
+      't/001_logical_slot.pl',
+      't/002_physical_slot.pl'
+    ],
+  },
+}
diff --git a/src/test/recovery/meson.build b/src/test/recovery/meson.build
index cb983766c67..5ee41c3cd4d 100644
--- a/src/test/recovery/meson.build
+++ b/src/test/recovery/meson.build
@@ -54,6 +54,8 @@ tests += {
       't/043_no_contrecord_switch.pl',
       't/044_invalidate_inactive_slots.pl',
       't/045_archive_restartpoint.pl',
+      't/046_logical_slot.pl',
+      't/047_physical_slot.pl'
     ],
   },
 }
diff --git a/src/test/recovery/t/046_logical_slot.pl b/src/test/recovery/t/046_logical_slot.pl
new file mode 100644
index 00000000000..e78375178aa
--- /dev/null
+++ b/src/test/recovery/t/046_logical_slot.pl
@@ -0,0 +1,139 @@
+# Copyright (c) 2025, PostgreSQL Global Development Group
+#
+# This test verifies the case when the logical slot is advanced during
+# checkpoint. The test checks that the logical slot's restart_lsn still refers
+# to an existed WAL segment after immediate restart.
+#
+# Discussion:
+# https://www.postgresql.org/message-id/flat/1d12d2-67235980-35-19a406a0%4063439497
+#
+use strict;
+use warnings FATAL => 'all';
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+
+use Test::More;
+
+if ($ENV{enable_injection_points} ne 'yes')
+{
+	plan skip_all => 'Injection points not supported by this build';
+}
+
+my ($node, $result);
+
+$node = PostgreSQL::Test::Cluster->new('mike');
+$node->init;
+$node->append_conf('postgresql.conf',
+	"shared_preload_libraries = 'injection_points'");
+$node->append_conf('postgresql.conf', "wal_level = 'logical'");
+$node->start;
+$node->safe_psql('postgres', q(CREATE EXTENSION injection_points));
+
+# create a simple table to generate data into
+$node->safe_psql('postgres',
+	q{create table t (id serial primary key, b text)});
+
+# create the two slots we'll need
+$node->safe_psql('postgres',
+	q{select pg_create_logical_replication_slot('slot_logical', 'test_decoding')}
+);
+$node->safe_psql('postgres',
+	q{select pg_create_physical_replication_slot('slot_physical', true)});
+
+# advance both to current position, just to have everything "valid"
+$node->safe_psql('postgres',
+	q{select count(*) from pg_logical_slot_get_changes('slot_logical', null, null)}
+);
+$node->safe_psql('postgres',
+	q{select pg_replication_slot_advance('slot_physical', pg_current_wal_lsn())}
+);
+
+# run checkpoint, to flush current state to disk and set a baseline
+$node->safe_psql('postgres', q{checkpoint});
+
+# generate transactions to get RUNNING_XACTS
+my $xacts = $node->background_psql('postgres');
+$xacts->query_until(
+	qr/run_xacts/,
+	q(\echo run_xacts
+SELECT 1 \watch 0.1
+\q
+));
+
+# insert 2M rows, that's about 260MB (~20 segments) worth of WAL
+$node->safe_psql('postgres',
+	q{insert into t (b) select md5(i::text) from generate_series(1,1000000) s(i)}
+);
+
+# run another checkpoint, to set a new restore LSN
+$node->safe_psql('postgres', q{checkpoint});
+
+# another 2M rows, that's about 260MB (~20 segments) worth of WAL
+$node->safe_psql('postgres',
+	q{insert into t (b) select md5(i::text) from generate_series(1,1000000) s(i)}
+);
+
+# run another checkpoint, this time in the background, and make it wait
+# on the injection point), so that the checkpoint stops right before
+# removing old WAL segments
+print('starting checkpoint\n');
+
+my $checkpoint = $node->background_psql('postgres');
+$checkpoint->query_safe(
+	q(select injection_points_attach('checkpoint-before-old-wal-removal','wait'))
+);
+$checkpoint->query_until(
+	qr/starting_checkpoint/,
+	q(\echo starting_checkpoint
+checkpoint;
+\q
+));
+
+print('waiting for injection_point\n');
+# wait until the checkpoint stops right before removing WAL segments
+$node->wait_for_event('checkpointer', 'checkpoint-before-old-wal-removal');
+
+
+# try to advance the logical slot, but make it stop when it moves to the
+# next WAL segment (has to happen in the background too)
+my $logical = $node->background_psql('postgres');
+$logical->query_safe(
+	q{select injection_points_attach('logical-replication-slot-advance-segment','wait');}
+);
+$logical->query_until(
+	qr/get_changes/,
+	q(
+\echo get_changes
+select count(*) from pg_logical_slot_get_changes('slot_logical', null, null) \watch 1
+\q
+));
+
+# wait until the checkpoint stops right before removing WAL segments
+$node->wait_for_event('client backend',
+	'logical-replication-slot-advance-segment');
+
+# OK, we're in the right situation,  time to advance the physical slot,
+# which recalculates the required LSN, and then unblock the checkpoint,
+# which removes the WAL still needed by the logical slot
+$node->safe_psql('postgres',
+	q{select pg_replication_slot_advance('slot_physical', pg_current_wal_lsn())}
+);
+
+$node->safe_psql('postgres',
+	q{select injection_points_wakeup('checkpoint-before-old-wal-removal')});
+
+# abruptly stop the server (1 second should be enough for the checkpoint
+# to finish, would be better )
+$node->stop('immediate');
+
+$node->start;
+
+eval {
+	$node->safe_psql('postgres',
+		q{select count(*) from pg_logical_slot_get_changes('slot_logical', null, null);}
+	);
+};
+is($@, '', "Logical slot still valid");
+
+done_testing();
diff --git a/src/test/recovery/t/047_physical_slot.pl b/src/test/recovery/t/047_physical_slot.pl
new file mode 100644
index 00000000000..f2cf096b308
--- /dev/null
+++ b/src/test/recovery/t/047_physical_slot.pl
@@ -0,0 +1,136 @@
+# Copyright (c) 2025, PostgreSQL Global Development Group
+#
+# This test verifies the case when the physical slot is advanced during
+# checkpoint. The test checks that the physical slot's restart_lsn still refers
+# to an existed WAL segment after immediate restart.
+#
+# Discussion:
+# https://www.postgresql.org/message-id/flat/1d12d2-67235980-35-19a406a0%4063439497
+#
+use strict;
+use warnings FATAL => 'all';
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+
+use Test::More;
+
+if ($ENV{enable_injection_points} ne 'yes')
+{
+	plan skip_all => 'Injection points not supported by this build';
+}
+
+my ($node, $result);
+
+$node = PostgreSQL::Test::Cluster->new('mike');
+$node->init();
+$node->append_conf('postgresql.conf',
+	"shared_preload_libraries = 'injection_points'");
+$node->append_conf('postgresql.conf', "wal_level = 'replica'");
+$node->start();
+$node->safe_psql('postgres', q(CREATE EXTENSION injection_points));
+
+# create a simple table to generate data into
+$node->safe_psql('postgres',
+	q{create table t (id serial primary key, b text)});
+
+# create a physical replication slot
+$node->safe_psql('postgres',
+	q{select pg_create_physical_replication_slot('slot_physical', true)});
+
+# advance slot to current position, just to have everything "valid"
+$node->safe_psql('postgres',
+	q{select pg_replication_slot_advance('slot_physical', pg_current_wal_lsn())}
+);
+
+# run checkpoint, to flush current state to disk and set a baseline
+$node->safe_psql('postgres', q{checkpoint});
+
+# insert 2M rows, that's about 260MB (~20 segments) worth of WAL
+$node->safe_psql('postgres',
+	q{insert into t (b) select md5(i::text) from generate_series(1,100000) s(i)}
+);
+
+# advance slot to current position, just to have everything "valid"
+$node->safe_psql('postgres',
+	q{select pg_replication_slot_advance('slot_physical', pg_current_wal_lsn())}
+);
+
+# run another checkpoint, to set a new restore LSN
+$node->safe_psql('postgres', q{checkpoint});
+
+# another 2M rows, that's about 260MB (~20 segments) worth of WAL
+$node->safe_psql('postgres',
+	q{insert into t (b) select md5(i::text) from generate_series(1,1000000) s(i)}
+);
+
+my $restart_lsn_init = $node->safe_psql('postgres',
+	q{select restart_lsn from pg_replication_slots where slot_name = 'slot_physical'}
+);
+chomp($restart_lsn_init);
+note("restart lsn before checkpoint: $restart_lsn_init");
+
+# run another checkpoint, this time in the background, and make it wait
+# on the injection point), so that the checkpoint stops right before
+# removing old WAL segments
+note('starting checkpoint');
+
+my $checkpoint = $node->background_psql('postgres');
+$checkpoint->query_safe(
+	q{select injection_points_attach('checkpoint-before-old-wal-removal','wait')}
+);
+$checkpoint->query_until(
+	qr/starting_checkpoint/,
+	q(\echo starting_checkpoint
+checkpoint;
+\q
+));
+
+# wait until the checkpoint stops right before removing WAL segments
+note('waiting for injection_point');
+$node->wait_for_event('checkpointer', 'checkpoint-before-old-wal-removal');
+note('injection_point is reached');
+
+# OK, we're in the right situation,  time to advance the physical slot,
+# which recalculates the required LSN, and then unblock the checkpoint,
+# which removes the WAL still needed by the logical slot
+$node->safe_psql('postgres',
+	q{select pg_replication_slot_advance('slot_physical', pg_current_wal_lsn())}
+);
+
+# Continue checkpoint
+$node->safe_psql('postgres',
+	q{select injection_points_wakeup('checkpoint-before-old-wal-removal')});
+
+my $restart_lsn_old = $node->safe_psql('postgres',
+	q{select restart_lsn from pg_replication_slots where slot_name = 'slot_physical'}
+);
+chomp($restart_lsn_old);
+note("restart lsn before stop: $restart_lsn_old");
+
+# abruptly stop the server (1 second should be enough for the checkpoint
+# to finish, would be better )
+$node->stop('immediate');
+
+$node->start;
+
+# Get the restart_lsn of the slot right after restarting
+my $restart_lsn = $node->safe_psql('postgres',
+	q{select restart_lsn from pg_replication_slots where slot_name = 'slot_physical'}
+);
+chomp($restart_lsn);
+note("restart lsn: $restart_lsn");
+
+# Get wal segment name for slot's restart_lsn
+my $restart_lsn_segment = $node->safe_psql('postgres',
+	"SELECT pg_walfile_name('$restart_lsn'::pg_lsn)");
+chomp($restart_lsn_segment);
+
+# Check if the required wal segment exists
+note("required by slot segment name: $restart_lsn_segment");
+my $datadir = $node->data_dir;
+ok( -f "$datadir/pg_wal/$restart_lsn_segment",
+	"WAL segment $restart_lsn_segment for physical slot's restart_lsn $restart_lsn exists"
+);
+
+done_testing();
-- 
2.39.5 (Apple Git-154)

v4-0003-Remove-redundant-ReplicationSlotsComputeRequiredL.patchapplication/x-patch; name=v4-0003-Remove-redundant-ReplicationSlotsComputeRequiredL.patchDownload
From cf5b10f1cbb400e7ff0e596fe962af5847e96c2e Mon Sep 17 00:00:00 2001
From: Vitaly Davydov <v.davydov@postgrespro.ru>
Date: Thu, 1 May 2025 12:18:52 +0300
Subject: [PATCH v4 3/3] Remove redundant ReplicationSlotsComputeRequiredLSN
 calls

The function ReplicationSlotsComputeRequiredLSN is used to calculate the
oldest slots' required LSN. It is called every time when restart_lsn
value of any slot is changed (for example, when a slot is advancing).
The slot's oldest required LSN is used to remote old WAL segments in two
places - when checkpoint or restart point is created (CreateCheckPoint,
CreateRestartPoint functions). Old WAL segments seems to be truncated in
these two functions only.

The idea of the patch is to call ReplicationSlotsComputeRequiredLSN in
CreateCheckPoint or CreateRestartPoint functions only, before call of
RemoveOldXlogFiles function where old WAL segments are removed. There
is no obvious need to recalculate oldest required LSN every time when a
slot's restart_lsn is changed.

The value of the oldest required lsn can affect on slot invalidation.
The function InvalidateObsoleteReplicationSlots with non zero second
parameter (oldestSegno) is called in CreateCheckPoint,
CreateRestartPoint functions only where slot invalidation occurs with
reason RS_INVAL_WAL_REMOVED. Once we update the oldest slots' required
lsn in the beginning of these functions, the proposed patch should not
break the behaviour of slot invalidation function in this case.
---
 src/backend/access/transam/xlog.c          | 4 ++++
 src/backend/replication/logical/logical.c  | 1 -
 src/backend/replication/logical/slotsync.c | 4 ----
 src/backend/replication/slot.c             | 5 -----
 src/backend/replication/slotfuncs.c        | 2 --
 src/backend/replication/walsender.c        | 1 -
 6 files changed, 4 insertions(+), 13 deletions(-)

diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index 9c0f9a0af28..624be87a609 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -7320,6 +7320,7 @@ CreateCheckPoint(int flags)
 	/*
 	 * Get the current minimum LSN to be used later in WAL segments cleanup.
 	 */
+	ReplicationSlotsComputeRequiredLSN();
 	slotsMinReqLSN = XLogGetReplicationSlotMinimumLSN();
 
 	/*
@@ -7519,6 +7520,7 @@ CreateCheckPoint(int flags)
 										   _logSegNo, InvalidOid,
 										   InvalidTransactionId))
 	{
+		ReplicationSlotsComputeRequiredLSN();
 		slotsMinReqLSN = XLogGetReplicationSlotMinimumLSN();
 		CheckPointReplicationSlots(shutdown);
 
@@ -7888,6 +7890,7 @@ CreateRestartPoint(int flags)
 	/*
 	 * Get the current minimum LSN to be used later in WAL segments cleanup.
 	 */
+	ReplicationSlotsComputeRequiredLSN();
 	slotsMinReqLSN = XLogGetReplicationSlotMinimumLSN();
 
 	if (log_checkpoints)
@@ -7983,6 +7986,7 @@ CreateRestartPoint(int flags)
 										   _logSegNo, InvalidOid,
 										   InvalidTransactionId))
 	{
+		ReplicationSlotsComputeRequiredLSN();
 		slotsMinReqLSN = XLogGetReplicationSlotMinimumLSN();
 		CheckPointReplicationSlots(flags & CHECKPOINT_IS_SHUTDOWN);
 
diff --git a/src/backend/replication/logical/logical.c b/src/backend/replication/logical/logical.c
index f1eb798f3e9..7d136213777 100644
--- a/src/backend/replication/logical/logical.c
+++ b/src/backend/replication/logical/logical.c
@@ -1917,7 +1917,6 @@ LogicalConfirmReceivedLocation(XLogRecPtr lsn)
 			SpinLockRelease(&MyReplicationSlot->mutex);
 
 			ReplicationSlotsComputeRequiredXmin(false);
-			ReplicationSlotsComputeRequiredLSN();
 		}
 	}
 	else
diff --git a/src/backend/replication/logical/slotsync.c b/src/backend/replication/logical/slotsync.c
index 656e66e0ae0..30662c09275 100644
--- a/src/backend/replication/logical/slotsync.c
+++ b/src/backend/replication/logical/slotsync.c
@@ -335,7 +335,6 @@ update_local_synced_slot(RemoteSlot *remote_slot, Oid remote_dbid,
 		SpinLockRelease(&slot->mutex);
 
 		ReplicationSlotsComputeRequiredXmin(false);
-		ReplicationSlotsComputeRequiredLSN();
 	}
 
 	return updated_config || updated_xmin_or_lsn;
@@ -502,9 +501,6 @@ reserve_wal_for_local_slot(XLogRecPtr restart_lsn)
 		slot->data.restart_lsn = restart_lsn;
 		SpinLockRelease(&slot->mutex);
 
-		/* Prevent WAL removal as fast as possible */
-		ReplicationSlotsComputeRequiredLSN();
-
 		XLByteToSeg(slot->data.restart_lsn, segno, wal_segment_size);
 
 		/*
diff --git a/src/backend/replication/slot.c b/src/backend/replication/slot.c
index 600b87fa9cb..dd18fe10f7d 100644
--- a/src/backend/replication/slot.c
+++ b/src/backend/replication/slot.c
@@ -1008,7 +1008,6 @@ ReplicationSlotDropPtr(ReplicationSlot *slot)
 	 * limits.
 	 */
 	ReplicationSlotsComputeRequiredXmin(false);
-	ReplicationSlotsComputeRequiredLSN();
 
 	/*
 	 * If removing the directory fails, the worst thing that will happen is
@@ -1494,9 +1493,6 @@ ReplicationSlotReserveWal(void)
 		slot->data.restart_lsn = restart_lsn;
 		SpinLockRelease(&slot->mutex);
 
-		/* prevent WAL removal as fast as possible */
-		ReplicationSlotsComputeRequiredLSN();
-
 		/*
 		 * If all required WAL is still there, great, otherwise retry. The
 		 * slot should prevent further removal of WAL, unless there's a
@@ -2014,7 +2010,6 @@ restart:
 	if (invalidated)
 	{
 		ReplicationSlotsComputeRequiredXmin(false);
-		ReplicationSlotsComputeRequiredLSN();
 	}
 
 	return invalidated;
diff --git a/src/backend/replication/slotfuncs.c b/src/backend/replication/slotfuncs.c
index 36cc2ed4e44..3300fb9b1c9 100644
--- a/src/backend/replication/slotfuncs.c
+++ b/src/backend/replication/slotfuncs.c
@@ -583,7 +583,6 @@ pg_replication_slot_advance(PG_FUNCTION_ARGS)
 	 * advancing potentially done.
 	 */
 	ReplicationSlotsComputeRequiredXmin(false);
-	ReplicationSlotsComputeRequiredLSN();
 
 	ReplicationSlotRelease();
 
@@ -819,7 +818,6 @@ copy_replication_slot(FunctionCallInfo fcinfo, bool logical_slot)
 
 		ReplicationSlotMarkDirty();
 		ReplicationSlotsComputeRequiredXmin(false);
-		ReplicationSlotsComputeRequiredLSN();
 		ReplicationSlotSave();
 
 #ifdef USE_ASSERT_CHECKING
diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c
index 9fa8beb6103..0767c2803d9 100644
--- a/src/backend/replication/walsender.c
+++ b/src/backend/replication/walsender.c
@@ -2384,7 +2384,6 @@ PhysicalConfirmReceivedLocation(XLogRecPtr lsn)
 	if (changed)
 	{
 		ReplicationSlotMarkDirty();
-		ReplicationSlotsComputeRequiredLSN();
 		PhysicalWakeupLogicalWalSnd();
 	}
 
-- 
2.39.5 (Apple Git-154)

#24Alexander Korotkov
aekorotkov@gmail.com
In reply to: Alexander Korotkov (#23)
3 attachment(s)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

On Fri, May 23, 2025 at 12:10 AM Alexander Korotkov
<aekorotkov@gmail.com> wrote:

Hi, Vitaly!

On Tue, May 20, 2025 at 6:44 PM Vitaly Davydov <v.davydov@postgrespro.ru> wrote:

Thank you very much for the review!

The patchset doesn't seem to build after 371f2db8b0, which adjusted
the signature of the INJECTION_POINT() macro. Could you, please,
update the patchset accordingly.

I've updated the patch (see attached). Thanks.

I see in 0004 patch we're calling XLogGetReplicationSlotMinimumLSN()
before slots synchronization then use it for WAL truncation.
Generally looks good. But what about the "if
(InvalidateObsoleteReplicationSlots(...))" branch? It calls
XLogGetReplicationSlotMinimumLSN() again. Why would the value
obtained from the latter call reflect slots as they are synchronized
to the disk?

In patch 0004 I call XLogGetReplicationSlotMinimumLSN() again to keep the old
behaviour - this function was called in KeepLogSeg prior to my change. I also
call CheckPointReplicationSlots at the next line to save the invalidated and
other dirty slots on disk again to make sure, the new oldest LSN is in sync.

The problem I tried to solve in this if-branch is to fix test
src/test/recovery/t/019_replslot_limit.pl which was failed because the WAL was
not truncated enought for the test to pass ok. In general, this branch is not
necessary and we may fix the test by calling checkpoint twice (please, see the
alternative.rej patch for this case). If you think, we should incorporate this
new change, I'm ok to do it. But the WAL will be truncating more lazily.

Furthermore, I think we can save slots on disk right after invalidation, not in
CheckPointGuts to avoid saving invalidated slots twice.

Thank you for the clarification. It's all good. I just missed that
CheckPointReplicationSlots() syncs slots inside the "if" branch.

I've reordered the patchset. Fix should come first, tests comes
second. So, tests pass after each commit. Also I've joined both
tests and injection points into single commit. I don't see reason to
place tests into src/test/modules, because there is no module. I've
moved them into src/test/recovery.

I also improved some comments and commit messages. I think 0001
should go to all supported releases as it fixes material bug, while
0002 should be backpatched to 17, where injection points fist appears.
0003 should go to pg19 after branching. I'm continuing reviewing
this.

I spend more time on this. The next revision is attached. It
contains revised comments and other cosmetic changes. I'm going to
backpatch 0001 to all supported branches, and 0002 to 17 where
injection points were introduced.

------
Regards,
Alexander Korotkov
Supabase

Attachments:

v5-0003-Remove-redundant-ReplicationSlotsComputeRequiredL.patchapplication/octet-stream; name=v5-0003-Remove-redundant-ReplicationSlotsComputeRequiredL.patchDownload
From db20268922142f8b8cbff893b771d6ced81970c6 Mon Sep 17 00:00:00 2001
From: Alexander Korotkov <akorotkov@postgresql.org>
Date: Sat, 24 May 2025 13:34:36 +0300
Subject: [PATCH v5 3/3] Remove redundant ReplicationSlotsComputeRequiredLSN
 calls

The function ReplicationSlotsComputeRequiredLSN is used to calculate the
oldest slots' required LSN. It is called every time when restart_lsn
value of any slot is changed (for example, when a slot is advancing).
The slot's oldest required LSN is used to remote old WAL segments in two
places - when checkpoint or restart point is created (CreateCheckPoint,
CreateRestartPoint functions). Old WAL segments seems to be truncated in
these two functions only.

The idea of the patch is to call ReplicationSlotsComputeRequiredLSN in
CreateCheckPoint or CreateRestartPoint functions only, before call of
RemoveOldXlogFiles function where old WAL segments are removed. There
is no obvious need to recalculate oldest required LSN every time when a
slot's restart_lsn is changed.

The value of the oldest required lsn can affect on slot invalidation.
The function InvalidateObsoleteReplicationSlots with non zero second
parameter (oldestSegno) is called in CreateCheckPoint,
CreateRestartPoint functions only where slot invalidation occurs with
reason RS_INVAL_WAL_REMOVED. Once we update the oldest slots' required
lsn in the beginning of these functions, the proposed patch should not
break the behaviour of slot invalidation function in this case.
---
 src/backend/access/transam/xlog.c          | 4 ++++
 src/backend/replication/logical/logical.c  | 1 -
 src/backend/replication/logical/slotsync.c | 4 ----
 src/backend/replication/slot.c             | 5 -----
 src/backend/replication/slotfuncs.c        | 2 --
 src/backend/replication/walsender.c        | 1 -
 6 files changed, 4 insertions(+), 13 deletions(-)

diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index 0a7f7a71d8b..bdfd0a59ab7 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -7324,6 +7324,7 @@ CreateCheckPoint(int flags)
 	 * might be advanced concurrently, so we call this before
 	 * CheckPointReplicationSlots() synchronizes replication slots.
 	 */
+	ReplicationSlotsComputeRequiredLSN();
 	slotsMinReqLSN = XLogGetReplicationSlotMinimumLSN();
 
 	/*
@@ -7528,6 +7529,7 @@ CreateCheckPoint(int flags)
 		 * cleanup.  Then, we must synchronize the replication slots again in
 		 * order to make this LSN safe to use.
 		 */
+		ReplicationSlotsComputeRequiredLSN();
 		slotsMinReqLSN = XLogGetReplicationSlotMinimumLSN();
 		CheckPointReplicationSlots(shutdown);
 
@@ -7901,6 +7903,7 @@ CreateRestartPoint(int flags)
 	 * might be advanced concurrently, so we call this before
 	 * CheckPointReplicationSlots() synchronizes replication slots.
 	 */
+	ReplicationSlotsComputeRequiredLSN();
 	slotsMinReqLSN = XLogGetReplicationSlotMinimumLSN();
 
 	if (log_checkpoints)
@@ -8001,6 +8004,7 @@ CreateRestartPoint(int flags)
 		 * cleanup.  Then, we must synchronize the replication slots again in
 		 * order to make this LSN safe to use.
 		 */
+		ReplicationSlotsComputeRequiredLSN();
 		slotsMinReqLSN = XLogGetReplicationSlotMinimumLSN();
 		CheckPointReplicationSlots(flags & CHECKPOINT_IS_SHUTDOWN);
 
diff --git a/src/backend/replication/logical/logical.c b/src/backend/replication/logical/logical.c
index f1eb798f3e9..7d136213777 100644
--- a/src/backend/replication/logical/logical.c
+++ b/src/backend/replication/logical/logical.c
@@ -1917,7 +1917,6 @@ LogicalConfirmReceivedLocation(XLogRecPtr lsn)
 			SpinLockRelease(&MyReplicationSlot->mutex);
 
 			ReplicationSlotsComputeRequiredXmin(false);
-			ReplicationSlotsComputeRequiredLSN();
 		}
 	}
 	else
diff --git a/src/backend/replication/logical/slotsync.c b/src/backend/replication/logical/slotsync.c
index 656e66e0ae0..30662c09275 100644
--- a/src/backend/replication/logical/slotsync.c
+++ b/src/backend/replication/logical/slotsync.c
@@ -335,7 +335,6 @@ update_local_synced_slot(RemoteSlot *remote_slot, Oid remote_dbid,
 		SpinLockRelease(&slot->mutex);
 
 		ReplicationSlotsComputeRequiredXmin(false);
-		ReplicationSlotsComputeRequiredLSN();
 	}
 
 	return updated_config || updated_xmin_or_lsn;
@@ -502,9 +501,6 @@ reserve_wal_for_local_slot(XLogRecPtr restart_lsn)
 		slot->data.restart_lsn = restart_lsn;
 		SpinLockRelease(&slot->mutex);
 
-		/* Prevent WAL removal as fast as possible */
-		ReplicationSlotsComputeRequiredLSN();
-
 		XLByteToSeg(slot->data.restart_lsn, segno, wal_segment_size);
 
 		/*
diff --git a/src/backend/replication/slot.c b/src/backend/replication/slot.c
index 600b87fa9cb..dd18fe10f7d 100644
--- a/src/backend/replication/slot.c
+++ b/src/backend/replication/slot.c
@@ -1008,7 +1008,6 @@ ReplicationSlotDropPtr(ReplicationSlot *slot)
 	 * limits.
 	 */
 	ReplicationSlotsComputeRequiredXmin(false);
-	ReplicationSlotsComputeRequiredLSN();
 
 	/*
 	 * If removing the directory fails, the worst thing that will happen is
@@ -1494,9 +1493,6 @@ ReplicationSlotReserveWal(void)
 		slot->data.restart_lsn = restart_lsn;
 		SpinLockRelease(&slot->mutex);
 
-		/* prevent WAL removal as fast as possible */
-		ReplicationSlotsComputeRequiredLSN();
-
 		/*
 		 * If all required WAL is still there, great, otherwise retry. The
 		 * slot should prevent further removal of WAL, unless there's a
@@ -2014,7 +2010,6 @@ restart:
 	if (invalidated)
 	{
 		ReplicationSlotsComputeRequiredXmin(false);
-		ReplicationSlotsComputeRequiredLSN();
 	}
 
 	return invalidated;
diff --git a/src/backend/replication/slotfuncs.c b/src/backend/replication/slotfuncs.c
index 36cc2ed4e44..3300fb9b1c9 100644
--- a/src/backend/replication/slotfuncs.c
+++ b/src/backend/replication/slotfuncs.c
@@ -583,7 +583,6 @@ pg_replication_slot_advance(PG_FUNCTION_ARGS)
 	 * advancing potentially done.
 	 */
 	ReplicationSlotsComputeRequiredXmin(false);
-	ReplicationSlotsComputeRequiredLSN();
 
 	ReplicationSlotRelease();
 
@@ -819,7 +818,6 @@ copy_replication_slot(FunctionCallInfo fcinfo, bool logical_slot)
 
 		ReplicationSlotMarkDirty();
 		ReplicationSlotsComputeRequiredXmin(false);
-		ReplicationSlotsComputeRequiredLSN();
 		ReplicationSlotSave();
 
 #ifdef USE_ASSERT_CHECKING
diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c
index 9fa8beb6103..0767c2803d9 100644
--- a/src/backend/replication/walsender.c
+++ b/src/backend/replication/walsender.c
@@ -2384,7 +2384,6 @@ PhysicalConfirmReceivedLocation(XLogRecPtr lsn)
 	if (changed)
 	{
 		ReplicationSlotMarkDirty();
-		ReplicationSlotsComputeRequiredLSN();
 		PhysicalWakeupLogicalWalSnd();
 	}
 
-- 
2.39.5 (Apple Git-154)

v5-0002-Add-TAP-tests-to-check-replication-slot-advance-d.patchapplication/octet-stream; name=v5-0002-Add-TAP-tests-to-check-replication-slot-advance-d.patchDownload
From 5dd13070f2d7f9da7b335fa9077d7fb992106db8 Mon Sep 17 00:00:00 2001
From: Alexander Korotkov <akorotkov@postgresql.org>
Date: Sat, 24 May 2025 13:26:28 +0300
Subject: [PATCH v5 2/3] Add TAP tests to check replication slot advance during
 the checkpoint

The new tests verify that logical and physical replication slots are still
valid after an immediate restart on checkpoint completion when the slot was
advanced during the checkpoint.

This commit introduces two new injection points to make these tests possible:

* checkpoint-before-old-wal-removal - triggered in the checkpointer process
  just before old WAL segments cleanup;
* logical-replication-slot-advance-segment - triggered in
  LogicalConfirmReceivedLocation() when restart_lsn was changed enough to
  point to the next WAL segment.

Discussion: https://postgr.es/m/flat/1d12d2-67235980-35-19a406a0%4063439497
Author: Vitaly Davydov <v.davydov@postgrespro.ru>
Author: Tomas Vondra <tomas@vondra.me>
Reviewed-by: Alexander Korotkov <aekorotkov@gmail.com>
Backpatch-through: 17
---
 src/backend/access/transam/xlog.c             |   4 +
 src/backend/replication/logical/logical.c     |  18 +++
 .../test_replslot_required_lsn/Makefile       |  18 +++
 .../test_replslot_required_lsn/meson.build    |  16 ++
 src/test/recovery/meson.build                 |   2 +
 src/test/recovery/t/046_logical_slot.pl       | 139 ++++++++++++++++++
 src/test/recovery/t/047_physical_slot.pl      | 133 +++++++++++++++++
 7 files changed, 330 insertions(+)
 create mode 100644 src/test/modules/test_replslot_required_lsn/Makefile
 create mode 100644 src/test/modules/test_replslot_required_lsn/meson.build
 create mode 100644 src/test/recovery/t/046_logical_slot.pl
 create mode 100644 src/test/recovery/t/047_physical_slot.pl

diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index a0e589e9c4b..0a7f7a71d8b 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -7509,6 +7509,10 @@ CreateCheckPoint(int flags)
 	if (PriorRedoPtr != InvalidXLogRecPtr)
 		UpdateCheckPointDistanceEstimate(RedoRecPtr - PriorRedoPtr);
 
+#ifdef USE_INJECTION_POINTS
+	INJECTION_POINT("checkpoint-before-old-wal-removal", NULL);
+#endif
+
 	/*
 	 * Delete old log files, those no longer needed for last checkpoint to
 	 * prevent the disk holding the xlog from growing full.
diff --git a/src/backend/replication/logical/logical.c b/src/backend/replication/logical/logical.c
index 1d56d0c4ef3..f1eb798f3e9 100644
--- a/src/backend/replication/logical/logical.c
+++ b/src/backend/replication/logical/logical.c
@@ -29,6 +29,7 @@
 #include "postgres.h"
 
 #include "access/xact.h"
+#include "access/xlog_internal.h"
 #include "access/xlogutils.h"
 #include "fmgr.h"
 #include "miscadmin.h"
@@ -41,6 +42,7 @@
 #include "storage/proc.h"
 #include "storage/procarray.h"
 #include "utils/builtins.h"
+#include "utils/injection_point.h"
 #include "utils/inval.h"
 #include "utils/memutils.h"
 
@@ -1825,9 +1827,13 @@ LogicalConfirmReceivedLocation(XLogRecPtr lsn)
 	{
 		bool		updated_xmin = false;
 		bool		updated_restart = false;
+		XLogRecPtr	restart_lsn pg_attribute_unused();
 
 		SpinLockAcquire(&MyReplicationSlot->mutex);
 
+		/* remember the old restart lsn */
+		restart_lsn = MyReplicationSlot->data.restart_lsn;
+
 		/*
 		 * Prevent moving the confirmed_flush backwards, as this could lead to
 		 * data duplication issues caused by replicating already replicated
@@ -1881,6 +1887,18 @@ LogicalConfirmReceivedLocation(XLogRecPtr lsn)
 		/* first write new xmin to disk, so we know what's up after a crash */
 		if (updated_xmin || updated_restart)
 		{
+#ifdef USE_INJECTION_POINTS
+			XLogSegNo	seg1,
+						seg2;
+
+			XLByteToSeg(restart_lsn, seg1, wal_segment_size);
+			XLByteToSeg(MyReplicationSlot->data.restart_lsn, seg2, wal_segment_size);
+
+			/* trigger injection point, but only if segment changes */
+			if (seg1 != seg2)
+				INJECTION_POINT("logical-replication-slot-advance-segment", NULL);
+#endif
+
 			ReplicationSlotMarkDirty();
 			ReplicationSlotSave();
 			elog(DEBUG1, "updated xmin: %u restart: %u", updated_xmin, updated_restart);
diff --git a/src/test/modules/test_replslot_required_lsn/Makefile b/src/test/modules/test_replslot_required_lsn/Makefile
new file mode 100644
index 00000000000..e5ff8af255b
--- /dev/null
+++ b/src/test/modules/test_replslot_required_lsn/Makefile
@@ -0,0 +1,18 @@
+# src/test/modules/test_replslot_required_lsn/Makefile
+
+EXTRA_INSTALL=src/test/modules/injection_points \
+	contrib/test_decoding
+
+export enable_injection_points
+TAP_TESTS = 1
+
+ifdef USE_PGXS
+PG_CONFIG = pg_config
+PGXS := $(shell $(PG_CONFIG) --pgxs)
+include $(PGXS)
+else
+subdir = src/test/modules/test_replslot_required_lsn
+top_builddir = ../../../..
+include $(top_builddir)/src/Makefile.global
+include $(top_srcdir)/contrib/contrib-global.mk
+endif
diff --git a/src/test/modules/test_replslot_required_lsn/meson.build b/src/test/modules/test_replslot_required_lsn/meson.build
new file mode 100644
index 00000000000..44d2546632b
--- /dev/null
+++ b/src/test/modules/test_replslot_required_lsn/meson.build
@@ -0,0 +1,16 @@
+# Copyright (c) 2025, PostgreSQL Global Development Group
+
+tests += {
+  'name': 'test_replslot_required_lsn',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'env': {
+       'enable_injection_points': get_option('injection_points') ? 'yes' : 'no',
+    },
+    'tests': [
+      't/001_logical_slot.pl',
+      't/002_physical_slot.pl'
+    ],
+  },
+}
diff --git a/src/test/recovery/meson.build b/src/test/recovery/meson.build
index cb983766c67..5ee41c3cd4d 100644
--- a/src/test/recovery/meson.build
+++ b/src/test/recovery/meson.build
@@ -54,6 +54,8 @@ tests += {
       't/043_no_contrecord_switch.pl',
       't/044_invalidate_inactive_slots.pl',
       't/045_archive_restartpoint.pl',
+      't/046_logical_slot.pl',
+      't/047_physical_slot.pl'
     ],
   },
 }
diff --git a/src/test/recovery/t/046_logical_slot.pl b/src/test/recovery/t/046_logical_slot.pl
new file mode 100644
index 00000000000..b4265c4a6a5
--- /dev/null
+++ b/src/test/recovery/t/046_logical_slot.pl
@@ -0,0 +1,139 @@
+# Copyright (c) 2025, PostgreSQL Global Development Group
+#
+# This test verifies the case when the logical slot is advanced during
+# checkpoint. The test checks that the logical slot's restart_lsn still refers
+# to an existed WAL segment after immediate restart.
+#
+use strict;
+use warnings FATAL => 'all';
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+
+use Test::More;
+
+if ($ENV{enable_injection_points} ne 'yes')
+{
+	plan skip_all => 'Injection points not supported by this build';
+}
+
+my ($node, $result);
+
+$node = PostgreSQL::Test::Cluster->new('mike');
+$node->init;
+$node->append_conf('postgresql.conf',
+	"shared_preload_libraries = 'injection_points'");
+$node->append_conf('postgresql.conf', "wal_level = 'logical'");
+$node->start;
+$node->safe_psql('postgres', q(CREATE EXTENSION injection_points));
+
+# Create a simple table to generate data into.
+$node->safe_psql('postgres',
+	q{create table t (id serial primary key, b text)});
+
+# Create the two slots we'll need.
+$node->safe_psql('postgres',
+	q{select pg_create_logical_replication_slot('slot_logical', 'test_decoding')}
+);
+$node->safe_psql('postgres',
+	q{select pg_create_physical_replication_slot('slot_physical', true)});
+
+# Advance both slots to the current position just to have everything "valid".
+$node->safe_psql('postgres',
+	q{select count(*) from pg_logical_slot_get_changes('slot_logical', null, null)}
+);
+$node->safe_psql('postgres',
+	q{select pg_replication_slot_advance('slot_physical', pg_current_wal_lsn())}
+);
+
+# Run checkpoint to flush current state to disk and set a baseline.
+$node->safe_psql('postgres', q{checkpoint});
+
+# Generate some transactions to get RUNNING_XACTS.
+my $xacts = $node->background_psql('postgres');
+$xacts->query_until(
+	qr/run_xacts/,
+	q(\echo run_xacts
+SELECT 1 \watch 0.1
+\q
+));
+
+# Insert 2M rows; that's about 260MB (~20 segments) worth of WAL.
+$node->safe_psql('postgres',
+	q{insert into t (b) select md5(i::text) from generate_series(1,1000000) s(i)}
+);
+
+# Run another checkpoint to set a new restore LSN.
+$node->safe_psql('postgres', q{checkpoint});
+
+# Another 2M rows; that's about 260MB (~20 segments) worth of WAL.
+$node->safe_psql('postgres',
+	q{insert into t (b) select md5(i::text) from generate_series(1,1000000) s(i)}
+);
+
+# Run another checkpoint, this time in the background, and make it wait
+# on the injection point) so that the checkpoint stops right before
+# removing old WAL segments.
+note('starting checkpoint\n');
+
+my $checkpoint = $node->background_psql('postgres');
+$checkpoint->query_safe(
+	q(select injection_points_attach('checkpoint-before-old-wal-removal','wait'))
+);
+$checkpoint->query_until(
+	qr/starting_checkpoint/,
+	q(\echo starting_checkpoint
+checkpoint;
+\q
+));
+
+# Wait until the checkpoint stops right before removing WAL segments.
+note('waiting for injection_point\n');
+$node->wait_for_event('checkpointer', 'checkpoint-before-old-wal-removal');
+note('injection_point is reached');
+
+# Try to advance the logical slot, but make it stop when it moves to the next
+# WAL segment (this has to happen in the background, too).
+my $logical = $node->background_psql('postgres');
+$logical->query_safe(
+	q{select injection_points_attach('logical-replication-slot-advance-segment','wait');}
+);
+$logical->query_until(
+	qr/get_changes/,
+	q(
+\echo get_changes
+select count(*) from pg_logical_slot_get_changes('slot_logical', null, null) \watch 1
+\q
+));
+
+# Wait until the slot's restart_lsn points to the next WAL segment.
+note('waiting for injection_point\n');
+$node->wait_for_event('client backend',
+	'logical-replication-slot-advance-segment');
+note('injection_point is reached');
+
+# OK, we're in the right situation: time to advance the physical slot, which
+# recalculates the required LSN, and then unblock the checkpoint, which
+# removes the WAL still needed by the logical slot.
+$node->safe_psql('postgres',
+	q{select pg_replication_slot_advance('slot_physical', pg_current_wal_lsn())}
+);
+
+# Continue the checkpoint.
+$node->safe_psql('postgres',
+	q{select injection_points_wakeup('checkpoint-before-old-wal-removal')});
+
+# Abruptly stop the server (1 second should be enough for the checkpoint
+# to finish; it would be better).
+$node->stop('immediate');
+
+$node->start;
+
+eval {
+	$node->safe_psql('postgres',
+		q{select count(*) from pg_logical_slot_get_changes('slot_logical', null, null);}
+	);
+};
+is($@, '', "Logical slot still valid");
+
+done_testing();
diff --git a/src/test/recovery/t/047_physical_slot.pl b/src/test/recovery/t/047_physical_slot.pl
new file mode 100644
index 00000000000..454e56b9bd2
--- /dev/null
+++ b/src/test/recovery/t/047_physical_slot.pl
@@ -0,0 +1,133 @@
+# Copyright (c) 2025, PostgreSQL Global Development Group
+#
+# This test verifies the case when the physical slot is advanced during
+# checkpoint. The test checks that the physical slot's restart_lsn still refers
+# to an existed WAL segment after immediate restart.
+#
+use strict;
+use warnings FATAL => 'all';
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+
+use Test::More;
+
+if ($ENV{enable_injection_points} ne 'yes')
+{
+	plan skip_all => 'Injection points not supported by this build';
+}
+
+my ($node, $result);
+
+$node = PostgreSQL::Test::Cluster->new('mike');
+$node->init;
+$node->append_conf('postgresql.conf',
+	"shared_preload_libraries = 'injection_points'");
+$node->append_conf('postgresql.conf', "wal_level = 'replica'");
+$node->start;
+$node->safe_psql('postgres', q(CREATE EXTENSION injection_points));
+
+# Create a simple table to generate data into.
+$node->safe_psql('postgres',
+	q{create table t (id serial primary key, b text)});
+
+# Create a physical replication slot.
+$node->safe_psql('postgres',
+	q{select pg_create_physical_replication_slot('slot_physical', true)});
+
+# Advance slot to the current position, just to have everything "valid".
+$node->safe_psql('postgres',
+	q{select pg_replication_slot_advance('slot_physical', pg_current_wal_lsn())}
+);
+
+# Run checkpoint to flush current state to disk and set a baseline.
+$node->safe_psql('postgres', q{checkpoint});
+
+# Insert 2M rows; that's about 260MB (~20 segments) worth of WAL.
+$node->safe_psql('postgres',
+	q{insert into t (b) select md5(i::text) from generate_series(1,100000) s(i)}
+);
+
+# Advance slot to the current position, just to have everything "valid".
+$node->safe_psql('postgres',
+	q{select pg_replication_slot_advance('slot_physical', pg_current_wal_lsn())}
+);
+
+# Run another checkpoint to set a new restore LSN.
+$node->safe_psql('postgres', q{checkpoint});
+
+# Another 2M rows; that's about 260MB (~20 segments) worth of WAL.
+$node->safe_psql('postgres',
+	q{insert into t (b) select md5(i::text) from generate_series(1,1000000) s(i)}
+);
+
+my $restart_lsn_init = $node->safe_psql('postgres',
+	q{select restart_lsn from pg_replication_slots where slot_name = 'slot_physical'}
+);
+chomp($restart_lsn_init);
+note("restart lsn before checkpoint: $restart_lsn_init");
+
+# Run another checkpoint, this time in the background, and make it wait
+# on the injection point) so that the checkpoint stops right before
+# removing old WAL segments.
+note('starting checkpoint');
+
+my $checkpoint = $node->background_psql('postgres');
+$checkpoint->query_safe(
+	q{select injection_points_attach('checkpoint-before-old-wal-removal','wait')}
+);
+$checkpoint->query_until(
+	qr/starting_checkpoint/,
+	q(\echo starting_checkpoint
+checkpoint;
+\q
+));
+
+# Wait until the checkpoint stops right before removing WAL segments.
+note('waiting for injection_point');
+$node->wait_for_event('checkpointer', 'checkpoint-before-old-wal-removal');
+note('injection_point is reached');
+
+# OK, we're in the right situation: time to advance the physical slot, which
+# recalculates the required LSN and then unblock the checkpoint, which
+# removes the WAL still needed by the physical slot.
+$node->safe_psql('postgres',
+	q{select pg_replication_slot_advance('slot_physical', pg_current_wal_lsn())}
+);
+
+# Continue the checkpoint.
+$node->safe_psql('postgres',
+	q{select injection_points_wakeup('checkpoint-before-old-wal-removal')});
+
+my $restart_lsn_old = $node->safe_psql('postgres',
+	q{select restart_lsn from pg_replication_slots where slot_name = 'slot_physical'}
+);
+chomp($restart_lsn_old);
+note("restart lsn before stop: $restart_lsn_old");
+
+# Abruptly stop the server (1 second should be enough for the checkpoint
+# to finish; it would be better).
+$node->stop('immediate');
+
+$node->start;
+
+# Get the restart_lsn of the slot right after restarting.
+my $restart_lsn = $node->safe_psql('postgres',
+	q{select restart_lsn from pg_replication_slots where slot_name = 'slot_physical'}
+);
+chomp($restart_lsn);
+note("restart lsn: $restart_lsn");
+
+# Get the WAL segment name for the slot's restart_lsn.
+my $restart_lsn_segment = $node->safe_psql('postgres',
+	"SELECT pg_walfile_name('$restart_lsn'::pg_lsn)");
+chomp($restart_lsn_segment);
+
+# Check if the required wal segment exists.
+note("required by slot segment name: $restart_lsn_segment");
+my $datadir = $node->data_dir;
+ok( -f "$datadir/pg_wal/$restart_lsn_segment",
+	"WAL segment $restart_lsn_segment for physical slot's restart_lsn $restart_lsn exists"
+);
+
+done_testing();
-- 
2.39.5 (Apple Git-154)

v5-0001-Keep-WAL-segments-by-the-flushed-value-of-the-slo.patchapplication/octet-stream; name=v5-0001-Keep-WAL-segments-by-the-flushed-value-of-the-slo.patchDownload
From b3f853589e55f78878923434810b0c6fb82c230e Mon Sep 17 00:00:00 2001
From: Alexander Korotkov <akorotkov@postgresql.org>
Date: Sat, 24 May 2025 13:09:16 +0300
Subject: [PATCH v5 1/3] Keep WAL segments by the flushed value of the slot's
 restart LSN

The patch fixes the issue with the unexpected removal of old WAL segments
after checkpoint, followed by an immediate restart. The issue occurs when
a slot is advanced after the start of the checkpoint and before old WAL
segments are removed at the end of the checkpoint.

The idea of the patch is to get the minimal restart_lsn at the beginning
of checkpoint (or restart point) creation and use this value when calculating
the oldest LSN for WAL segments removal at the end of checkpoint. This idea
was proposed by Tomas Vondra in the discussion.

Discussion: https://postgr.es/m/flat/1d12d2-67235980-35-19a406a0%4063439497
Author: Vitaly Davydov <v.davydov@postgrespro.ru>
Reviewed-by: Tomas Vondra <tomas@vondra.me>
Reviewed-by: Alexander Korotkov <aekorotkov@gmail.com>
Backpatch-through: 13
---
 src/backend/access/transam/xlog.c | 55 ++++++++++++++++++++++++++-----
 1 file changed, 47 insertions(+), 8 deletions(-)

diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index 1914859b2ee..a0e589e9c4b 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -677,7 +677,8 @@ static XLogRecPtr CreateOverwriteContrecordRecord(XLogRecPtr aborted_lsn,
 												  XLogRecPtr pagePtr,
 												  TimeLineID newTLI);
 static void CheckPointGuts(XLogRecPtr checkPointRedo, int flags);
-static void KeepLogSeg(XLogRecPtr recptr, XLogSegNo *logSegNo);
+static void KeepLogSeg(XLogRecPtr recptr, XLogRecPtr slotsMinLSN,
+					   XLogSegNo *logSegNo);
 static XLogRecPtr XLogGetReplicationSlotMinimumLSN(void);
 
 static void AdvanceXLInsertBuffer(XLogRecPtr upto, TimeLineID tli,
@@ -7087,6 +7088,7 @@ CreateCheckPoint(int flags)
 	VirtualTransactionId *vxids;
 	int			nvxids;
 	int			oldXLogAllowed = 0;
+	XLogRecPtr	slotsMinReqLSN;
 
 	/*
 	 * An end-of-recovery checkpoint is really a shutdown checkpoint, just
@@ -7315,6 +7317,15 @@ CreateCheckPoint(int flags)
 	 */
 	END_CRIT_SECTION();
 
+	/*
+	 * Get the current minimum LSN to be used later in the WAL segment
+	 * cleanup.  We may clean up only WAL segments, which are not needed
+	 * according to synchronized LSNs of replication slots.  The slot's LSN
+	 * might be advanced concurrently, so we call this before
+	 * CheckPointReplicationSlots() synchronizes replication slots.
+	 */
+	slotsMinReqLSN = XLogGetReplicationSlotMinimumLSN();
+
 	/*
 	 * In some cases there are groups of actions that must all occur on one
 	 * side or the other of a checkpoint record. Before flushing the
@@ -7503,17 +7514,25 @@ CreateCheckPoint(int flags)
 	 * prevent the disk holding the xlog from growing full.
 	 */
 	XLByteToSeg(RedoRecPtr, _logSegNo, wal_segment_size);
-	KeepLogSeg(recptr, &_logSegNo);
+	KeepLogSeg(recptr, slotsMinReqLSN, &_logSegNo);
 	if (InvalidateObsoleteReplicationSlots(RS_INVAL_WAL_REMOVED | RS_INVAL_IDLE_TIMEOUT,
 										   _logSegNo, InvalidOid,
 										   InvalidTransactionId))
 	{
+		/*
+		 * Recalculate the current minimum LSN to be used in the WAL segment
+		 * cleanup.  Then, we must synchronize the replication slots again in
+		 * order to make this LSN safe to use.
+		 */
+		slotsMinReqLSN = XLogGetReplicationSlotMinimumLSN();
+		CheckPointReplicationSlots(shutdown);
+
 		/*
 		 * Some slots have been invalidated; recalculate the old-segment
 		 * horizon, starting again from RedoRecPtr.
 		 */
 		XLByteToSeg(RedoRecPtr, _logSegNo, wal_segment_size);
-		KeepLogSeg(recptr, &_logSegNo);
+		KeepLogSeg(recptr, slotsMinReqLSN, &_logSegNo);
 	}
 	_logSegNo--;
 	RemoveOldXlogFiles(_logSegNo, RedoRecPtr, recptr,
@@ -7788,6 +7807,7 @@ CreateRestartPoint(int flags)
 	XLogRecPtr	endptr;
 	XLogSegNo	_logSegNo;
 	TimestampTz xtime;
+	XLogRecPtr	slotsMinReqLSN;
 
 	/* Concurrent checkpoint/restartpoint cannot happen */
 	Assert(!IsUnderPostmaster || MyBackendType == B_CHECKPOINTER);
@@ -7870,6 +7890,15 @@ CreateRestartPoint(int flags)
 	MemSet(&CheckpointStats, 0, sizeof(CheckpointStats));
 	CheckpointStats.ckpt_start_t = GetCurrentTimestamp();
 
+	/*
+	 * Get the current minimum LSN to be used later in the WAL segment
+	 * cleanup.  We may clean up only WAL segments, which are not needed
+	 * according to synchronized LSNs of replication slots.  The slot's LSN
+	 * might be advanced concurrently, so we call this before
+	 * CheckPointReplicationSlots() synchronizes replication slots.
+	 */
+	slotsMinReqLSN = XLogGetReplicationSlotMinimumLSN();
+
 	if (log_checkpoints)
 		LogCheckpointStart(flags, true);
 
@@ -7958,17 +7987,25 @@ CreateRestartPoint(int flags)
 	receivePtr = GetWalRcvFlushRecPtr(NULL, NULL);
 	replayPtr = GetXLogReplayRecPtr(&replayTLI);
 	endptr = (receivePtr < replayPtr) ? replayPtr : receivePtr;
-	KeepLogSeg(endptr, &_logSegNo);
+	KeepLogSeg(endptr, slotsMinReqLSN, &_logSegNo);
 	if (InvalidateObsoleteReplicationSlots(RS_INVAL_WAL_REMOVED | RS_INVAL_IDLE_TIMEOUT,
 										   _logSegNo, InvalidOid,
 										   InvalidTransactionId))
 	{
+		/*
+		 * Recalculate the current minimum LSN to be used in the WAL segment
+		 * cleanup.  Then, we must synchronize the replication slots again in
+		 * order to make this LSN safe to use.
+		 */
+		slotsMinReqLSN = XLogGetReplicationSlotMinimumLSN();
+		CheckPointReplicationSlots(flags & CHECKPOINT_IS_SHUTDOWN);
+
 		/*
 		 * Some slots have been invalidated; recalculate the old-segment
 		 * horizon, starting again from RedoRecPtr.
 		 */
 		XLByteToSeg(RedoRecPtr, _logSegNo, wal_segment_size);
-		KeepLogSeg(endptr, &_logSegNo);
+		KeepLogSeg(endptr, slotsMinReqLSN, &_logSegNo);
 	}
 	_logSegNo--;
 
@@ -8063,6 +8100,7 @@ GetWALAvailability(XLogRecPtr targetLSN)
 	XLogSegNo	oldestSegMaxWalSize;	/* oldest segid kept by max_wal_size */
 	XLogSegNo	oldestSlotSeg;	/* oldest segid kept by slot */
 	uint64		keepSegs;
+	XLogRecPtr	slotsMinReqLSN;
 
 	/*
 	 * slot does not reserve WAL. Either deactivated, or has never been active
@@ -8076,8 +8114,9 @@ GetWALAvailability(XLogRecPtr targetLSN)
 	 * oldestSlotSeg to the current segment.
 	 */
 	currpos = GetXLogWriteRecPtr();
+	slotsMinReqLSN = XLogGetReplicationSlotMinimumLSN();
 	XLByteToSeg(currpos, oldestSlotSeg, wal_segment_size);
-	KeepLogSeg(currpos, &oldestSlotSeg);
+	KeepLogSeg(currpos, slotsMinReqLSN, &oldestSlotSeg);
 
 	/*
 	 * Find the oldest extant segment file. We get 1 until checkpoint removes
@@ -8138,7 +8177,7 @@ GetWALAvailability(XLogRecPtr targetLSN)
  * invalidation is optionally done here, instead.
  */
 static void
-KeepLogSeg(XLogRecPtr recptr, XLogSegNo *logSegNo)
+KeepLogSeg(XLogRecPtr recptr, XLogRecPtr slotsMinReqLSN, XLogSegNo *logSegNo)
 {
 	XLogSegNo	currSegNo;
 	XLogSegNo	segno;
@@ -8151,7 +8190,7 @@ KeepLogSeg(XLogRecPtr recptr, XLogSegNo *logSegNo)
 	 * Calculate how many segments are kept by slots first, adjusting for
 	 * max_slot_wal_keep_size.
 	 */
-	keep = XLogGetReplicationSlotMinimumLSN();
+	keep = slotsMinReqLSN;
 	if (keep != InvalidXLogRecPtr && keep < recptr)
 	{
 		XLByteToSeg(keep, segno, wal_segment_size);
-- 
2.39.5 (Apple Git-154)

#25Amit Kapila
amit.kapila16@gmail.com
In reply to: Alexander Korotkov (#24)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

On Sat, May 24, 2025 at 4:08 PM Alexander Korotkov <aekorotkov@gmail.com> wrote:

I spend more time on this. The next revision is attached. It
contains revised comments and other cosmetic changes. I'm going to
backpatch 0001 to all supported branches,

Is my understanding correct that we need 0001 because
PhysicalConfirmReceivedLocation() doesn't save the slot to disk after
changing the slot's restart_lsn? If so, shouldn't the comments (One
could argue that the slot should be saved to disk now, but that'd be
energy wasted - the worst thing lost information could cause here is
to give wrong information in a statistics view) in
PhysicalConfirmReceivedLocation() be changed to mention the risk of
not saving the slot?

Also, after 0001, even the same solution will be true for logical
slots as well, where we are already careful to save the slot to disk
if its restart_lsn is changed, see LogicalConfirmReceivedLocation().
So, won't that effort be wasted? Even if we don't want to do anything
about it (which doesn't sound like a good idea), we should note that
in comments somewhere.

--
With Regards,
Amit Kapila.

#26Alexander Korotkov
aekorotkov@gmail.com
In reply to: Amit Kapila (#25)
3 attachment(s)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

Hi, Amit!

Thank you for your attention to this patchset!

On Sat, May 24, 2025 at 2:15 PM Amit Kapila <amit.kapila16@gmail.com> wrote:

On Sat, May 24, 2025 at 4:08 PM Alexander Korotkov <aekorotkov@gmail.com> wrote:

I spend more time on this. The next revision is attached. It
contains revised comments and other cosmetic changes. I'm going to
backpatch 0001 to all supported branches,

Is my understanding correct that we need 0001 because
PhysicalConfirmReceivedLocation() doesn't save the slot to disk after
changing the slot's restart_lsn?

Yes. Also, even if it would save slot to the disk, there is still
race condition that concurrent checkpoint could use updated value from
the shared memory to clean old WAL segments, and then crash happens
before we managed to write the slot to the disk.

If so, shouldn't the comments (One
could argue that the slot should be saved to disk now, but that'd be
energy wasted - the worst thing lost information could cause here is
to give wrong information in a statistics view) in
PhysicalConfirmReceivedLocation() be changed to mention the risk of
not saving the slot?

Also, after 0001, even the same solution will be true for logical
slots as well, where we are already careful to save the slot to disk
if its restart_lsn is changed, see LogicalConfirmReceivedLocation().
So, won't that effort be wasted? Even if we don't want to do anything
about it (which doesn't sound like a good idea), we should note that
in comments somewhere.

I have added the comments about both points in the attached revision
of the patchset.

------
Regards,
Alexander Korotkov
Supabase

Attachments:

v6-0003-Remove-redundant-ReplicationSlotsComputeRequiredL.patchapplication/octet-stream; name=v6-0003-Remove-redundant-ReplicationSlotsComputeRequiredL.patchDownload
From 7737daab8bc713dad04181878ee6d8e0ac9d935c Mon Sep 17 00:00:00 2001
From: Alexander Korotkov <akorotkov@postgresql.org>
Date: Sat, 24 May 2025 13:34:36 +0300
Subject: [PATCH v6 3/3] Remove redundant ReplicationSlotsComputeRequiredLSN
 calls

The function ReplicationSlotsComputeRequiredLSN is used to calculate the
oldest slots' required LSN. It is called every time when restart_lsn
value of any slot is changed (for example, when a slot is advancing).
The slot's oldest required LSN is used to remote old WAL segments in two
places - when checkpoint or restart point is created (CreateCheckPoint,
CreateRestartPoint functions). Old WAL segments seems to be truncated in
these two functions only.

The idea of the patch is to call ReplicationSlotsComputeRequiredLSN in
CreateCheckPoint or CreateRestartPoint functions only, before call of
RemoveOldXlogFiles function where old WAL segments are removed. There
is no obvious need to recalculate oldest required LSN every time when a
slot's restart_lsn is changed.

The value of the oldest required lsn can affect on slot invalidation.
The function InvalidateObsoleteReplicationSlots with non zero second
parameter (oldestSegno) is called in CreateCheckPoint,
CreateRestartPoint functions only where slot invalidation occurs with
reason RS_INVAL_WAL_REMOVED. Once we update the oldest slots' required
lsn in the beginning of these functions, the proposed patch should not
break the behaviour of slot invalidation function in this case.
---
 src/backend/access/transam/xlog.c          | 4 ++++
 src/backend/replication/logical/logical.c  | 1 -
 src/backend/replication/logical/slotsync.c | 4 ----
 src/backend/replication/slot.c             | 5 -----
 src/backend/replication/slotfuncs.c        | 2 --
 src/backend/replication/walsender.c        | 1 -
 6 files changed, 4 insertions(+), 13 deletions(-)

diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index 0a7f7a71d8b..bdfd0a59ab7 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -7324,6 +7324,7 @@ CreateCheckPoint(int flags)
 	 * might be advanced concurrently, so we call this before
 	 * CheckPointReplicationSlots() synchronizes replication slots.
 	 */
+	ReplicationSlotsComputeRequiredLSN();
 	slotsMinReqLSN = XLogGetReplicationSlotMinimumLSN();
 
 	/*
@@ -7528,6 +7529,7 @@ CreateCheckPoint(int flags)
 		 * cleanup.  Then, we must synchronize the replication slots again in
 		 * order to make this LSN safe to use.
 		 */
+		ReplicationSlotsComputeRequiredLSN();
 		slotsMinReqLSN = XLogGetReplicationSlotMinimumLSN();
 		CheckPointReplicationSlots(shutdown);
 
@@ -7901,6 +7903,7 @@ CreateRestartPoint(int flags)
 	 * might be advanced concurrently, so we call this before
 	 * CheckPointReplicationSlots() synchronizes replication slots.
 	 */
+	ReplicationSlotsComputeRequiredLSN();
 	slotsMinReqLSN = XLogGetReplicationSlotMinimumLSN();
 
 	if (log_checkpoints)
@@ -8001,6 +8004,7 @@ CreateRestartPoint(int flags)
 		 * cleanup.  Then, we must synchronize the replication slots again in
 		 * order to make this LSN safe to use.
 		 */
+		ReplicationSlotsComputeRequiredLSN();
 		slotsMinReqLSN = XLogGetReplicationSlotMinimumLSN();
 		CheckPointReplicationSlots(flags & CHECKPOINT_IS_SHUTDOWN);
 
diff --git a/src/backend/replication/logical/logical.c b/src/backend/replication/logical/logical.c
index 081e6593722..34e973393c2 100644
--- a/src/backend/replication/logical/logical.c
+++ b/src/backend/replication/logical/logical.c
@@ -1925,7 +1925,6 @@ LogicalConfirmReceivedLocation(XLogRecPtr lsn)
 			SpinLockRelease(&MyReplicationSlot->mutex);
 
 			ReplicationSlotsComputeRequiredXmin(false);
-			ReplicationSlotsComputeRequiredLSN();
 		}
 	}
 	else
diff --git a/src/backend/replication/logical/slotsync.c b/src/backend/replication/logical/slotsync.c
index 656e66e0ae0..30662c09275 100644
--- a/src/backend/replication/logical/slotsync.c
+++ b/src/backend/replication/logical/slotsync.c
@@ -335,7 +335,6 @@ update_local_synced_slot(RemoteSlot *remote_slot, Oid remote_dbid,
 		SpinLockRelease(&slot->mutex);
 
 		ReplicationSlotsComputeRequiredXmin(false);
-		ReplicationSlotsComputeRequiredLSN();
 	}
 
 	return updated_config || updated_xmin_or_lsn;
@@ -502,9 +501,6 @@ reserve_wal_for_local_slot(XLogRecPtr restart_lsn)
 		slot->data.restart_lsn = restart_lsn;
 		SpinLockRelease(&slot->mutex);
 
-		/* Prevent WAL removal as fast as possible */
-		ReplicationSlotsComputeRequiredLSN();
-
 		XLByteToSeg(slot->data.restart_lsn, segno, wal_segment_size);
 
 		/*
diff --git a/src/backend/replication/slot.c b/src/backend/replication/slot.c
index 600b87fa9cb..dd18fe10f7d 100644
--- a/src/backend/replication/slot.c
+++ b/src/backend/replication/slot.c
@@ -1008,7 +1008,6 @@ ReplicationSlotDropPtr(ReplicationSlot *slot)
 	 * limits.
 	 */
 	ReplicationSlotsComputeRequiredXmin(false);
-	ReplicationSlotsComputeRequiredLSN();
 
 	/*
 	 * If removing the directory fails, the worst thing that will happen is
@@ -1494,9 +1493,6 @@ ReplicationSlotReserveWal(void)
 		slot->data.restart_lsn = restart_lsn;
 		SpinLockRelease(&slot->mutex);
 
-		/* prevent WAL removal as fast as possible */
-		ReplicationSlotsComputeRequiredLSN();
-
 		/*
 		 * If all required WAL is still there, great, otherwise retry. The
 		 * slot should prevent further removal of WAL, unless there's a
@@ -2014,7 +2010,6 @@ restart:
 	if (invalidated)
 	{
 		ReplicationSlotsComputeRequiredXmin(false);
-		ReplicationSlotsComputeRequiredLSN();
 	}
 
 	return invalidated;
diff --git a/src/backend/replication/slotfuncs.c b/src/backend/replication/slotfuncs.c
index 36cc2ed4e44..3300fb9b1c9 100644
--- a/src/backend/replication/slotfuncs.c
+++ b/src/backend/replication/slotfuncs.c
@@ -583,7 +583,6 @@ pg_replication_slot_advance(PG_FUNCTION_ARGS)
 	 * advancing potentially done.
 	 */
 	ReplicationSlotsComputeRequiredXmin(false);
-	ReplicationSlotsComputeRequiredLSN();
 
 	ReplicationSlotRelease();
 
@@ -819,7 +818,6 @@ copy_replication_slot(FunctionCallInfo fcinfo, bool logical_slot)
 
 		ReplicationSlotMarkDirty();
 		ReplicationSlotsComputeRequiredXmin(false);
-		ReplicationSlotsComputeRequiredLSN();
 		ReplicationSlotSave();
 
 #ifdef USE_ASSERT_CHECKING
diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c
index d751d34295d..dff749f00a8 100644
--- a/src/backend/replication/walsender.c
+++ b/src/backend/replication/walsender.c
@@ -2384,7 +2384,6 @@ PhysicalConfirmReceivedLocation(XLogRecPtr lsn)
 	if (changed)
 	{
 		ReplicationSlotMarkDirty();
-		ReplicationSlotsComputeRequiredLSN();
 		PhysicalWakeupLogicalWalSnd();
 	}
 
-- 
2.39.5 (Apple Git-154)

v6-0002-Add-TAP-tests-to-check-replication-slot-advance-d.patchapplication/octet-stream; name=v6-0002-Add-TAP-tests-to-check-replication-slot-advance-d.patchDownload
From 519fc0357ddc1ea0b12cd2df1deae840d56ea6ba Mon Sep 17 00:00:00 2001
From: Alexander Korotkov <akorotkov@postgresql.org>
Date: Sat, 24 May 2025 13:26:28 +0300
Subject: [PATCH v6 2/3] Add TAP tests to check replication slot advance during
 the checkpoint

The new tests verify that logical and physical replication slots are still
valid after an immediate restart on checkpoint completion when the slot was
advanced during the checkpoint.

This commit introduces two new injection points to make these tests possible:

* checkpoint-before-old-wal-removal - triggered in the checkpointer process
  just before old WAL segments cleanup;
* logical-replication-slot-advance-segment - triggered in
  LogicalConfirmReceivedLocation() when restart_lsn was changed enough to
  point to the next WAL segment.

Discussion: https://postgr.es/m/flat/1d12d2-67235980-35-19a406a0%4063439497
Author: Vitaly Davydov <v.davydov@postgrespro.ru>
Author: Tomas Vondra <tomas@vondra.me>
Reviewed-by: Alexander Korotkov <aekorotkov@gmail.com>
Backpatch-through: 17
---
 src/backend/access/transam/xlog.c             |   4 +
 src/backend/replication/logical/logical.c     |  18 +++
 .../test_replslot_required_lsn/Makefile       |  18 +++
 .../test_replslot_required_lsn/meson.build    |  16 ++
 src/test/recovery/meson.build                 |   2 +
 src/test/recovery/t/046_logical_slot.pl       | 139 ++++++++++++++++++
 src/test/recovery/t/047_physical_slot.pl      | 133 +++++++++++++++++
 7 files changed, 330 insertions(+)
 create mode 100644 src/test/modules/test_replslot_required_lsn/Makefile
 create mode 100644 src/test/modules/test_replslot_required_lsn/meson.build
 create mode 100644 src/test/recovery/t/046_logical_slot.pl
 create mode 100644 src/test/recovery/t/047_physical_slot.pl

diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index a0e589e9c4b..0a7f7a71d8b 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -7509,6 +7509,10 @@ CreateCheckPoint(int flags)
 	if (PriorRedoPtr != InvalidXLogRecPtr)
 		UpdateCheckPointDistanceEstimate(RedoRecPtr - PriorRedoPtr);
 
+#ifdef USE_INJECTION_POINTS
+	INJECTION_POINT("checkpoint-before-old-wal-removal", NULL);
+#endif
+
 	/*
 	 * Delete old log files, those no longer needed for last checkpoint to
 	 * prevent the disk holding the xlog from growing full.
diff --git a/src/backend/replication/logical/logical.c b/src/backend/replication/logical/logical.c
index 6b3995133e2..081e6593722 100644
--- a/src/backend/replication/logical/logical.c
+++ b/src/backend/replication/logical/logical.c
@@ -29,6 +29,7 @@
 #include "postgres.h"
 
 #include "access/xact.h"
+#include "access/xlog_internal.h"
 #include "access/xlogutils.h"
 #include "fmgr.h"
 #include "miscadmin.h"
@@ -41,6 +42,7 @@
 #include "storage/proc.h"
 #include "storage/procarray.h"
 #include "utils/builtins.h"
+#include "utils/injection_point.h"
 #include "utils/inval.h"
 #include "utils/memutils.h"
 
@@ -1825,9 +1827,13 @@ LogicalConfirmReceivedLocation(XLogRecPtr lsn)
 	{
 		bool		updated_xmin = false;
 		bool		updated_restart = false;
+		XLogRecPtr	restart_lsn pg_attribute_unused();
 
 		SpinLockAcquire(&MyReplicationSlot->mutex);
 
+		/* remember the old restart lsn */
+		restart_lsn = MyReplicationSlot->data.restart_lsn;
+
 		/*
 		 * Prevent moving the confirmed_flush backwards, as this could lead to
 		 * data duplication issues caused by replicating already replicated
@@ -1889,6 +1895,18 @@ LogicalConfirmReceivedLocation(XLogRecPtr lsn)
 		 */
 		if (updated_xmin || updated_restart)
 		{
+#ifdef USE_INJECTION_POINTS
+			XLogSegNo	seg1,
+						seg2;
+
+			XLByteToSeg(restart_lsn, seg1, wal_segment_size);
+			XLByteToSeg(MyReplicationSlot->data.restart_lsn, seg2, wal_segment_size);
+
+			/* trigger injection point, but only if segment changes */
+			if (seg1 != seg2)
+				INJECTION_POINT("logical-replication-slot-advance-segment", NULL);
+#endif
+
 			ReplicationSlotMarkDirty();
 			ReplicationSlotSave();
 			elog(DEBUG1, "updated xmin: %u restart: %u", updated_xmin, updated_restart);
diff --git a/src/test/modules/test_replslot_required_lsn/Makefile b/src/test/modules/test_replslot_required_lsn/Makefile
new file mode 100644
index 00000000000..e5ff8af255b
--- /dev/null
+++ b/src/test/modules/test_replslot_required_lsn/Makefile
@@ -0,0 +1,18 @@
+# src/test/modules/test_replslot_required_lsn/Makefile
+
+EXTRA_INSTALL=src/test/modules/injection_points \
+	contrib/test_decoding
+
+export enable_injection_points
+TAP_TESTS = 1
+
+ifdef USE_PGXS
+PG_CONFIG = pg_config
+PGXS := $(shell $(PG_CONFIG) --pgxs)
+include $(PGXS)
+else
+subdir = src/test/modules/test_replslot_required_lsn
+top_builddir = ../../../..
+include $(top_builddir)/src/Makefile.global
+include $(top_srcdir)/contrib/contrib-global.mk
+endif
diff --git a/src/test/modules/test_replslot_required_lsn/meson.build b/src/test/modules/test_replslot_required_lsn/meson.build
new file mode 100644
index 00000000000..44d2546632b
--- /dev/null
+++ b/src/test/modules/test_replslot_required_lsn/meson.build
@@ -0,0 +1,16 @@
+# Copyright (c) 2025, PostgreSQL Global Development Group
+
+tests += {
+  'name': 'test_replslot_required_lsn',
+  'sd': meson.current_source_dir(),
+  'bd': meson.current_build_dir(),
+  'tap': {
+    'env': {
+       'enable_injection_points': get_option('injection_points') ? 'yes' : 'no',
+    },
+    'tests': [
+      't/001_logical_slot.pl',
+      't/002_physical_slot.pl'
+    ],
+  },
+}
diff --git a/src/test/recovery/meson.build b/src/test/recovery/meson.build
index cb983766c67..5ee41c3cd4d 100644
--- a/src/test/recovery/meson.build
+++ b/src/test/recovery/meson.build
@@ -54,6 +54,8 @@ tests += {
       't/043_no_contrecord_switch.pl',
       't/044_invalidate_inactive_slots.pl',
       't/045_archive_restartpoint.pl',
+      't/046_logical_slot.pl',
+      't/047_physical_slot.pl'
     ],
   },
 }
diff --git a/src/test/recovery/t/046_logical_slot.pl b/src/test/recovery/t/046_logical_slot.pl
new file mode 100644
index 00000000000..b4265c4a6a5
--- /dev/null
+++ b/src/test/recovery/t/046_logical_slot.pl
@@ -0,0 +1,139 @@
+# Copyright (c) 2025, PostgreSQL Global Development Group
+#
+# This test verifies the case when the logical slot is advanced during
+# checkpoint. The test checks that the logical slot's restart_lsn still refers
+# to an existed WAL segment after immediate restart.
+#
+use strict;
+use warnings FATAL => 'all';
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+
+use Test::More;
+
+if ($ENV{enable_injection_points} ne 'yes')
+{
+	plan skip_all => 'Injection points not supported by this build';
+}
+
+my ($node, $result);
+
+$node = PostgreSQL::Test::Cluster->new('mike');
+$node->init;
+$node->append_conf('postgresql.conf',
+	"shared_preload_libraries = 'injection_points'");
+$node->append_conf('postgresql.conf', "wal_level = 'logical'");
+$node->start;
+$node->safe_psql('postgres', q(CREATE EXTENSION injection_points));
+
+# Create a simple table to generate data into.
+$node->safe_psql('postgres',
+	q{create table t (id serial primary key, b text)});
+
+# Create the two slots we'll need.
+$node->safe_psql('postgres',
+	q{select pg_create_logical_replication_slot('slot_logical', 'test_decoding')}
+);
+$node->safe_psql('postgres',
+	q{select pg_create_physical_replication_slot('slot_physical', true)});
+
+# Advance both slots to the current position just to have everything "valid".
+$node->safe_psql('postgres',
+	q{select count(*) from pg_logical_slot_get_changes('slot_logical', null, null)}
+);
+$node->safe_psql('postgres',
+	q{select pg_replication_slot_advance('slot_physical', pg_current_wal_lsn())}
+);
+
+# Run checkpoint to flush current state to disk and set a baseline.
+$node->safe_psql('postgres', q{checkpoint});
+
+# Generate some transactions to get RUNNING_XACTS.
+my $xacts = $node->background_psql('postgres');
+$xacts->query_until(
+	qr/run_xacts/,
+	q(\echo run_xacts
+SELECT 1 \watch 0.1
+\q
+));
+
+# Insert 2M rows; that's about 260MB (~20 segments) worth of WAL.
+$node->safe_psql('postgres',
+	q{insert into t (b) select md5(i::text) from generate_series(1,1000000) s(i)}
+);
+
+# Run another checkpoint to set a new restore LSN.
+$node->safe_psql('postgres', q{checkpoint});
+
+# Another 2M rows; that's about 260MB (~20 segments) worth of WAL.
+$node->safe_psql('postgres',
+	q{insert into t (b) select md5(i::text) from generate_series(1,1000000) s(i)}
+);
+
+# Run another checkpoint, this time in the background, and make it wait
+# on the injection point) so that the checkpoint stops right before
+# removing old WAL segments.
+note('starting checkpoint\n');
+
+my $checkpoint = $node->background_psql('postgres');
+$checkpoint->query_safe(
+	q(select injection_points_attach('checkpoint-before-old-wal-removal','wait'))
+);
+$checkpoint->query_until(
+	qr/starting_checkpoint/,
+	q(\echo starting_checkpoint
+checkpoint;
+\q
+));
+
+# Wait until the checkpoint stops right before removing WAL segments.
+note('waiting for injection_point\n');
+$node->wait_for_event('checkpointer', 'checkpoint-before-old-wal-removal');
+note('injection_point is reached');
+
+# Try to advance the logical slot, but make it stop when it moves to the next
+# WAL segment (this has to happen in the background, too).
+my $logical = $node->background_psql('postgres');
+$logical->query_safe(
+	q{select injection_points_attach('logical-replication-slot-advance-segment','wait');}
+);
+$logical->query_until(
+	qr/get_changes/,
+	q(
+\echo get_changes
+select count(*) from pg_logical_slot_get_changes('slot_logical', null, null) \watch 1
+\q
+));
+
+# Wait until the slot's restart_lsn points to the next WAL segment.
+note('waiting for injection_point\n');
+$node->wait_for_event('client backend',
+	'logical-replication-slot-advance-segment');
+note('injection_point is reached');
+
+# OK, we're in the right situation: time to advance the physical slot, which
+# recalculates the required LSN, and then unblock the checkpoint, which
+# removes the WAL still needed by the logical slot.
+$node->safe_psql('postgres',
+	q{select pg_replication_slot_advance('slot_physical', pg_current_wal_lsn())}
+);
+
+# Continue the checkpoint.
+$node->safe_psql('postgres',
+	q{select injection_points_wakeup('checkpoint-before-old-wal-removal')});
+
+# Abruptly stop the server (1 second should be enough for the checkpoint
+# to finish; it would be better).
+$node->stop('immediate');
+
+$node->start;
+
+eval {
+	$node->safe_psql('postgres',
+		q{select count(*) from pg_logical_slot_get_changes('slot_logical', null, null);}
+	);
+};
+is($@, '', "Logical slot still valid");
+
+done_testing();
diff --git a/src/test/recovery/t/047_physical_slot.pl b/src/test/recovery/t/047_physical_slot.pl
new file mode 100644
index 00000000000..454e56b9bd2
--- /dev/null
+++ b/src/test/recovery/t/047_physical_slot.pl
@@ -0,0 +1,133 @@
+# Copyright (c) 2025, PostgreSQL Global Development Group
+#
+# This test verifies the case when the physical slot is advanced during
+# checkpoint. The test checks that the physical slot's restart_lsn still refers
+# to an existed WAL segment after immediate restart.
+#
+use strict;
+use warnings FATAL => 'all';
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+
+use Test::More;
+
+if ($ENV{enable_injection_points} ne 'yes')
+{
+	plan skip_all => 'Injection points not supported by this build';
+}
+
+my ($node, $result);
+
+$node = PostgreSQL::Test::Cluster->new('mike');
+$node->init;
+$node->append_conf('postgresql.conf',
+	"shared_preload_libraries = 'injection_points'");
+$node->append_conf('postgresql.conf', "wal_level = 'replica'");
+$node->start;
+$node->safe_psql('postgres', q(CREATE EXTENSION injection_points));
+
+# Create a simple table to generate data into.
+$node->safe_psql('postgres',
+	q{create table t (id serial primary key, b text)});
+
+# Create a physical replication slot.
+$node->safe_psql('postgres',
+	q{select pg_create_physical_replication_slot('slot_physical', true)});
+
+# Advance slot to the current position, just to have everything "valid".
+$node->safe_psql('postgres',
+	q{select pg_replication_slot_advance('slot_physical', pg_current_wal_lsn())}
+);
+
+# Run checkpoint to flush current state to disk and set a baseline.
+$node->safe_psql('postgres', q{checkpoint});
+
+# Insert 2M rows; that's about 260MB (~20 segments) worth of WAL.
+$node->safe_psql('postgres',
+	q{insert into t (b) select md5(i::text) from generate_series(1,100000) s(i)}
+);
+
+# Advance slot to the current position, just to have everything "valid".
+$node->safe_psql('postgres',
+	q{select pg_replication_slot_advance('slot_physical', pg_current_wal_lsn())}
+);
+
+# Run another checkpoint to set a new restore LSN.
+$node->safe_psql('postgres', q{checkpoint});
+
+# Another 2M rows; that's about 260MB (~20 segments) worth of WAL.
+$node->safe_psql('postgres',
+	q{insert into t (b) select md5(i::text) from generate_series(1,1000000) s(i)}
+);
+
+my $restart_lsn_init = $node->safe_psql('postgres',
+	q{select restart_lsn from pg_replication_slots where slot_name = 'slot_physical'}
+);
+chomp($restart_lsn_init);
+note("restart lsn before checkpoint: $restart_lsn_init");
+
+# Run another checkpoint, this time in the background, and make it wait
+# on the injection point) so that the checkpoint stops right before
+# removing old WAL segments.
+note('starting checkpoint');
+
+my $checkpoint = $node->background_psql('postgres');
+$checkpoint->query_safe(
+	q{select injection_points_attach('checkpoint-before-old-wal-removal','wait')}
+);
+$checkpoint->query_until(
+	qr/starting_checkpoint/,
+	q(\echo starting_checkpoint
+checkpoint;
+\q
+));
+
+# Wait until the checkpoint stops right before removing WAL segments.
+note('waiting for injection_point');
+$node->wait_for_event('checkpointer', 'checkpoint-before-old-wal-removal');
+note('injection_point is reached');
+
+# OK, we're in the right situation: time to advance the physical slot, which
+# recalculates the required LSN and then unblock the checkpoint, which
+# removes the WAL still needed by the physical slot.
+$node->safe_psql('postgres',
+	q{select pg_replication_slot_advance('slot_physical', pg_current_wal_lsn())}
+);
+
+# Continue the checkpoint.
+$node->safe_psql('postgres',
+	q{select injection_points_wakeup('checkpoint-before-old-wal-removal')});
+
+my $restart_lsn_old = $node->safe_psql('postgres',
+	q{select restart_lsn from pg_replication_slots where slot_name = 'slot_physical'}
+);
+chomp($restart_lsn_old);
+note("restart lsn before stop: $restart_lsn_old");
+
+# Abruptly stop the server (1 second should be enough for the checkpoint
+# to finish; it would be better).
+$node->stop('immediate');
+
+$node->start;
+
+# Get the restart_lsn of the slot right after restarting.
+my $restart_lsn = $node->safe_psql('postgres',
+	q{select restart_lsn from pg_replication_slots where slot_name = 'slot_physical'}
+);
+chomp($restart_lsn);
+note("restart lsn: $restart_lsn");
+
+# Get the WAL segment name for the slot's restart_lsn.
+my $restart_lsn_segment = $node->safe_psql('postgres',
+	"SELECT pg_walfile_name('$restart_lsn'::pg_lsn)");
+chomp($restart_lsn_segment);
+
+# Check if the required wal segment exists.
+note("required by slot segment name: $restart_lsn_segment");
+my $datadir = $node->data_dir;
+ok( -f "$datadir/pg_wal/$restart_lsn_segment",
+	"WAL segment $restart_lsn_segment for physical slot's restart_lsn $restart_lsn exists"
+);
+
+done_testing();
-- 
2.39.5 (Apple Git-154)

v6-0001-Keep-WAL-segments-by-the-flushed-value-of-the-slo.patchapplication/octet-stream; name=v6-0001-Keep-WAL-segments-by-the-flushed-value-of-the-slo.patchDownload
From cea89c4c09e3f558094beefd2a614f8bc1b30fe1 Mon Sep 17 00:00:00 2001
From: Alexander Korotkov <akorotkov@postgresql.org>
Date: Sat, 24 May 2025 16:26:27 +0300
Subject: [PATCH v6 1/3] Keep WAL segments by the flushed value of the slot's
 restart LSN

The patch fixes the issue with the unexpected removal of old WAL segments
after checkpoint, followed by an immediate restart. The issue occurs when
a slot is advanced after the start of the checkpoint and before old WAL
segments are removed at the end of the checkpoint.

The idea of the patch is to get the minimal restart_lsn at the beginning
of checkpoint (or restart point) creation and use this value when calculating
the oldest LSN for WAL segments removal at the end of checkpoint. This idea
was proposed by Tomas Vondra in the discussion.

Discussion: https://postgr.es/m/flat/1d12d2-67235980-35-19a406a0%4063439497
Author: Vitaly Davydov <v.davydov@postgrespro.ru>
Reviewed-by: Tomas Vondra <tomas@vondra.me>
Reviewed-by: Alexander Korotkov <aekorotkov@gmail.com>
Backpatch-through: 13
---
 src/backend/access/transam/xlog.c         | 55 +++++++++++++++++++----
 src/backend/replication/logical/logical.c | 10 ++++-
 src/backend/replication/walsender.c       |  4 ++
 3 files changed, 60 insertions(+), 9 deletions(-)

diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index 1914859b2ee..a0e589e9c4b 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -677,7 +677,8 @@ static XLogRecPtr CreateOverwriteContrecordRecord(XLogRecPtr aborted_lsn,
 												  XLogRecPtr pagePtr,
 												  TimeLineID newTLI);
 static void CheckPointGuts(XLogRecPtr checkPointRedo, int flags);
-static void KeepLogSeg(XLogRecPtr recptr, XLogSegNo *logSegNo);
+static void KeepLogSeg(XLogRecPtr recptr, XLogRecPtr slotsMinLSN,
+					   XLogSegNo *logSegNo);
 static XLogRecPtr XLogGetReplicationSlotMinimumLSN(void);
 
 static void AdvanceXLInsertBuffer(XLogRecPtr upto, TimeLineID tli,
@@ -7087,6 +7088,7 @@ CreateCheckPoint(int flags)
 	VirtualTransactionId *vxids;
 	int			nvxids;
 	int			oldXLogAllowed = 0;
+	XLogRecPtr	slotsMinReqLSN;
 
 	/*
 	 * An end-of-recovery checkpoint is really a shutdown checkpoint, just
@@ -7315,6 +7317,15 @@ CreateCheckPoint(int flags)
 	 */
 	END_CRIT_SECTION();
 
+	/*
+	 * Get the current minimum LSN to be used later in the WAL segment
+	 * cleanup.  We may clean up only WAL segments, which are not needed
+	 * according to synchronized LSNs of replication slots.  The slot's LSN
+	 * might be advanced concurrently, so we call this before
+	 * CheckPointReplicationSlots() synchronizes replication slots.
+	 */
+	slotsMinReqLSN = XLogGetReplicationSlotMinimumLSN();
+
 	/*
 	 * In some cases there are groups of actions that must all occur on one
 	 * side or the other of a checkpoint record. Before flushing the
@@ -7503,17 +7514,25 @@ CreateCheckPoint(int flags)
 	 * prevent the disk holding the xlog from growing full.
 	 */
 	XLByteToSeg(RedoRecPtr, _logSegNo, wal_segment_size);
-	KeepLogSeg(recptr, &_logSegNo);
+	KeepLogSeg(recptr, slotsMinReqLSN, &_logSegNo);
 	if (InvalidateObsoleteReplicationSlots(RS_INVAL_WAL_REMOVED | RS_INVAL_IDLE_TIMEOUT,
 										   _logSegNo, InvalidOid,
 										   InvalidTransactionId))
 	{
+		/*
+		 * Recalculate the current minimum LSN to be used in the WAL segment
+		 * cleanup.  Then, we must synchronize the replication slots again in
+		 * order to make this LSN safe to use.
+		 */
+		slotsMinReqLSN = XLogGetReplicationSlotMinimumLSN();
+		CheckPointReplicationSlots(shutdown);
+
 		/*
 		 * Some slots have been invalidated; recalculate the old-segment
 		 * horizon, starting again from RedoRecPtr.
 		 */
 		XLByteToSeg(RedoRecPtr, _logSegNo, wal_segment_size);
-		KeepLogSeg(recptr, &_logSegNo);
+		KeepLogSeg(recptr, slotsMinReqLSN, &_logSegNo);
 	}
 	_logSegNo--;
 	RemoveOldXlogFiles(_logSegNo, RedoRecPtr, recptr,
@@ -7788,6 +7807,7 @@ CreateRestartPoint(int flags)
 	XLogRecPtr	endptr;
 	XLogSegNo	_logSegNo;
 	TimestampTz xtime;
+	XLogRecPtr	slotsMinReqLSN;
 
 	/* Concurrent checkpoint/restartpoint cannot happen */
 	Assert(!IsUnderPostmaster || MyBackendType == B_CHECKPOINTER);
@@ -7870,6 +7890,15 @@ CreateRestartPoint(int flags)
 	MemSet(&CheckpointStats, 0, sizeof(CheckpointStats));
 	CheckpointStats.ckpt_start_t = GetCurrentTimestamp();
 
+	/*
+	 * Get the current minimum LSN to be used later in the WAL segment
+	 * cleanup.  We may clean up only WAL segments, which are not needed
+	 * according to synchronized LSNs of replication slots.  The slot's LSN
+	 * might be advanced concurrently, so we call this before
+	 * CheckPointReplicationSlots() synchronizes replication slots.
+	 */
+	slotsMinReqLSN = XLogGetReplicationSlotMinimumLSN();
+
 	if (log_checkpoints)
 		LogCheckpointStart(flags, true);
 
@@ -7958,17 +7987,25 @@ CreateRestartPoint(int flags)
 	receivePtr = GetWalRcvFlushRecPtr(NULL, NULL);
 	replayPtr = GetXLogReplayRecPtr(&replayTLI);
 	endptr = (receivePtr < replayPtr) ? replayPtr : receivePtr;
-	KeepLogSeg(endptr, &_logSegNo);
+	KeepLogSeg(endptr, slotsMinReqLSN, &_logSegNo);
 	if (InvalidateObsoleteReplicationSlots(RS_INVAL_WAL_REMOVED | RS_INVAL_IDLE_TIMEOUT,
 										   _logSegNo, InvalidOid,
 										   InvalidTransactionId))
 	{
+		/*
+		 * Recalculate the current minimum LSN to be used in the WAL segment
+		 * cleanup.  Then, we must synchronize the replication slots again in
+		 * order to make this LSN safe to use.
+		 */
+		slotsMinReqLSN = XLogGetReplicationSlotMinimumLSN();
+		CheckPointReplicationSlots(flags & CHECKPOINT_IS_SHUTDOWN);
+
 		/*
 		 * Some slots have been invalidated; recalculate the old-segment
 		 * horizon, starting again from RedoRecPtr.
 		 */
 		XLByteToSeg(RedoRecPtr, _logSegNo, wal_segment_size);
-		KeepLogSeg(endptr, &_logSegNo);
+		KeepLogSeg(endptr, slotsMinReqLSN, &_logSegNo);
 	}
 	_logSegNo--;
 
@@ -8063,6 +8100,7 @@ GetWALAvailability(XLogRecPtr targetLSN)
 	XLogSegNo	oldestSegMaxWalSize;	/* oldest segid kept by max_wal_size */
 	XLogSegNo	oldestSlotSeg;	/* oldest segid kept by slot */
 	uint64		keepSegs;
+	XLogRecPtr	slotsMinReqLSN;
 
 	/*
 	 * slot does not reserve WAL. Either deactivated, or has never been active
@@ -8076,8 +8114,9 @@ GetWALAvailability(XLogRecPtr targetLSN)
 	 * oldestSlotSeg to the current segment.
 	 */
 	currpos = GetXLogWriteRecPtr();
+	slotsMinReqLSN = XLogGetReplicationSlotMinimumLSN();
 	XLByteToSeg(currpos, oldestSlotSeg, wal_segment_size);
-	KeepLogSeg(currpos, &oldestSlotSeg);
+	KeepLogSeg(currpos, slotsMinReqLSN, &oldestSlotSeg);
 
 	/*
 	 * Find the oldest extant segment file. We get 1 until checkpoint removes
@@ -8138,7 +8177,7 @@ GetWALAvailability(XLogRecPtr targetLSN)
  * invalidation is optionally done here, instead.
  */
 static void
-KeepLogSeg(XLogRecPtr recptr, XLogSegNo *logSegNo)
+KeepLogSeg(XLogRecPtr recptr, XLogRecPtr slotsMinReqLSN, XLogSegNo *logSegNo)
 {
 	XLogSegNo	currSegNo;
 	XLogSegNo	segno;
@@ -8151,7 +8190,7 @@ KeepLogSeg(XLogRecPtr recptr, XLogSegNo *logSegNo)
 	 * Calculate how many segments are kept by slots first, adjusting for
 	 * max_slot_wal_keep_size.
 	 */
-	keep = XLogGetReplicationSlotMinimumLSN();
+	keep = slotsMinReqLSN;
 	if (keep != InvalidXLogRecPtr && keep < recptr)
 	{
 		XLByteToSeg(keep, segno, wal_segment_size);
diff --git a/src/backend/replication/logical/logical.c b/src/backend/replication/logical/logical.c
index 1d56d0c4ef3..6b3995133e2 100644
--- a/src/backend/replication/logical/logical.c
+++ b/src/backend/replication/logical/logical.c
@@ -1878,7 +1878,15 @@ LogicalConfirmReceivedLocation(XLogRecPtr lsn)
 
 		SpinLockRelease(&MyReplicationSlot->mutex);
 
-		/* first write new xmin to disk, so we know what's up after a crash */
+		/*
+		 * First, write new xmin and restart_lsn to disk so we know what's up
+		 * after a crash.  Even when we do this, the checkpointer can see the
+		 * updated restart_lsn value in the shared memory; then, a crash can
+		 * happen before we manage to write that value to the disk.  Thus,
+		 * checkpointer still needs to make special efforts to keep WAL
+		 * segments required by the restart_lsn written to the disk.  See
+		 * CreateCheckPoint() and CreateRestartPoint() for details.
+		 */
 		if (updated_xmin || updated_restart)
 		{
 			ReplicationSlotMarkDirty();
diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c
index 9fa8beb6103..d751d34295d 100644
--- a/src/backend/replication/walsender.c
+++ b/src/backend/replication/walsender.c
@@ -2393,6 +2393,10 @@ PhysicalConfirmReceivedLocation(XLogRecPtr lsn)
 	 * be energy wasted - the worst thing lost information could cause here is
 	 * to give wrong information in a statistics view - we'll just potentially
 	 * be more conservative in removing files.
+	 *
+	 * Checkpointer makes special efforts to keep the WAL segments required by
+	 * the restart_lsn written to the disk. See CreateCheckPoint() and
+	 * CreateRestartPoint() for details.
 	 */
 }
 
-- 
2.39.5 (Apple Git-154)

#27Amit Kapila
amit.kapila16@gmail.com
In reply to: Alexander Korotkov (#26)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

On Sat, May 24, 2025 at 6:59 PM Alexander Korotkov <aekorotkov@gmail.com> wrote:

Hi, Amit!

Thank you for your attention to this patchset!

On Sat, May 24, 2025 at 2:15 PM Amit Kapila <amit.kapila16@gmail.com> wrote:

On Sat, May 24, 2025 at 4:08 PM Alexander Korotkov <aekorotkov@gmail.com> wrote:

I spend more time on this. The next revision is attached. It
contains revised comments and other cosmetic changes. I'm going to
backpatch 0001 to all supported branches,

Is my understanding correct that we need 0001 because
PhysicalConfirmReceivedLocation() doesn't save the slot to disk after
changing the slot's restart_lsn?

Yes. Also, even if it would save slot to the disk, there is still
race condition that concurrent checkpoint could use updated value from
the shared memory to clean old WAL segments, and then crash happens
before we managed to write the slot to the disk.

How can that happen, if we first write the updated value to disk and
then update the shared memory as we do in
LogicalConfirmReceivedLocation?

BTW, won't there be a similar problem with physical slot's xmin
computation as well? In PhysicalReplicationSlotNewXmin(), after
updating the slot's xmin computation, we mark it as dirty and update
shared memory values. Now, say after checkpointer writes these xmin
values to disk, walsender receives another feedback message and
updates the slot's xmin values. Now using these updated shared memory
values, vacuum removes the rows, however, a restart will show the
older xmin values in the slot, which mean vacuum would have removed
the required rows before restart.

As per my understanding, neither the xmin nor the LSN problem exists
for logical slots. I am pointing this out to indicate we may need to
think of a different solution for physical slots, if these are
problems only for physical slots.

--
With Regards,
Amit Kapila.

#28Alexander Korotkov
aekorotkov@gmail.com
In reply to: Amit Kapila (#27)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

On Mon, May 26, 2025 at 9:49 AM Amit Kapila <amit.kapila16@gmail.com> wrote:

On Sat, May 24, 2025 at 6:59 PM Alexander Korotkov <aekorotkov@gmail.com> wrote:

Hi, Amit!

Thank you for your attention to this patchset!

On Sat, May 24, 2025 at 2:15 PM Amit Kapila <amit.kapila16@gmail.com> wrote:

On Sat, May 24, 2025 at 4:08 PM Alexander Korotkov <aekorotkov@gmail.com> wrote:

I spend more time on this. The next revision is attached. It
contains revised comments and other cosmetic changes. I'm going to
backpatch 0001 to all supported branches,

Is my understanding correct that we need 0001 because
PhysicalConfirmReceivedLocation() doesn't save the slot to disk after
changing the slot's restart_lsn?

Yes. Also, even if it would save slot to the disk, there is still
race condition that concurrent checkpoint could use updated value from
the shared memory to clean old WAL segments, and then crash happens
before we managed to write the slot to the disk.

How can that happen, if we first write the updated value to disk and
then update the shared memory as we do in
LogicalConfirmReceivedLocation?

I don't see this to be true for LogicalConfirmReceivedLocation() and
restart_lsn. We clearly don't update restart_lsn in shared memory
after flush. It we previously proposed to resolve a problem for
restart_lsn like this, but that approach breaks ABI and couldn't be
backpatched.

BTW, won't there be a similar problem with physical slot's xmin
computation as well? In PhysicalReplicationSlotNewXmin(), after
updating the slot's xmin computation, we mark it as dirty and update
shared memory values. Now, say after checkpointer writes these xmin
values to disk, walsender receives another feedback message and
updates the slot's xmin values. Now using these updated shared memory
values, vacuum removes the rows, however, a restart will show the
older xmin values in the slot, which mean vacuum would have removed
the required rows before restart.

I don't yet see why this should be a problem. feedbackXmin provides a
barrier for vacuum, but unlike restart_lsn it doesn't refers removed
tuples as the resource. If vacuum would remove some tuples based on
the last feedback message that tuples are not needed by replica. If
after restart we would have outdated feedbackXmin that would make our
vacuum even more conservative for a while, but I don't see how that
would lead to material problem. On contrast you can see in
046_logical_slot.pl how lack of restart_lsn synchronization leads to
an error while attempting to decode the changes, because the current
code expects WAL at restart_lsn to exist.

As per my understanding, neither the xmin nor the LSN problem exists
for logical slots. I am pointing this out to indicate we may need to
think of a different solution for physical slots, if these are
problems only for physical slots.

There is indeed a problem for logical slots. You can apply 0002 patch
alone and test for logical slots will fail.

------
Regards,
Alexander Korotkov
Supabase

#29Vitaly Davydov
v.davydov@postgrespro.ru
In reply to: Amit Kapila (#27)
3 attachment(s)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

Dear Alexander, Amit, All

Amit wrote:

Is my understanding correct that we need 0001 because
PhysicalConfirmReceivedLocation() doesn't save the slot to disk after
changing the slot's restart_lsn?

Yes. Also, even if it would save slot to the disk, there is still
race condition that concurrent checkpoint could use updated value from
the shared memory to clean old WAL segments, and then crash happens
before we managed to write the slot to the disk.

How can that happen, if we first write the updated value to disk and
then update the shared memory as we do in
LogicalConfirmReceivedLocation?

I guess, that the problem with logical slots still exist. Please, see the tap
test: src/test/recovery/t/046_logical_slot.pl from the v6 version of the patch.
A race condition may happen when logical slot's restart_lsn was changed but not
yet written to the disk. Imagine, there is another physical slot which is
advanced at this moment. It recomputes oldest min LSN and takes into account
changed but not saved to disk restart_lsn of the logical slot. We come to the
situation when the WAL segment for the logical slot's restart_lsn may be
truncated after immediate restart.

I'm not sure what may happen with two checkpoints which execute in parallel, but
I would say that the patch 0001 guarantees that every checkpoint run will trim
the WAL segments based on the already saved on disk restart LSNs of slots. The
rule to trim the WAL by saved slot's restart_lsn will not be violated.

Amit wrote:
As per my understanding, neither the xmin nor the LSN problem exists
for logical slots. I am pointing this out to indicate we may need to
think of a different solution for physical slots, if these are
problems only for physical slots.

As I've already told, it indirectly affects the logical slots as well.

Alexander wrote:
I spend more time on this. The next revision is attached. It
contains revised comments and other cosmetic changes. I'm going to
backpatch 0001 to all supported branches, and 0002 to 17 where
injection points were introduced.

Alexander, thank you for polishing the patch. Just my opinion, I would prefer
to put tests before the fix due to reason that you can reproduce the problem
when simply checkout the commit with tests. Once, the tests are after the fix
you are not able to do this way. Anyway, I'm ok with your changes. Thank you!

I did some changes in the patch (v7 is attached):
* Removed modules/test_replslot_required_lsn directory. It is not needed anymore,
once you've moved test files to another directory.
* Renamed tests to 046_checkpoint_logical_slot.pl, 047_checkpoint_physical_slot.pl.
I believe, such names are more descriptive.

Please, consider these changes.

With best regards,
Vitaly

Attachments:

v7-0003-Remove-redundant-ReplicationSlotsComputeRequiredLSN-.patchtext/x-patchDownload
From b85ffd56eb1e28d5e61e6221ba97e7e3bea7a982 Mon Sep 17 00:00:00 2001
From: Alexander Korotkov <akorotkov@postgresql.org>
Date: Sat, 24 May 2025 13:34:36 +0300
Subject: [PATCH 3/3] Remove redundant ReplicationSlotsComputeRequiredLSN calls

The function ReplicationSlotsComputeRequiredLSN is used to calculate the
oldest slots' required LSN. It is called every time when restart_lsn
value of any slot is changed (for example, when a slot is advancing).
The slot's oldest required LSN is used to remote old WAL segments in two
places - when checkpoint or restart point is created (CreateCheckPoint,
CreateRestartPoint functions). Old WAL segments seems to be truncated in
these two functions only.

The idea of the patch is to call ReplicationSlotsComputeRequiredLSN in
CreateCheckPoint or CreateRestartPoint functions only, before call of
RemoveOldXlogFiles function where old WAL segments are removed. There
is no obvious need to recalculate oldest required LSN every time when a
slot's restart_lsn is changed.

The value of the oldest required lsn can affect on slot invalidation.
The function InvalidateObsoleteReplicationSlots with non zero second
parameter (oldestSegno) is called in CreateCheckPoint,
CreateRestartPoint functions only where slot invalidation occurs with
reason RS_INVAL_WAL_REMOVED. Once we update the oldest slots' required
lsn in the beginning of these functions, the proposed patch should not
break the behaviour of slot invalidation function in this case.
---
 src/backend/access/transam/xlog.c          | 4 ++++
 src/backend/replication/logical/logical.c  | 1 -
 src/backend/replication/logical/slotsync.c | 4 ----
 src/backend/replication/slot.c             | 5 -----
 src/backend/replication/slotfuncs.c        | 2 --
 src/backend/replication/walsender.c        | 1 -
 6 files changed, 4 insertions(+), 13 deletions(-)

diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index 0a7f7a71d8b..bdfd0a59ab7 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -7324,6 +7324,7 @@ CreateCheckPoint(int flags)
 	 * might be advanced concurrently, so we call this before
 	 * CheckPointReplicationSlots() synchronizes replication slots.
 	 */
+	ReplicationSlotsComputeRequiredLSN();
 	slotsMinReqLSN = XLogGetReplicationSlotMinimumLSN();
 
 	/*
@@ -7528,6 +7529,7 @@ CreateCheckPoint(int flags)
 		 * cleanup.  Then, we must synchronize the replication slots again in
 		 * order to make this LSN safe to use.
 		 */
+		ReplicationSlotsComputeRequiredLSN();
 		slotsMinReqLSN = XLogGetReplicationSlotMinimumLSN();
 		CheckPointReplicationSlots(shutdown);
 
@@ -7901,6 +7903,7 @@ CreateRestartPoint(int flags)
 	 * might be advanced concurrently, so we call this before
 	 * CheckPointReplicationSlots() synchronizes replication slots.
 	 */
+	ReplicationSlotsComputeRequiredLSN();
 	slotsMinReqLSN = XLogGetReplicationSlotMinimumLSN();
 
 	if (log_checkpoints)
@@ -8001,6 +8004,7 @@ CreateRestartPoint(int flags)
 		 * cleanup.  Then, we must synchronize the replication slots again in
 		 * order to make this LSN safe to use.
 		 */
+		ReplicationSlotsComputeRequiredLSN();
 		slotsMinReqLSN = XLogGetReplicationSlotMinimumLSN();
 		CheckPointReplicationSlots(flags & CHECKPOINT_IS_SHUTDOWN);
 
diff --git a/src/backend/replication/logical/logical.c b/src/backend/replication/logical/logical.c
index 081e6593722..34e973393c2 100644
--- a/src/backend/replication/logical/logical.c
+++ b/src/backend/replication/logical/logical.c
@@ -1925,7 +1925,6 @@ LogicalConfirmReceivedLocation(XLogRecPtr lsn)
 			SpinLockRelease(&MyReplicationSlot->mutex);
 
 			ReplicationSlotsComputeRequiredXmin(false);
-			ReplicationSlotsComputeRequiredLSN();
 		}
 	}
 	else
diff --git a/src/backend/replication/logical/slotsync.c b/src/backend/replication/logical/slotsync.c
index 656e66e0ae0..30662c09275 100644
--- a/src/backend/replication/logical/slotsync.c
+++ b/src/backend/replication/logical/slotsync.c
@@ -335,7 +335,6 @@ update_local_synced_slot(RemoteSlot *remote_slot, Oid remote_dbid,
 		SpinLockRelease(&slot->mutex);
 
 		ReplicationSlotsComputeRequiredXmin(false);
-		ReplicationSlotsComputeRequiredLSN();
 	}
 
 	return updated_config || updated_xmin_or_lsn;
@@ -502,9 +501,6 @@ reserve_wal_for_local_slot(XLogRecPtr restart_lsn)
 		slot->data.restart_lsn = restart_lsn;
 		SpinLockRelease(&slot->mutex);
 
-		/* Prevent WAL removal as fast as possible */
-		ReplicationSlotsComputeRequiredLSN();
-
 		XLByteToSeg(slot->data.restart_lsn, segno, wal_segment_size);
 
 		/*
diff --git a/src/backend/replication/slot.c b/src/backend/replication/slot.c
index 600b87fa9cb..dd18fe10f7d 100644
--- a/src/backend/replication/slot.c
+++ b/src/backend/replication/slot.c
@@ -1008,7 +1008,6 @@ ReplicationSlotDropPtr(ReplicationSlot *slot)
 	 * limits.
 	 */
 	ReplicationSlotsComputeRequiredXmin(false);
-	ReplicationSlotsComputeRequiredLSN();
 
 	/*
 	 * If removing the directory fails, the worst thing that will happen is
@@ -1494,9 +1493,6 @@ ReplicationSlotReserveWal(void)
 		slot->data.restart_lsn = restart_lsn;
 		SpinLockRelease(&slot->mutex);
 
-		/* prevent WAL removal as fast as possible */
-		ReplicationSlotsComputeRequiredLSN();
-
 		/*
 		 * If all required WAL is still there, great, otherwise retry. The
 		 * slot should prevent further removal of WAL, unless there's a
@@ -2014,7 +2010,6 @@ restart:
 	if (invalidated)
 	{
 		ReplicationSlotsComputeRequiredXmin(false);
-		ReplicationSlotsComputeRequiredLSN();
 	}
 
 	return invalidated;
diff --git a/src/backend/replication/slotfuncs.c b/src/backend/replication/slotfuncs.c
index 36cc2ed4e44..3300fb9b1c9 100644
--- a/src/backend/replication/slotfuncs.c
+++ b/src/backend/replication/slotfuncs.c
@@ -583,7 +583,6 @@ pg_replication_slot_advance(PG_FUNCTION_ARGS)
 	 * advancing potentially done.
 	 */
 	ReplicationSlotsComputeRequiredXmin(false);
-	ReplicationSlotsComputeRequiredLSN();
 
 	ReplicationSlotRelease();
 
@@ -819,7 +818,6 @@ copy_replication_slot(FunctionCallInfo fcinfo, bool logical_slot)
 
 		ReplicationSlotMarkDirty();
 		ReplicationSlotsComputeRequiredXmin(false);
-		ReplicationSlotsComputeRequiredLSN();
 		ReplicationSlotSave();
 
 #ifdef USE_ASSERT_CHECKING
diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c
index d751d34295d..dff749f00a8 100644
--- a/src/backend/replication/walsender.c
+++ b/src/backend/replication/walsender.c
@@ -2384,7 +2384,6 @@ PhysicalConfirmReceivedLocation(XLogRecPtr lsn)
 	if (changed)
 	{
 		ReplicationSlotMarkDirty();
-		ReplicationSlotsComputeRequiredLSN();
 		PhysicalWakeupLogicalWalSnd();
 	}
 
-- 
2.34.1

v7-0002-Add-TAP-tests-to-check-replication-slot-advance-duri.patchtext/x-patchDownload
From c978cc88848615670fce667c83cda3fe874d80c0 Mon Sep 17 00:00:00 2001
From: Alexander Korotkov <akorotkov@postgresql.org>
Date: Sat, 24 May 2025 13:26:28 +0300
Subject: [PATCH 2/3] Add TAP tests to check replication slot advance during
 the checkpoint

The new tests verify that logical and physical replication slots are still
valid after an immediate restart on checkpoint completion when the slot was
advanced during the checkpoint.

This commit introduces two new injection points to make these tests possible:

* checkpoint-before-old-wal-removal - triggered in the checkpointer process
  just before old WAL segments cleanup;
* logical-replication-slot-advance-segment - triggered in
  LogicalConfirmReceivedLocation() when restart_lsn was changed enough to
  point to the next WAL segment.

Discussion: https://postgr.es/m/flat/1d12d2-67235980-35-19a406a0%4063439497
Author: Vitaly Davydov <v.davydov@postgrespro.ru>
Author: Tomas Vondra <tomas@vondra.me>
Reviewed-by: Alexander Korotkov <aekorotkov@gmail.com>
Backpatch-through: 17
---
 src/backend/access/transam/xlog.c             |   4 +
 src/backend/replication/logical/logical.c     |  18 +++
 src/test/recovery/meson.build                 |   2 +
 .../recovery/t/046_checkpoint_logical_slot.pl | 139 ++++++++++++++++++
 .../t/047_checkpoint_physical_slot.pl         | 133 +++++++++++++++++
 5 files changed, 296 insertions(+)
 create mode 100644 src/test/recovery/t/046_checkpoint_logical_slot.pl
 create mode 100644 src/test/recovery/t/047_checkpoint_physical_slot.pl

diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index a0e589e9c4b..0a7f7a71d8b 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -7509,6 +7509,10 @@ CreateCheckPoint(int flags)
 	if (PriorRedoPtr != InvalidXLogRecPtr)
 		UpdateCheckPointDistanceEstimate(RedoRecPtr - PriorRedoPtr);
 
+#ifdef USE_INJECTION_POINTS
+	INJECTION_POINT("checkpoint-before-old-wal-removal", NULL);
+#endif
+
 	/*
 	 * Delete old log files, those no longer needed for last checkpoint to
 	 * prevent the disk holding the xlog from growing full.
diff --git a/src/backend/replication/logical/logical.c b/src/backend/replication/logical/logical.c
index 6b3995133e2..081e6593722 100644
--- a/src/backend/replication/logical/logical.c
+++ b/src/backend/replication/logical/logical.c
@@ -29,6 +29,7 @@
 #include "postgres.h"
 
 #include "access/xact.h"
+#include "access/xlog_internal.h"
 #include "access/xlogutils.h"
 #include "fmgr.h"
 #include "miscadmin.h"
@@ -41,6 +42,7 @@
 #include "storage/proc.h"
 #include "storage/procarray.h"
 #include "utils/builtins.h"
+#include "utils/injection_point.h"
 #include "utils/inval.h"
 #include "utils/memutils.h"
 
@@ -1825,9 +1827,13 @@ LogicalConfirmReceivedLocation(XLogRecPtr lsn)
 	{
 		bool		updated_xmin = false;
 		bool		updated_restart = false;
+		XLogRecPtr	restart_lsn pg_attribute_unused();
 
 		SpinLockAcquire(&MyReplicationSlot->mutex);
 
+		/* remember the old restart lsn */
+		restart_lsn = MyReplicationSlot->data.restart_lsn;
+
 		/*
 		 * Prevent moving the confirmed_flush backwards, as this could lead to
 		 * data duplication issues caused by replicating already replicated
@@ -1889,6 +1895,18 @@ LogicalConfirmReceivedLocation(XLogRecPtr lsn)
 		 */
 		if (updated_xmin || updated_restart)
 		{
+#ifdef USE_INJECTION_POINTS
+			XLogSegNo	seg1,
+						seg2;
+
+			XLByteToSeg(restart_lsn, seg1, wal_segment_size);
+			XLByteToSeg(MyReplicationSlot->data.restart_lsn, seg2, wal_segment_size);
+
+			/* trigger injection point, but only if segment changes */
+			if (seg1 != seg2)
+				INJECTION_POINT("logical-replication-slot-advance-segment", NULL);
+#endif
+
 			ReplicationSlotMarkDirty();
 			ReplicationSlotSave();
 			elog(DEBUG1, "updated xmin: %u restart: %u", updated_xmin, updated_restart);
diff --git a/src/test/recovery/meson.build b/src/test/recovery/meson.build
index cb983766c67..92429d28402 100644
--- a/src/test/recovery/meson.build
+++ b/src/test/recovery/meson.build
@@ -54,6 +54,8 @@ tests += {
       't/043_no_contrecord_switch.pl',
       't/044_invalidate_inactive_slots.pl',
       't/045_archive_restartpoint.pl',
+      't/046_checkpoint_logical_slot.pl',
+      't/047_checkpoint_physical_slot.pl'
     ],
   },
 }
diff --git a/src/test/recovery/t/046_checkpoint_logical_slot.pl b/src/test/recovery/t/046_checkpoint_logical_slot.pl
new file mode 100644
index 00000000000..b4265c4a6a5
--- /dev/null
+++ b/src/test/recovery/t/046_checkpoint_logical_slot.pl
@@ -0,0 +1,139 @@
+# Copyright (c) 2025, PostgreSQL Global Development Group
+#
+# This test verifies the case when the logical slot is advanced during
+# checkpoint. The test checks that the logical slot's restart_lsn still refers
+# to an existed WAL segment after immediate restart.
+#
+use strict;
+use warnings FATAL => 'all';
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+
+use Test::More;
+
+if ($ENV{enable_injection_points} ne 'yes')
+{
+	plan skip_all => 'Injection points not supported by this build';
+}
+
+my ($node, $result);
+
+$node = PostgreSQL::Test::Cluster->new('mike');
+$node->init;
+$node->append_conf('postgresql.conf',
+	"shared_preload_libraries = 'injection_points'");
+$node->append_conf('postgresql.conf', "wal_level = 'logical'");
+$node->start;
+$node->safe_psql('postgres', q(CREATE EXTENSION injection_points));
+
+# Create a simple table to generate data into.
+$node->safe_psql('postgres',
+	q{create table t (id serial primary key, b text)});
+
+# Create the two slots we'll need.
+$node->safe_psql('postgres',
+	q{select pg_create_logical_replication_slot('slot_logical', 'test_decoding')}
+);
+$node->safe_psql('postgres',
+	q{select pg_create_physical_replication_slot('slot_physical', true)});
+
+# Advance both slots to the current position just to have everything "valid".
+$node->safe_psql('postgres',
+	q{select count(*) from pg_logical_slot_get_changes('slot_logical', null, null)}
+);
+$node->safe_psql('postgres',
+	q{select pg_replication_slot_advance('slot_physical', pg_current_wal_lsn())}
+);
+
+# Run checkpoint to flush current state to disk and set a baseline.
+$node->safe_psql('postgres', q{checkpoint});
+
+# Generate some transactions to get RUNNING_XACTS.
+my $xacts = $node->background_psql('postgres');
+$xacts->query_until(
+	qr/run_xacts/,
+	q(\echo run_xacts
+SELECT 1 \watch 0.1
+\q
+));
+
+# Insert 2M rows; that's about 260MB (~20 segments) worth of WAL.
+$node->safe_psql('postgres',
+	q{insert into t (b) select md5(i::text) from generate_series(1,1000000) s(i)}
+);
+
+# Run another checkpoint to set a new restore LSN.
+$node->safe_psql('postgres', q{checkpoint});
+
+# Another 2M rows; that's about 260MB (~20 segments) worth of WAL.
+$node->safe_psql('postgres',
+	q{insert into t (b) select md5(i::text) from generate_series(1,1000000) s(i)}
+);
+
+# Run another checkpoint, this time in the background, and make it wait
+# on the injection point) so that the checkpoint stops right before
+# removing old WAL segments.
+note('starting checkpoint\n');
+
+my $checkpoint = $node->background_psql('postgres');
+$checkpoint->query_safe(
+	q(select injection_points_attach('checkpoint-before-old-wal-removal','wait'))
+);
+$checkpoint->query_until(
+	qr/starting_checkpoint/,
+	q(\echo starting_checkpoint
+checkpoint;
+\q
+));
+
+# Wait until the checkpoint stops right before removing WAL segments.
+note('waiting for injection_point\n');
+$node->wait_for_event('checkpointer', 'checkpoint-before-old-wal-removal');
+note('injection_point is reached');
+
+# Try to advance the logical slot, but make it stop when it moves to the next
+# WAL segment (this has to happen in the background, too).
+my $logical = $node->background_psql('postgres');
+$logical->query_safe(
+	q{select injection_points_attach('logical-replication-slot-advance-segment','wait');}
+);
+$logical->query_until(
+	qr/get_changes/,
+	q(
+\echo get_changes
+select count(*) from pg_logical_slot_get_changes('slot_logical', null, null) \watch 1
+\q
+));
+
+# Wait until the slot's restart_lsn points to the next WAL segment.
+note('waiting for injection_point\n');
+$node->wait_for_event('client backend',
+	'logical-replication-slot-advance-segment');
+note('injection_point is reached');
+
+# OK, we're in the right situation: time to advance the physical slot, which
+# recalculates the required LSN, and then unblock the checkpoint, which
+# removes the WAL still needed by the logical slot.
+$node->safe_psql('postgres',
+	q{select pg_replication_slot_advance('slot_physical', pg_current_wal_lsn())}
+);
+
+# Continue the checkpoint.
+$node->safe_psql('postgres',
+	q{select injection_points_wakeup('checkpoint-before-old-wal-removal')});
+
+# Abruptly stop the server (1 second should be enough for the checkpoint
+# to finish; it would be better).
+$node->stop('immediate');
+
+$node->start;
+
+eval {
+	$node->safe_psql('postgres',
+		q{select count(*) from pg_logical_slot_get_changes('slot_logical', null, null);}
+	);
+};
+is($@, '', "Logical slot still valid");
+
+done_testing();
diff --git a/src/test/recovery/t/047_checkpoint_physical_slot.pl b/src/test/recovery/t/047_checkpoint_physical_slot.pl
new file mode 100644
index 00000000000..454e56b9bd2
--- /dev/null
+++ b/src/test/recovery/t/047_checkpoint_physical_slot.pl
@@ -0,0 +1,133 @@
+# Copyright (c) 2025, PostgreSQL Global Development Group
+#
+# This test verifies the case when the physical slot is advanced during
+# checkpoint. The test checks that the physical slot's restart_lsn still refers
+# to an existed WAL segment after immediate restart.
+#
+use strict;
+use warnings FATAL => 'all';
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+
+use Test::More;
+
+if ($ENV{enable_injection_points} ne 'yes')
+{
+	plan skip_all => 'Injection points not supported by this build';
+}
+
+my ($node, $result);
+
+$node = PostgreSQL::Test::Cluster->new('mike');
+$node->init;
+$node->append_conf('postgresql.conf',
+	"shared_preload_libraries = 'injection_points'");
+$node->append_conf('postgresql.conf', "wal_level = 'replica'");
+$node->start;
+$node->safe_psql('postgres', q(CREATE EXTENSION injection_points));
+
+# Create a simple table to generate data into.
+$node->safe_psql('postgres',
+	q{create table t (id serial primary key, b text)});
+
+# Create a physical replication slot.
+$node->safe_psql('postgres',
+	q{select pg_create_physical_replication_slot('slot_physical', true)});
+
+# Advance slot to the current position, just to have everything "valid".
+$node->safe_psql('postgres',
+	q{select pg_replication_slot_advance('slot_physical', pg_current_wal_lsn())}
+);
+
+# Run checkpoint to flush current state to disk and set a baseline.
+$node->safe_psql('postgres', q{checkpoint});
+
+# Insert 2M rows; that's about 260MB (~20 segments) worth of WAL.
+$node->safe_psql('postgres',
+	q{insert into t (b) select md5(i::text) from generate_series(1,100000) s(i)}
+);
+
+# Advance slot to the current position, just to have everything "valid".
+$node->safe_psql('postgres',
+	q{select pg_replication_slot_advance('slot_physical', pg_current_wal_lsn())}
+);
+
+# Run another checkpoint to set a new restore LSN.
+$node->safe_psql('postgres', q{checkpoint});
+
+# Another 2M rows; that's about 260MB (~20 segments) worth of WAL.
+$node->safe_psql('postgres',
+	q{insert into t (b) select md5(i::text) from generate_series(1,1000000) s(i)}
+);
+
+my $restart_lsn_init = $node->safe_psql('postgres',
+	q{select restart_lsn from pg_replication_slots where slot_name = 'slot_physical'}
+);
+chomp($restart_lsn_init);
+note("restart lsn before checkpoint: $restart_lsn_init");
+
+# Run another checkpoint, this time in the background, and make it wait
+# on the injection point) so that the checkpoint stops right before
+# removing old WAL segments.
+note('starting checkpoint');
+
+my $checkpoint = $node->background_psql('postgres');
+$checkpoint->query_safe(
+	q{select injection_points_attach('checkpoint-before-old-wal-removal','wait')}
+);
+$checkpoint->query_until(
+	qr/starting_checkpoint/,
+	q(\echo starting_checkpoint
+checkpoint;
+\q
+));
+
+# Wait until the checkpoint stops right before removing WAL segments.
+note('waiting for injection_point');
+$node->wait_for_event('checkpointer', 'checkpoint-before-old-wal-removal');
+note('injection_point is reached');
+
+# OK, we're in the right situation: time to advance the physical slot, which
+# recalculates the required LSN and then unblock the checkpoint, which
+# removes the WAL still needed by the physical slot.
+$node->safe_psql('postgres',
+	q{select pg_replication_slot_advance('slot_physical', pg_current_wal_lsn())}
+);
+
+# Continue the checkpoint.
+$node->safe_psql('postgres',
+	q{select injection_points_wakeup('checkpoint-before-old-wal-removal')});
+
+my $restart_lsn_old = $node->safe_psql('postgres',
+	q{select restart_lsn from pg_replication_slots where slot_name = 'slot_physical'}
+);
+chomp($restart_lsn_old);
+note("restart lsn before stop: $restart_lsn_old");
+
+# Abruptly stop the server (1 second should be enough for the checkpoint
+# to finish; it would be better).
+$node->stop('immediate');
+
+$node->start;
+
+# Get the restart_lsn of the slot right after restarting.
+my $restart_lsn = $node->safe_psql('postgres',
+	q{select restart_lsn from pg_replication_slots where slot_name = 'slot_physical'}
+);
+chomp($restart_lsn);
+note("restart lsn: $restart_lsn");
+
+# Get the WAL segment name for the slot's restart_lsn.
+my $restart_lsn_segment = $node->safe_psql('postgres',
+	"SELECT pg_walfile_name('$restart_lsn'::pg_lsn)");
+chomp($restart_lsn_segment);
+
+# Check if the required wal segment exists.
+note("required by slot segment name: $restart_lsn_segment");
+my $datadir = $node->data_dir;
+ok( -f "$datadir/pg_wal/$restart_lsn_segment",
+	"WAL segment $restart_lsn_segment for physical slot's restart_lsn $restart_lsn exists"
+);
+
+done_testing();
-- 
2.34.1

v7-0001-Keep-WAL-segments-by-the-flushed-value-of-the-slot-s.patchtext/x-patchDownload
From 1e0629efc65f190a58ec729db6f3ada4f8b83897 Mon Sep 17 00:00:00 2001
From: Alexander Korotkov <akorotkov@postgresql.org>
Date: Sat, 24 May 2025 16:26:27 +0300
Subject: [PATCH 1/3] Keep WAL segments by the flushed value of the slot's
 restart LSN

The patch fixes the issue with the unexpected removal of old WAL segments
after checkpoint, followed by an immediate restart. The issue occurs when
a slot is advanced after the start of the checkpoint and before old WAL
segments are removed at the end of the checkpoint.

The idea of the patch is to get the minimal restart_lsn at the beginning
of checkpoint (or restart point) creation and use this value when calculating
the oldest LSN for WAL segments removal at the end of checkpoint. This idea
was proposed by Tomas Vondra in the discussion.

Discussion: https://postgr.es/m/flat/1d12d2-67235980-35-19a406a0%4063439497
Author: Vitaly Davydov <v.davydov@postgrespro.ru>
Reviewed-by: Tomas Vondra <tomas@vondra.me>
Reviewed-by: Alexander Korotkov <aekorotkov@gmail.com>
Backpatch-through: 13
---
 src/backend/access/transam/xlog.c         | 55 +++++++++++++++++++----
 src/backend/replication/logical/logical.c | 10 ++++-
 src/backend/replication/walsender.c       |  4 ++
 3 files changed, 60 insertions(+), 9 deletions(-)

diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index 1914859b2ee..a0e589e9c4b 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -677,7 +677,8 @@ static XLogRecPtr CreateOverwriteContrecordRecord(XLogRecPtr aborted_lsn,
 												  XLogRecPtr pagePtr,
 												  TimeLineID newTLI);
 static void CheckPointGuts(XLogRecPtr checkPointRedo, int flags);
-static void KeepLogSeg(XLogRecPtr recptr, XLogSegNo *logSegNo);
+static void KeepLogSeg(XLogRecPtr recptr, XLogRecPtr slotsMinLSN,
+					   XLogSegNo *logSegNo);
 static XLogRecPtr XLogGetReplicationSlotMinimumLSN(void);
 
 static void AdvanceXLInsertBuffer(XLogRecPtr upto, TimeLineID tli,
@@ -7087,6 +7088,7 @@ CreateCheckPoint(int flags)
 	VirtualTransactionId *vxids;
 	int			nvxids;
 	int			oldXLogAllowed = 0;
+	XLogRecPtr	slotsMinReqLSN;
 
 	/*
 	 * An end-of-recovery checkpoint is really a shutdown checkpoint, just
@@ -7315,6 +7317,15 @@ CreateCheckPoint(int flags)
 	 */
 	END_CRIT_SECTION();
 
+	/*
+	 * Get the current minimum LSN to be used later in the WAL segment
+	 * cleanup.  We may clean up only WAL segments, which are not needed
+	 * according to synchronized LSNs of replication slots.  The slot's LSN
+	 * might be advanced concurrently, so we call this before
+	 * CheckPointReplicationSlots() synchronizes replication slots.
+	 */
+	slotsMinReqLSN = XLogGetReplicationSlotMinimumLSN();
+
 	/*
 	 * In some cases there are groups of actions that must all occur on one
 	 * side or the other of a checkpoint record. Before flushing the
@@ -7503,17 +7514,25 @@ CreateCheckPoint(int flags)
 	 * prevent the disk holding the xlog from growing full.
 	 */
 	XLByteToSeg(RedoRecPtr, _logSegNo, wal_segment_size);
-	KeepLogSeg(recptr, &_logSegNo);
+	KeepLogSeg(recptr, slotsMinReqLSN, &_logSegNo);
 	if (InvalidateObsoleteReplicationSlots(RS_INVAL_WAL_REMOVED | RS_INVAL_IDLE_TIMEOUT,
 										   _logSegNo, InvalidOid,
 										   InvalidTransactionId))
 	{
+		/*
+		 * Recalculate the current minimum LSN to be used in the WAL segment
+		 * cleanup.  Then, we must synchronize the replication slots again in
+		 * order to make this LSN safe to use.
+		 */
+		slotsMinReqLSN = XLogGetReplicationSlotMinimumLSN();
+		CheckPointReplicationSlots(shutdown);
+
 		/*
 		 * Some slots have been invalidated; recalculate the old-segment
 		 * horizon, starting again from RedoRecPtr.
 		 */
 		XLByteToSeg(RedoRecPtr, _logSegNo, wal_segment_size);
-		KeepLogSeg(recptr, &_logSegNo);
+		KeepLogSeg(recptr, slotsMinReqLSN, &_logSegNo);
 	}
 	_logSegNo--;
 	RemoveOldXlogFiles(_logSegNo, RedoRecPtr, recptr,
@@ -7788,6 +7807,7 @@ CreateRestartPoint(int flags)
 	XLogRecPtr	endptr;
 	XLogSegNo	_logSegNo;
 	TimestampTz xtime;
+	XLogRecPtr	slotsMinReqLSN;
 
 	/* Concurrent checkpoint/restartpoint cannot happen */
 	Assert(!IsUnderPostmaster || MyBackendType == B_CHECKPOINTER);
@@ -7870,6 +7890,15 @@ CreateRestartPoint(int flags)
 	MemSet(&CheckpointStats, 0, sizeof(CheckpointStats));
 	CheckpointStats.ckpt_start_t = GetCurrentTimestamp();
 
+	/*
+	 * Get the current minimum LSN to be used later in the WAL segment
+	 * cleanup.  We may clean up only WAL segments, which are not needed
+	 * according to synchronized LSNs of replication slots.  The slot's LSN
+	 * might be advanced concurrently, so we call this before
+	 * CheckPointReplicationSlots() synchronizes replication slots.
+	 */
+	slotsMinReqLSN = XLogGetReplicationSlotMinimumLSN();
+
 	if (log_checkpoints)
 		LogCheckpointStart(flags, true);
 
@@ -7958,17 +7987,25 @@ CreateRestartPoint(int flags)
 	receivePtr = GetWalRcvFlushRecPtr(NULL, NULL);
 	replayPtr = GetXLogReplayRecPtr(&replayTLI);
 	endptr = (receivePtr < replayPtr) ? replayPtr : receivePtr;
-	KeepLogSeg(endptr, &_logSegNo);
+	KeepLogSeg(endptr, slotsMinReqLSN, &_logSegNo);
 	if (InvalidateObsoleteReplicationSlots(RS_INVAL_WAL_REMOVED | RS_INVAL_IDLE_TIMEOUT,
 										   _logSegNo, InvalidOid,
 										   InvalidTransactionId))
 	{
+		/*
+		 * Recalculate the current minimum LSN to be used in the WAL segment
+		 * cleanup.  Then, we must synchronize the replication slots again in
+		 * order to make this LSN safe to use.
+		 */
+		slotsMinReqLSN = XLogGetReplicationSlotMinimumLSN();
+		CheckPointReplicationSlots(flags & CHECKPOINT_IS_SHUTDOWN);
+
 		/*
 		 * Some slots have been invalidated; recalculate the old-segment
 		 * horizon, starting again from RedoRecPtr.
 		 */
 		XLByteToSeg(RedoRecPtr, _logSegNo, wal_segment_size);
-		KeepLogSeg(endptr, &_logSegNo);
+		KeepLogSeg(endptr, slotsMinReqLSN, &_logSegNo);
 	}
 	_logSegNo--;
 
@@ -8063,6 +8100,7 @@ GetWALAvailability(XLogRecPtr targetLSN)
 	XLogSegNo	oldestSegMaxWalSize;	/* oldest segid kept by max_wal_size */
 	XLogSegNo	oldestSlotSeg;	/* oldest segid kept by slot */
 	uint64		keepSegs;
+	XLogRecPtr	slotsMinReqLSN;
 
 	/*
 	 * slot does not reserve WAL. Either deactivated, or has never been active
@@ -8076,8 +8114,9 @@ GetWALAvailability(XLogRecPtr targetLSN)
 	 * oldestSlotSeg to the current segment.
 	 */
 	currpos = GetXLogWriteRecPtr();
+	slotsMinReqLSN = XLogGetReplicationSlotMinimumLSN();
 	XLByteToSeg(currpos, oldestSlotSeg, wal_segment_size);
-	KeepLogSeg(currpos, &oldestSlotSeg);
+	KeepLogSeg(currpos, slotsMinReqLSN, &oldestSlotSeg);
 
 	/*
 	 * Find the oldest extant segment file. We get 1 until checkpoint removes
@@ -8138,7 +8177,7 @@ GetWALAvailability(XLogRecPtr targetLSN)
  * invalidation is optionally done here, instead.
  */
 static void
-KeepLogSeg(XLogRecPtr recptr, XLogSegNo *logSegNo)
+KeepLogSeg(XLogRecPtr recptr, XLogRecPtr slotsMinReqLSN, XLogSegNo *logSegNo)
 {
 	XLogSegNo	currSegNo;
 	XLogSegNo	segno;
@@ -8151,7 +8190,7 @@ KeepLogSeg(XLogRecPtr recptr, XLogSegNo *logSegNo)
 	 * Calculate how many segments are kept by slots first, adjusting for
 	 * max_slot_wal_keep_size.
 	 */
-	keep = XLogGetReplicationSlotMinimumLSN();
+	keep = slotsMinReqLSN;
 	if (keep != InvalidXLogRecPtr && keep < recptr)
 	{
 		XLByteToSeg(keep, segno, wal_segment_size);
diff --git a/src/backend/replication/logical/logical.c b/src/backend/replication/logical/logical.c
index 1d56d0c4ef3..6b3995133e2 100644
--- a/src/backend/replication/logical/logical.c
+++ b/src/backend/replication/logical/logical.c
@@ -1878,7 +1878,15 @@ LogicalConfirmReceivedLocation(XLogRecPtr lsn)
 
 		SpinLockRelease(&MyReplicationSlot->mutex);
 
-		/* first write new xmin to disk, so we know what's up after a crash */
+		/*
+		 * First, write new xmin and restart_lsn to disk so we know what's up
+		 * after a crash.  Even when we do this, the checkpointer can see the
+		 * updated restart_lsn value in the shared memory; then, a crash can
+		 * happen before we manage to write that value to the disk.  Thus,
+		 * checkpointer still needs to make special efforts to keep WAL
+		 * segments required by the restart_lsn written to the disk.  See
+		 * CreateCheckPoint() and CreateRestartPoint() for details.
+		 */
 		if (updated_xmin || updated_restart)
 		{
 			ReplicationSlotMarkDirty();
diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c
index 9fa8beb6103..d751d34295d 100644
--- a/src/backend/replication/walsender.c
+++ b/src/backend/replication/walsender.c
@@ -2393,6 +2393,10 @@ PhysicalConfirmReceivedLocation(XLogRecPtr lsn)
 	 * be energy wasted - the worst thing lost information could cause here is
 	 * to give wrong information in a statistics view - we'll just potentially
 	 * be more conservative in removing files.
+	 *
+	 * Checkpointer makes special efforts to keep the WAL segments required by
+	 * the restart_lsn written to the disk. See CreateCheckPoint() and
+	 * CreateRestartPoint() for details.
 	 */
 }
 
-- 
2.34.1

#30Amit Kapila
amit.kapila16@gmail.com
In reply to: Vitaly Davydov (#29)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

On Mon, May 26, 2025 at 3:52 PM Vitaly Davydov <v.davydov@postgrespro.ru> wrote:

Dear Alexander, Amit, All

Amit wrote:

Is my understanding correct that we need 0001 because
PhysicalConfirmReceivedLocation() doesn't save the slot to disk after
changing the slot's restart_lsn?

Yes. Also, even if it would save slot to the disk, there is still
race condition that concurrent checkpoint could use updated value from
the shared memory to clean old WAL segments, and then crash happens
before we managed to write the slot to the disk.

How can that happen, if we first write the updated value to disk and
then update the shared memory as we do in
LogicalConfirmReceivedLocation?

I guess, that the problem with logical slots still exist. Please, see the tap
test: src/test/recovery/t/046_logical_slot.pl from the v6 version of the patch.
A race condition may happen when logical slot's restart_lsn was changed but not
yet written to the disk. Imagine, there is another physical slot which is
advanced at this moment. It recomputes oldest min LSN and takes into account
changed but not saved to disk restart_lsn of the logical slot. We come to the
situation when the WAL segment for the logical slot's restart_lsn may be
truncated after immediate restart.

Okay, so I was missing the point that the physical slots can consider
the updated value of the logical slot's restart_lsn. The point I was
advocating for logical slots sanctity was when no physical slots are
involved. When updating replicationSlotMinLSN value in shared memory,
the logical slot machinery took care that the value we use should be
flushed to disk. One can argue that we should improve physical slots
machinery so that it also takes care to write the slot to disk before
updating the replicationSlotMinLSN, which is used to remove WAL. I
understand that the downside is physical slots will be written to disk
with a greater frequency, which will not be good from the performance
point of view, but can we think of doing it for the period when a
checkpoint is in progress? OTOH, if we don't want to adjust physical
slot machinery, it seems saving the logical slots to disk immediately
when its restart_lsn is updated is a waste of effort after your patch,
no? If so, why are we okay with that?

I understand that your proposed patch fixes the reported problem but I
am slightly afraid that the proposed solution is not a good idea w.r.t
logical slots so I am trying to see if there are any other alternative
ideas to fix this issue.

--
With Regards,
Amit Kapila.

#31Vitaly Davydov
v.davydov@postgrespro.ru
In reply to: Amit Kapila (#30)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

Dear Amit,

OTOH, if we don't want to adjust physical
slot machinery, it seems saving the logical slots to disk immediately
when its restart_lsn is updated is a waste of effort after your patch,
no? If so, why are we okay with that?

I agree, that saving logical slots at advance is a possible waste of effort. But
I don't understand original ideas behind it. I haven't touched it to make
the minimal patch which should not break the existing functionality.

We trim WAL in checkpoint (or restart point) operation only. The slots'
restart_lsn is used to keep the wal from truncation. I believe, we need to
compute the slots' oldest lsn as the minimal value of restart_lsn values only
when executing checkpoint (or restart point). I guess, it doesn't depend on
slot's type (logical or physical). We have 0003 patch to fix it.

I haven't deeply investigated yet slot's xmin values but I guess the xmin values
are a different story than restart_lsn. It is used to avoid tuple deletions by
vacuum and it is updated by a different way. I can't say that
LogicalConfirmReceivedLocation is the right place to update saved on disk xmin
values. I would propose to update these values in SaveSlotToPath under some lock
to avoid concurrent reads of unsaved values or do in a checkpoint like as for
restart_lsn. We may investigate and improve it in an another patch.

With best regards,
Vitaly

#32Alexander Korotkov
aekorotkov@gmail.com
In reply to: Amit Kapila (#30)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

On Mon, May 26, 2025 at 2:43 PM Amit Kapila <amit.kapila16@gmail.com> wrote:

On Mon, May 26, 2025 at 3:52 PM Vitaly Davydov <v.davydov@postgrespro.ru> wrote:

Dear Alexander, Amit, All

Amit wrote:

Is my understanding correct that we need 0001 because
PhysicalConfirmReceivedLocation() doesn't save the slot to disk after
changing the slot's restart_lsn?

Yes. Also, even if it would save slot to the disk, there is still
race condition that concurrent checkpoint could use updated value from
the shared memory to clean old WAL segments, and then crash happens
before we managed to write the slot to the disk.

How can that happen, if we first write the updated value to disk and
then update the shared memory as we do in
LogicalConfirmReceivedLocation?

I guess, that the problem with logical slots still exist. Please, see the tap
test: src/test/recovery/t/046_logical_slot.pl from the v6 version of the patch.
A race condition may happen when logical slot's restart_lsn was changed but not
yet written to the disk. Imagine, there is another physical slot which is
advanced at this moment. It recomputes oldest min LSN and takes into account
changed but not saved to disk restart_lsn of the logical slot. We come to the
situation when the WAL segment for the logical slot's restart_lsn may be
truncated after immediate restart.

Okay, so I was missing the point that the physical slots can consider
the updated value of the logical slot's restart_lsn. The point I was
advocating for logical slots sanctity was when no physical slots are
involved. When updating replicationSlotMinLSN value in shared memory,
the logical slot machinery took care that the value we use should be
flushed to disk. One can argue that we should improve physical slots
machinery so that it also takes care to write the slot to disk before
updating the replicationSlotMinLSN, which is used to remove WAL. I
understand that the downside is physical slots will be written to disk
with a greater frequency, which will not be good from the performance
point of view, but can we think of doing it for the period when a
checkpoint is in progress?

That could cause replication slowdown while checkpointing is
in-progress. This is certainly better than slowing down the
replication permanently, but still doesn't look good.

OTOH, if we don't want to adjust physical
slot machinery, it seems saving the logical slots to disk immediately
when its restart_lsn is updated is a waste of effort after your patch,
no? If so, why are we okay with that?

I don't think so. I think the reason why logical slots are synced to
disk immediately after update is that logical changes are not
idempotent (you can't safely apply the same change twice) unlike
physical block-level changes. This is why logical slots need to be
synced to prevent double replication of same changes, which could
lead, for example, to double insertion.

I understand that your proposed patch fixes the reported problem but I
am slightly afraid that the proposed solution is not a good idea w.r.t
logical slots so I am trying to see if there are any other alternative
ideas to fix this issue.

I don't understand exact concerns about this fix. For sure, we can
try to implement a fix hacking LogicalConfirmReceivedLocation() and
PhysicalConfirmReceivedLocation(). But that would be way more
cumbersome, especially if we have to keep ABI compatibility. Also, it
doesn't seem to me that either LogicalConfirmReceivedLocation() or
PhysicalConfirmReceivedLocation() currently try to address this issue:
LogicalConfirmReceivedLocation() implements immediate sync for
different reasons.

------
Regards,
Alexander Korotkov
Supabase

#33Amit Kapila
amit.kapila16@gmail.com
In reply to: Alexander Korotkov (#32)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

On Mon, May 26, 2025 at 10:36 PM Alexander Korotkov
<aekorotkov@gmail.com> wrote:

On Mon, May 26, 2025 at 2:43 PM Amit Kapila <amit.kapila16@gmail.com> wrote:

On Mon, May 26, 2025 at 3:52 PM Vitaly Davydov <v.davydov@postgrespro.ru> wrote:

OTOH, if we don't want to adjust physical
slot machinery, it seems saving the logical slots to disk immediately
when its restart_lsn is updated is a waste of effort after your patch,
no? If so, why are we okay with that?

I don't think so. I think the reason why logical slots are synced to
disk immediately after update is that logical changes are not
idempotent (you can't safely apply the same change twice) unlike
physical block-level changes. This is why logical slots need to be
synced to prevent double replication of same changes, which could
lead, for example, to double insertion.

Hmm, if this has to be true, then even in the else branch of
LogicalConfirmReceivedLocation [1]else { SpinLockAcquire(&MyReplicationSlot->mutex);, we should have saved the slot.
AFAIU, whether the logical changes are sent to the client is decided
based on two things: (a) the replication origins, which tracks
replication progress and are maintained by clients (which for built-in
replication are subscriber nodes), see [2]https://www.postgresql.org/docs/devel/replication-origins.html; and (b) confirmed_flush
LSN maintained in the slot by the server. Now, for each ack by the
client after applying/processing changes, we update the
confirmed_flush LSN of the slot but don't immediately flush it. This
shouldn't let us send the changes again because even if the system
crashes and restarts, the client will send the server the location to
start sending the changes from based on its origin tracking. There is
more to it, like there are cases when confirm_flush LSN in the slot
could be ahead the origin's LSN, and we handle all such cases, but I
don't think those are directly related here, so I am skipping those
details for now.

Note that LogicalConfirmReceivedLocation won't save the slot to disk
if it updates only confirmed_flush LSN, which is used to decide
whether to send the changes.

LogicalConfirmReceivedLocation() implements immediate sync for
different reasons.

I may be missing something, but let's discuss some more before we conclude this.

[1]: else { SpinLockAcquire(&MyReplicationSlot->mutex);
else
{
SpinLockAcquire(&MyReplicationSlot->mutex);

/*
* Prevent moving the confirmed_flush backwards. See comments above
* for the details.
*/
if (lsn > MyReplicationSlot->data.confirmed_flush)
MyReplicationSlot->data.confirmed_flush = lsn;

SpinLockRelease(&MyReplicationSlot->mutex);
}

[2]: https://www.postgresql.org/docs/devel/replication-origins.html

--
With Regards,
Amit Kapila.

#34Alexander Korotkov
aekorotkov@gmail.com
In reply to: Amit Kapila (#33)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

On Tue, May 27, 2025 at 7:08 AM Amit Kapila <amit.kapila16@gmail.com> wrote:

On Mon, May 26, 2025 at 10:36 PM Alexander Korotkov
<aekorotkov@gmail.com> wrote:

On Mon, May 26, 2025 at 2:43 PM Amit Kapila <amit.kapila16@gmail.com> wrote:

On Mon, May 26, 2025 at 3:52 PM Vitaly Davydov <v.davydov@postgrespro.ru> wrote:

OTOH, if we don't want to adjust physical
slot machinery, it seems saving the logical slots to disk immediately
when its restart_lsn is updated is a waste of effort after your patch,
no? If so, why are we okay with that?

I don't think so. I think the reason why logical slots are synced to
disk immediately after update is that logical changes are not
idempotent (you can't safely apply the same change twice) unlike
physical block-level changes. This is why logical slots need to be
synced to prevent double replication of same changes, which could
lead, for example, to double insertion.

Hmm, if this has to be true, then even in the else branch of
LogicalConfirmReceivedLocation [1], we should have saved the slot.
AFAIU, whether the logical changes are sent to the client is decided
based on two things: (a) the replication origins, which tracks
replication progress and are maintained by clients (which for built-in
replication are subscriber nodes), see [2]; and (b) confirmed_flush
LSN maintained in the slot by the server. Now, for each ack by the
client after applying/processing changes, we update the
confirmed_flush LSN of the slot but don't immediately flush it. This
shouldn't let us send the changes again because even if the system
crashes and restarts, the client will send the server the location to
start sending the changes from based on its origin tracking. There is
more to it, like there are cases when confirm_flush LSN in the slot
could be ahead the origin's LSN, and we handle all such cases, but I
don't think those are directly related here, so I am skipping those
details for now.

Note that LogicalConfirmReceivedLocation won't save the slot to disk
if it updates only confirmed_flush LSN, which is used to decide
whether to send the changes.

You're right, I didn't study these aspects careful enough.

LogicalConfirmReceivedLocation() implements immediate sync for
different reasons.

I may be missing something, but let's discuss some more before we conclude this.

So, yes probably LogicalConfirmReceivedLocation() tries to care about
keeping all WAL segments after the synchronized value of restart_lsn.
But it just doesn't care about concurrent
ReplicationSlotsComputeRequiredLSN(). In order to fix that logic, we
need effective_restart_lsn field by analogy to effective_catalog_xmin
(similar approach was discussed in this thread before). But that
would require ABI compatibility breakage.

So, I'd like to propose following: backpatch 0001 and 0002, but
implement effective_restart_lsn field for pg19. What do you think?

------
Regards,
Alexander Korotkov
Supabase

#35Alexander Korotkov
aekorotkov@gmail.com
In reply to: Alexander Korotkov (#34)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

On Tue, May 27, 2025 at 12:12 PM Alexander Korotkov
<aekorotkov@gmail.com> wrote:

On Tue, May 27, 2025 at 7:08 AM Amit Kapila <amit.kapila16@gmail.com> wrote:

On Mon, May 26, 2025 at 10:36 PM Alexander Korotkov
<aekorotkov@gmail.com> wrote:

On Mon, May 26, 2025 at 2:43 PM Amit Kapila <amit.kapila16@gmail.com> wrote:

On Mon, May 26, 2025 at 3:52 PM Vitaly Davydov <v.davydov@postgrespro.ru> wrote:

OTOH, if we don't want to adjust physical
slot machinery, it seems saving the logical slots to disk immediately
when its restart_lsn is updated is a waste of effort after your patch,
no? If so, why are we okay with that?

I don't think so. I think the reason why logical slots are synced to
disk immediately after update is that logical changes are not
idempotent (you can't safely apply the same change twice) unlike
physical block-level changes. This is why logical slots need to be
synced to prevent double replication of same changes, which could
lead, for example, to double insertion.

Hmm, if this has to be true, then even in the else branch of
LogicalConfirmReceivedLocation [1], we should have saved the slot.
AFAIU, whether the logical changes are sent to the client is decided
based on two things: (a) the replication origins, which tracks
replication progress and are maintained by clients (which for built-in
replication are subscriber nodes), see [2]; and (b) confirmed_flush
LSN maintained in the slot by the server. Now, for each ack by the
client after applying/processing changes, we update the
confirmed_flush LSN of the slot but don't immediately flush it. This
shouldn't let us send the changes again because even if the system
crashes and restarts, the client will send the server the location to
start sending the changes from based on its origin tracking. There is
more to it, like there are cases when confirm_flush LSN in the slot
could be ahead the origin's LSN, and we handle all such cases, but I
don't think those are directly related here, so I am skipping those
details for now.

Note that LogicalConfirmReceivedLocation won't save the slot to disk
if it updates only confirmed_flush LSN, which is used to decide
whether to send the changes.

You're right, I didn't study these aspects careful enough.

LogicalConfirmReceivedLocation() implements immediate sync for
different reasons.

I may be missing something, but let's discuss some more before we conclude this.

So, yes probably LogicalConfirmReceivedLocation() tries to care about
keeping all WAL segments after the synchronized value of restart_lsn.
But it just doesn't care about concurrent
ReplicationSlotsComputeRequiredLSN(). In order to fix that logic, we
need effective_restart_lsn field by analogy to effective_catalog_xmin
(similar approach was discussed in this thread before). But that
would require ABI compatibility breakage.

So, I'd like to propose following: backpatch 0001 and 0002, but
implement effective_restart_lsn field for pg19. What do you think?

Possibly we could implement effective_restart_lsn even for pg18. As I
know, keeping ABI compatibility is not required for beta.

------
Regards,
Alexander Korotkov
Supabase

#36Amit Kapila
amit.kapila16@gmail.com
In reply to: Alexander Korotkov (#35)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

On Tue, May 27, 2025 at 2:48 PM Alexander Korotkov <aekorotkov@gmail.com> wrote:

On Tue, May 27, 2025 at 12:12 PM Alexander Korotkov
<aekorotkov@gmail.com> wrote:

On Tue, May 27, 2025 at 7:08 AM Amit Kapila <amit.kapila16@gmail.com> wrote:

On Mon, May 26, 2025 at 10:36 PM Alexander Korotkov
<aekorotkov@gmail.com> wrote:

On Mon, May 26, 2025 at 2:43 PM Amit Kapila <amit.kapila16@gmail.com> wrote:

On Mon, May 26, 2025 at 3:52 PM Vitaly Davydov <v.davydov@postgrespro.ru> wrote:

OTOH, if we don't want to adjust physical
slot machinery, it seems saving the logical slots to disk immediately
when its restart_lsn is updated is a waste of effort after your patch,
no? If so, why are we okay with that?

I don't think so. I think the reason why logical slots are synced to
disk immediately after update is that logical changes are not
idempotent (you can't safely apply the same change twice) unlike
physical block-level changes. This is why logical slots need to be
synced to prevent double replication of same changes, which could
lead, for example, to double insertion.

Hmm, if this has to be true, then even in the else branch of
LogicalConfirmReceivedLocation [1], we should have saved the slot.
AFAIU, whether the logical changes are sent to the client is decided
based on two things: (a) the replication origins, which tracks
replication progress and are maintained by clients (which for built-in
replication are subscriber nodes), see [2]; and (b) confirmed_flush
LSN maintained in the slot by the server. Now, for each ack by the
client after applying/processing changes, we update the
confirmed_flush LSN of the slot but don't immediately flush it. This
shouldn't let us send the changes again because even if the system
crashes and restarts, the client will send the server the location to
start sending the changes from based on its origin tracking. There is
more to it, like there are cases when confirm_flush LSN in the slot
could be ahead the origin's LSN, and we handle all such cases, but I
don't think those are directly related here, so I am skipping those
details for now.

Note that LogicalConfirmReceivedLocation won't save the slot to disk
if it updates only confirmed_flush LSN, which is used to decide
whether to send the changes.

You're right, I didn't study these aspects careful enough.

LogicalConfirmReceivedLocation() implements immediate sync for
different reasons.

I may be missing something, but let's discuss some more before we conclude this.

So, yes probably LogicalConfirmReceivedLocation() tries to care about
keeping all WAL segments after the synchronized value of restart_lsn.
But it just doesn't care about concurrent
ReplicationSlotsComputeRequiredLSN(). In order to fix that logic, we
need effective_restart_lsn field by analogy to effective_catalog_xmin
(similar approach was discussed in this thread before). But that
would require ABI compatibility breakage.

So, I'd like to propose following: backpatch 0001 and 0002, but
implement effective_restart_lsn field for pg19. What do you think?

Possibly we could implement effective_restart_lsn even for pg18. As I
know, keeping ABI compatibility is not required for beta.

Yeah, we should be able to change ABI during beta, but I can't comment
on the idea of effective_restart_lsn without seeing the patch or a
detailed explanation of this idea.

Now, you see my point related to restart_lsn computation for logical
slots, it is better to also do some analysis of the problem related to
xmin I have highlighted in one of my previous emails [1]/messages/by-id/CAA4eK1KMaPA5jir_SFu+qr3qu55OOdFWVZpuUkqTSGZ9fyPpHA@mail.gmail.com -- With Regards, Amit Kapila.. I see your
response to it, but I feel someone needs to give it a try by writing a
test and see the behavior. I am saying because logical slots took
precaution of flushing to disk before updating shared values of xmin
for a reason, whereas similar precautions are not taken for physical
slots, so there could be a problem with that computation as well.

[1]: /messages/by-id/CAA4eK1KMaPA5jir_SFu+qr3qu55OOdFWVZpuUkqTSGZ9fyPpHA@mail.gmail.com -- With Regards, Amit Kapila.
--
With Regards,
Amit Kapila.

#37Alexander Korotkov
aekorotkov@gmail.com
In reply to: Amit Kapila (#36)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

On Tue, May 27, 2025 at 2:26 PM Amit Kapila <amit.kapila16@gmail.com> wrote:

Yeah, we should be able to change ABI during beta, but I can't comment
on the idea of effective_restart_lsn without seeing the patch or a
detailed explanation of this idea.

Could you, please, check the patch [1]. It implements this idea
except it names new field restart_lsn_flushed instead of
effective_restart_lsn.

Now, you see my point related to restart_lsn computation for logical
slots, it is better to also do some analysis of the problem related to
xmin I have highlighted in one of my previous emails [1]. I see your
response to it, but I feel someone needs to give it a try by writing a
test and see the behavior. I am saying because logical slots took
precaution of flushing to disk before updating shared values of xmin
for a reason, whereas similar precautions are not taken for physical
slots, so there could be a problem with that computation as well.

I see LogicalConfirmReceivedLocation() performs correctly while
updating effective_catalog_xmin only after syncing the slot to the
disk. I don't see how effective_xmin gets updates with the logical
replication progress though. Could you get me some clue on this,
please?

Links.
1. /messages/by-id/1538a2-67c5c700-7-77ec5a80@179382871

------
Regards,
Alexander Korotkov
Supabase

#38Amit Kapila
amit.kapila16@gmail.com
In reply to: Alexander Korotkov (#37)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

On Thu, May 29, 2025 at 5:29 PM Alexander Korotkov <aekorotkov@gmail.com> wrote:

On Tue, May 27, 2025 at 2:26 PM Amit Kapila <amit.kapila16@gmail.com> wrote:

Yeah, we should be able to change ABI during beta, but I can't comment
on the idea of effective_restart_lsn without seeing the patch or a
detailed explanation of this idea.

Could you, please, check the patch [1]. It implements this idea
except it names new field restart_lsn_flushed instead of
effective_restart_lsn.

This appears to be a better direction than the other patch, at least
for HEAD. I noticed a few points while looking at the patch.

1. restart_lsn_flushed: Can we name it as last_saved_restart_lsn based
on existing variable last_saved_confirmed_flush?
2. There are no comments as to why this is considered only for
persistent slots when CheckPointReplicationSlots doesn't have any such
check.
3. Please see if it makes sense to copy it in the copy_replication_slot.

Apart from these, I am not sure if there are still any pending
comments in the thread to be handled for this patch, so please see to
avoid missing anything.

Now, you see my point related to restart_lsn computation for logical
slots, it is better to also do some analysis of the problem related to
xmin I have highlighted in one of my previous emails [1]. I see your
response to it, but I feel someone needs to give it a try by writing a
test and see the behavior. I am saying because logical slots took
precaution of flushing to disk before updating shared values of xmin
for a reason, whereas similar precautions are not taken for physical
slots, so there could be a problem with that computation as well.

I see LogicalConfirmReceivedLocation() performs correctly while
updating effective_catalog_xmin only after syncing the slot to the
disk. I don't see how effective_xmin gets updates with the logical
replication progress though. Could you get me some clue on this,
please?

As per my understanding, for logical slots, effective_xmin is only set
during the initial copy phase (or say if one has to export a
snapshot), after that, its value won't change. Please read the
comments in CreateInitDecodingContext() where we set its value. If you
still have questions about it, we can discuss further.

--
With Regards,
Amit Kapila.

#39Alexander Korotkov
aekorotkov@gmail.com
In reply to: Amit Kapila (#38)
2 attachment(s)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

On Mon, Jun 2, 2025 at 2:53 PM Amit Kapila <amit.kapila16@gmail.com> wrote:

On Thu, May 29, 2025 at 5:29 PM Alexander Korotkov <aekorotkov@gmail.com> wrote:

On Tue, May 27, 2025 at 2:26 PM Amit Kapila <amit.kapila16@gmail.com> wrote:

Yeah, we should be able to change ABI during beta, but I can't comment
on the idea of effective_restart_lsn without seeing the patch or a
detailed explanation of this idea.

Could you, please, check the patch [1]. It implements this idea
except it names new field restart_lsn_flushed instead of
effective_restart_lsn.

This appears to be a better direction than the other patch, at least
for HEAD. I noticed a few points while looking at the patch.

1. restart_lsn_flushed: Can we name it as last_saved_restart_lsn based
on existing variable last_saved_confirmed_flush?

Good point, renamed.

2. There are no comments as to why this is considered only for
persistent slots when CheckPointReplicationSlots doesn't have any such
check.

Relevant comments added.

3. Please see if it makes sense to copy it in the copy_replication_slot.

Thank you for pointing, but I don't think this is necessary.
copy_replication_slot() calls ReplicationSlotSave(), which updates
last_saved_restart_lsn.

Also, I've changed ReplicationSlotsComputeRequiredLSN() call to
CheckPointReplicationSlots() to update required LSN after
SaveSlotToPath() updated last_saved_restart_lsn. This helps to pass
checks in 001_stream_rep.pl without additional hacks.

Apart from these, I am not sure if there are still any pending
comments in the thread to be handled for this patch, so please see to
avoid missing anything.

Now, you see my point related to restart_lsn computation for logical
slots, it is better to also do some analysis of the problem related to
xmin I have highlighted in one of my previous emails [1]. I see your
response to it, but I feel someone needs to give it a try by writing a
test and see the behavior. I am saying because logical slots took
precaution of flushing to disk before updating shared values of xmin
for a reason, whereas similar precautions are not taken for physical
slots, so there could be a problem with that computation as well.

I see LogicalConfirmReceivedLocation() performs correctly while
updating effective_catalog_xmin only after syncing the slot to the
disk. I don't see how effective_xmin gets updates with the logical
replication progress though. Could you get me some clue on this,
please?

As per my understanding, for logical slots, effective_xmin is only set
during the initial copy phase (or say if one has to export a
snapshot), after that, its value won't change. Please read the
comments in CreateInitDecodingContext() where we set its value. If you
still have questions about it, we can discuss further.

OK, thank you for the clarification. I've read the comments in
CreateInitDecodingContext() as you suggested. All of above makes me
think *_xmin fields are handled properly.

------
Regards,
Alexander Korotkov
Supabase

Attachments:

v2-0001-Keep-WAL-segments-by-slot-s-flushed-restart-LSN.patchapplication/octet-stream; name=v2-0001-Keep-WAL-segments-by-slot-s-flushed-restart-LSN.patchDownload
From 0fe25ecf89396c26842d5889a1c4625002d08a3e Mon Sep 17 00:00:00 2001
From: Vitaly Davydov <v.davydov@postgrespro.ru>
Date: Mon, 3 Mar 2025 17:02:15 +0300
Subject: [PATCH v2 1/2] Keep WAL segments by slot's flushed restart LSN

The slot data is flushed to the disk at the beginning of checkpoint. If
an existing slot is advanced in the middle of checkpoint execution, its
advanced restart LSN is taken to calculate the oldest LSN for WAL
segments removal at the end of checkpoint. If the node is restarted just
after the checkpoint, the slots data will be read from the disk at
recovery with the oldest restart LSN which can refer to removed WAL
segments.

The patch introduces a new in-memory state for slots -
flushed_restart_lsn which is used to calculate the oldest LSN for WAL
segments removal. This state is updated every time with the current
restart_lsn at the moment, when the slot is saving to disk.
---
 src/backend/replication/slot.c | 57 ++++++++++++++++++++++++++++++++++
 src/include/replication/slot.h |  7 +++++
 2 files changed, 64 insertions(+)

diff --git a/src/backend/replication/slot.c b/src/backend/replication/slot.c
index 600b87fa9cb..c64f020742f 100644
--- a/src/backend/replication/slot.c
+++ b/src/backend/replication/slot.c
@@ -424,6 +424,7 @@ ReplicationSlotCreate(const char *name, bool db_specific,
 	slot->candidate_restart_valid = InvalidXLogRecPtr;
 	slot->candidate_restart_lsn = InvalidXLogRecPtr;
 	slot->last_saved_confirmed_flush = InvalidXLogRecPtr;
+	slot->last_saved_restart_lsn = InvalidXLogRecPtr;
 	slot->inactive_since = 0;
 
 	/*
@@ -1165,20 +1166,41 @@ ReplicationSlotsComputeRequiredLSN(void)
 	{
 		ReplicationSlot *s = &ReplicationSlotCtl->replication_slots[i];
 		XLogRecPtr	restart_lsn;
+		XLogRecPtr	last_saved_restart_lsn;
 		bool		invalidated;
+		ReplicationSlotPersistency persistency;
 
 		if (!s->in_use)
 			continue;
 
 		SpinLockAcquire(&s->mutex);
+		persistency = s->data.persistency;
 		restart_lsn = s->data.restart_lsn;
 		invalidated = s->data.invalidated != RS_INVAL_NONE;
+		last_saved_restart_lsn = s->last_saved_restart_lsn;
 		SpinLockRelease(&s->mutex);
 
 		/* invalidated slots need not apply */
 		if (invalidated)
 			continue;
 
+		/*
+		 * For persistent slot use last_saved_restart_lsn to compute the
+		 * oldest LSN for removal of WAL segments.  The segments between
+		 * last_saved_restart_lsn and restart_lsn might be needed by a
+		 * persistent slot in the case of database crash.  Non-persistent
+		 * slots can't survive the database crash, so we don't care about
+		 * last_saved_restart_lsn for them.
+		 */
+		if (persistency == RS_PERSISTENT)
+		{
+			if (last_saved_restart_lsn != InvalidXLogRecPtr &&
+				restart_lsn > last_saved_restart_lsn)
+			{
+				restart_lsn = last_saved_restart_lsn;
+			}
+		}
+
 		if (restart_lsn != InvalidXLogRecPtr &&
 			(min_required == InvalidXLogRecPtr ||
 			 restart_lsn < min_required))
@@ -1216,7 +1238,9 @@ ReplicationSlotsComputeLogicalRestartLSN(void)
 	{
 		ReplicationSlot *s;
 		XLogRecPtr	restart_lsn;
+		XLogRecPtr	last_saved_restart_lsn;
 		bool		invalidated;
+		ReplicationSlotPersistency persistency;
 
 		s = &ReplicationSlotCtl->replication_slots[i];
 
@@ -1230,14 +1254,33 @@ ReplicationSlotsComputeLogicalRestartLSN(void)
 
 		/* read once, it's ok if it increases while we're checking */
 		SpinLockAcquire(&s->mutex);
+		persistency = s->data.persistency;
 		restart_lsn = s->data.restart_lsn;
 		invalidated = s->data.invalidated != RS_INVAL_NONE;
+		last_saved_restart_lsn = s->last_saved_restart_lsn;
 		SpinLockRelease(&s->mutex);
 
 		/* invalidated slots need not apply */
 		if (invalidated)
 			continue;
 
+		/*
+		 * For persistent slot use last_saved_restart_lsn to compute the
+		 * oldest LSN for removal of WAL segments.  The segments between
+		 * last_saved_restart_lsn and restart_lsn might be needed by a
+		 * persistent slot in the case of database crash.  Non-persistent
+		 * slots can't survive the database crash, so we don't care about
+		 * last_saved_restart_lsn for them.
+		 */
+		if (persistency == RS_PERSISTENT)
+		{
+			if (last_saved_restart_lsn != InvalidXLogRecPtr &&
+				restart_lsn > last_saved_restart_lsn)
+			{
+				restart_lsn = last_saved_restart_lsn;
+			}
+		}
+
 		if (restart_lsn == InvalidXLogRecPtr)
 			continue;
 
@@ -1455,6 +1498,7 @@ ReplicationSlotReserveWal(void)
 
 	Assert(slot != NULL);
 	Assert(slot->data.restart_lsn == InvalidXLogRecPtr);
+	Assert(slot->last_saved_restart_lsn == InvalidXLogRecPtr);
 
 	/*
 	 * The replication slot mechanism is used to prevent removal of required
@@ -1766,6 +1810,8 @@ InvalidatePossiblyObsoleteSlot(uint32 possible_causes,
 		 */
 		SpinLockAcquire(&s->mutex);
 
+		Assert(s->data.restart_lsn >= s->last_saved_restart_lsn);
+
 		restart_lsn = s->data.restart_lsn;
 
 		/* we do nothing if the slot is already invalid */
@@ -1835,7 +1881,10 @@ InvalidatePossiblyObsoleteSlot(uint32 possible_causes,
 			 * just rely on .invalidated.
 			 */
 			if (invalidation_cause == RS_INVAL_WAL_REMOVED)
+			{
 				s->data.restart_lsn = InvalidXLogRecPtr;
+				s->last_saved_restart_lsn = InvalidXLogRecPtr;
+			}
 
 			/* Let caller know */
 			*invalidated = true;
@@ -2079,6 +2128,12 @@ CheckPointReplicationSlots(bool is_shutdown)
 		SaveSlotToPath(s, path, LOG);
 	}
 	LWLockRelease(ReplicationSlotAllocationLock);
+
+	/*
+	 * Recompute the required LSN as SaveSlotToPath() updated
+	 * last_saved_restart_lsn for slots.
+	 */
+	ReplicationSlotsComputeRequiredLSN();
 }
 
 /*
@@ -2354,6 +2409,7 @@ SaveSlotToPath(ReplicationSlot *slot, const char *dir, int elevel)
 	if (!slot->just_dirtied)
 		slot->dirty = false;
 	slot->last_saved_confirmed_flush = cp.slotdata.confirmed_flush;
+	slot->last_saved_restart_lsn = cp.slotdata.restart_lsn;
 	SpinLockRelease(&slot->mutex);
 
 	LWLockRelease(&slot->io_in_progress_lock);
@@ -2569,6 +2625,7 @@ RestoreSlotFromDisk(const char *name)
 		slot->effective_xmin = cp.slotdata.xmin;
 		slot->effective_catalog_xmin = cp.slotdata.catalog_xmin;
 		slot->last_saved_confirmed_flush = cp.slotdata.confirmed_flush;
+		slot->last_saved_restart_lsn = cp.slotdata.restart_lsn;
 
 		slot->candidate_catalog_xmin = InvalidTransactionId;
 		slot->candidate_xmin_lsn = InvalidXLogRecPtr;
diff --git a/src/include/replication/slot.h b/src/include/replication/slot.h
index eb0b93b1114..e6fa9a4b5ab 100644
--- a/src/include/replication/slot.h
+++ b/src/include/replication/slot.h
@@ -215,6 +215,13 @@ typedef struct ReplicationSlot
 	 * recently stopped.
 	 */
 	TimestampTz inactive_since;
+
+	/* Latest restart_lsn that has been flushed to disk. For persistent slots
+	 * the flushed LSN should be taken into account when calculating the oldest
+	 * LSN for WAL segments removal.
+	 */
+	XLogRecPtr last_saved_restart_lsn;
+
 } ReplicationSlot;
 
 #define SlotIsPhysical(slot) ((slot)->data.database == InvalidOid)
-- 
2.39.5 (Apple Git-154)

v2-0002-Add-TAP-tests-to-check-replication-slot-advance-d.patchapplication/octet-stream; name=v2-0002-Add-TAP-tests-to-check-replication-slot-advance-d.patchDownload
From 5aa06332d2cccae44e25583638796742346dd462 Mon Sep 17 00:00:00 2001
From: Alexander Korotkov <akorotkov@postgresql.org>
Date: Sat, 24 May 2025 13:26:28 +0300
Subject: [PATCH v2 2/2] Add TAP tests to check replication slot advance during
 the checkpoint

The new tests verify that logical and physical replication slots are still
valid after an immediate restart on checkpoint completion when the slot was
advanced during the checkpoint.

This commit introduces two new injection points to make these tests possible:

* checkpoint-before-old-wal-removal - triggered in the checkpointer process
  just before old WAL segments cleanup;
* logical-replication-slot-advance-segment - triggered in
  LogicalConfirmReceivedLocation() when restart_lsn was changed enough to
  point to the next WAL segment.

Discussion: https://postgr.es/m/flat/1d12d2-67235980-35-19a406a0%4063439497
Author: Vitaly Davydov <v.davydov@postgrespro.ru>
Author: Tomas Vondra <tomas@vondra.me>
Reviewed-by: Alexander Korotkov <aekorotkov@gmail.com>
Backpatch-through: 17
---
 src/backend/access/transam/xlog.c             |   4 +
 src/backend/replication/logical/logical.c     |  18 +++
 src/test/recovery/meson.build                 |   2 +
 .../recovery/t/046_checkpoint_logical_slot.pl | 139 ++++++++++++++++++
 .../t/047_checkpoint_physical_slot.pl         | 133 +++++++++++++++++
 5 files changed, 296 insertions(+)
 create mode 100644 src/test/recovery/t/046_checkpoint_logical_slot.pl
 create mode 100644 src/test/recovery/t/047_checkpoint_physical_slot.pl

diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index 1914859b2ee..47ffc0a2307 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -7498,6 +7498,10 @@ CreateCheckPoint(int flags)
 	if (PriorRedoPtr != InvalidXLogRecPtr)
 		UpdateCheckPointDistanceEstimate(RedoRecPtr - PriorRedoPtr);
 
+#ifdef USE_INJECTION_POINTS
+	INJECTION_POINT("checkpoint-before-old-wal-removal", NULL);
+#endif
+
 	/*
 	 * Delete old log files, those no longer needed for last checkpoint to
 	 * prevent the disk holding the xlog from growing full.
diff --git a/src/backend/replication/logical/logical.c b/src/backend/replication/logical/logical.c
index 1d56d0c4ef3..f1eb798f3e9 100644
--- a/src/backend/replication/logical/logical.c
+++ b/src/backend/replication/logical/logical.c
@@ -29,6 +29,7 @@
 #include "postgres.h"
 
 #include "access/xact.h"
+#include "access/xlog_internal.h"
 #include "access/xlogutils.h"
 #include "fmgr.h"
 #include "miscadmin.h"
@@ -41,6 +42,7 @@
 #include "storage/proc.h"
 #include "storage/procarray.h"
 #include "utils/builtins.h"
+#include "utils/injection_point.h"
 #include "utils/inval.h"
 #include "utils/memutils.h"
 
@@ -1825,9 +1827,13 @@ LogicalConfirmReceivedLocation(XLogRecPtr lsn)
 	{
 		bool		updated_xmin = false;
 		bool		updated_restart = false;
+		XLogRecPtr	restart_lsn pg_attribute_unused();
 
 		SpinLockAcquire(&MyReplicationSlot->mutex);
 
+		/* remember the old restart lsn */
+		restart_lsn = MyReplicationSlot->data.restart_lsn;
+
 		/*
 		 * Prevent moving the confirmed_flush backwards, as this could lead to
 		 * data duplication issues caused by replicating already replicated
@@ -1881,6 +1887,18 @@ LogicalConfirmReceivedLocation(XLogRecPtr lsn)
 		/* first write new xmin to disk, so we know what's up after a crash */
 		if (updated_xmin || updated_restart)
 		{
+#ifdef USE_INJECTION_POINTS
+			XLogSegNo	seg1,
+						seg2;
+
+			XLByteToSeg(restart_lsn, seg1, wal_segment_size);
+			XLByteToSeg(MyReplicationSlot->data.restart_lsn, seg2, wal_segment_size);
+
+			/* trigger injection point, but only if segment changes */
+			if (seg1 != seg2)
+				INJECTION_POINT("logical-replication-slot-advance-segment", NULL);
+#endif
+
 			ReplicationSlotMarkDirty();
 			ReplicationSlotSave();
 			elog(DEBUG1, "updated xmin: %u restart: %u", updated_xmin, updated_restart);
diff --git a/src/test/recovery/meson.build b/src/test/recovery/meson.build
index cb983766c67..92429d28402 100644
--- a/src/test/recovery/meson.build
+++ b/src/test/recovery/meson.build
@@ -54,6 +54,8 @@ tests += {
       't/043_no_contrecord_switch.pl',
       't/044_invalidate_inactive_slots.pl',
       't/045_archive_restartpoint.pl',
+      't/046_checkpoint_logical_slot.pl',
+      't/047_checkpoint_physical_slot.pl'
     ],
   },
 }
diff --git a/src/test/recovery/t/046_checkpoint_logical_slot.pl b/src/test/recovery/t/046_checkpoint_logical_slot.pl
new file mode 100644
index 00000000000..b4265c4a6a5
--- /dev/null
+++ b/src/test/recovery/t/046_checkpoint_logical_slot.pl
@@ -0,0 +1,139 @@
+# Copyright (c) 2025, PostgreSQL Global Development Group
+#
+# This test verifies the case when the logical slot is advanced during
+# checkpoint. The test checks that the logical slot's restart_lsn still refers
+# to an existed WAL segment after immediate restart.
+#
+use strict;
+use warnings FATAL => 'all';
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+
+use Test::More;
+
+if ($ENV{enable_injection_points} ne 'yes')
+{
+	plan skip_all => 'Injection points not supported by this build';
+}
+
+my ($node, $result);
+
+$node = PostgreSQL::Test::Cluster->new('mike');
+$node->init;
+$node->append_conf('postgresql.conf',
+	"shared_preload_libraries = 'injection_points'");
+$node->append_conf('postgresql.conf', "wal_level = 'logical'");
+$node->start;
+$node->safe_psql('postgres', q(CREATE EXTENSION injection_points));
+
+# Create a simple table to generate data into.
+$node->safe_psql('postgres',
+	q{create table t (id serial primary key, b text)});
+
+# Create the two slots we'll need.
+$node->safe_psql('postgres',
+	q{select pg_create_logical_replication_slot('slot_logical', 'test_decoding')}
+);
+$node->safe_psql('postgres',
+	q{select pg_create_physical_replication_slot('slot_physical', true)});
+
+# Advance both slots to the current position just to have everything "valid".
+$node->safe_psql('postgres',
+	q{select count(*) from pg_logical_slot_get_changes('slot_logical', null, null)}
+);
+$node->safe_psql('postgres',
+	q{select pg_replication_slot_advance('slot_physical', pg_current_wal_lsn())}
+);
+
+# Run checkpoint to flush current state to disk and set a baseline.
+$node->safe_psql('postgres', q{checkpoint});
+
+# Generate some transactions to get RUNNING_XACTS.
+my $xacts = $node->background_psql('postgres');
+$xacts->query_until(
+	qr/run_xacts/,
+	q(\echo run_xacts
+SELECT 1 \watch 0.1
+\q
+));
+
+# Insert 2M rows; that's about 260MB (~20 segments) worth of WAL.
+$node->safe_psql('postgres',
+	q{insert into t (b) select md5(i::text) from generate_series(1,1000000) s(i)}
+);
+
+# Run another checkpoint to set a new restore LSN.
+$node->safe_psql('postgres', q{checkpoint});
+
+# Another 2M rows; that's about 260MB (~20 segments) worth of WAL.
+$node->safe_psql('postgres',
+	q{insert into t (b) select md5(i::text) from generate_series(1,1000000) s(i)}
+);
+
+# Run another checkpoint, this time in the background, and make it wait
+# on the injection point) so that the checkpoint stops right before
+# removing old WAL segments.
+note('starting checkpoint\n');
+
+my $checkpoint = $node->background_psql('postgres');
+$checkpoint->query_safe(
+	q(select injection_points_attach('checkpoint-before-old-wal-removal','wait'))
+);
+$checkpoint->query_until(
+	qr/starting_checkpoint/,
+	q(\echo starting_checkpoint
+checkpoint;
+\q
+));
+
+# Wait until the checkpoint stops right before removing WAL segments.
+note('waiting for injection_point\n');
+$node->wait_for_event('checkpointer', 'checkpoint-before-old-wal-removal');
+note('injection_point is reached');
+
+# Try to advance the logical slot, but make it stop when it moves to the next
+# WAL segment (this has to happen in the background, too).
+my $logical = $node->background_psql('postgres');
+$logical->query_safe(
+	q{select injection_points_attach('logical-replication-slot-advance-segment','wait');}
+);
+$logical->query_until(
+	qr/get_changes/,
+	q(
+\echo get_changes
+select count(*) from pg_logical_slot_get_changes('slot_logical', null, null) \watch 1
+\q
+));
+
+# Wait until the slot's restart_lsn points to the next WAL segment.
+note('waiting for injection_point\n');
+$node->wait_for_event('client backend',
+	'logical-replication-slot-advance-segment');
+note('injection_point is reached');
+
+# OK, we're in the right situation: time to advance the physical slot, which
+# recalculates the required LSN, and then unblock the checkpoint, which
+# removes the WAL still needed by the logical slot.
+$node->safe_psql('postgres',
+	q{select pg_replication_slot_advance('slot_physical', pg_current_wal_lsn())}
+);
+
+# Continue the checkpoint.
+$node->safe_psql('postgres',
+	q{select injection_points_wakeup('checkpoint-before-old-wal-removal')});
+
+# Abruptly stop the server (1 second should be enough for the checkpoint
+# to finish; it would be better).
+$node->stop('immediate');
+
+$node->start;
+
+eval {
+	$node->safe_psql('postgres',
+		q{select count(*) from pg_logical_slot_get_changes('slot_logical', null, null);}
+	);
+};
+is($@, '', "Logical slot still valid");
+
+done_testing();
diff --git a/src/test/recovery/t/047_checkpoint_physical_slot.pl b/src/test/recovery/t/047_checkpoint_physical_slot.pl
new file mode 100644
index 00000000000..454e56b9bd2
--- /dev/null
+++ b/src/test/recovery/t/047_checkpoint_physical_slot.pl
@@ -0,0 +1,133 @@
+# Copyright (c) 2025, PostgreSQL Global Development Group
+#
+# This test verifies the case when the physical slot is advanced during
+# checkpoint. The test checks that the physical slot's restart_lsn still refers
+# to an existed WAL segment after immediate restart.
+#
+use strict;
+use warnings FATAL => 'all';
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+
+use Test::More;
+
+if ($ENV{enable_injection_points} ne 'yes')
+{
+	plan skip_all => 'Injection points not supported by this build';
+}
+
+my ($node, $result);
+
+$node = PostgreSQL::Test::Cluster->new('mike');
+$node->init;
+$node->append_conf('postgresql.conf',
+	"shared_preload_libraries = 'injection_points'");
+$node->append_conf('postgresql.conf', "wal_level = 'replica'");
+$node->start;
+$node->safe_psql('postgres', q(CREATE EXTENSION injection_points));
+
+# Create a simple table to generate data into.
+$node->safe_psql('postgres',
+	q{create table t (id serial primary key, b text)});
+
+# Create a physical replication slot.
+$node->safe_psql('postgres',
+	q{select pg_create_physical_replication_slot('slot_physical', true)});
+
+# Advance slot to the current position, just to have everything "valid".
+$node->safe_psql('postgres',
+	q{select pg_replication_slot_advance('slot_physical', pg_current_wal_lsn())}
+);
+
+# Run checkpoint to flush current state to disk and set a baseline.
+$node->safe_psql('postgres', q{checkpoint});
+
+# Insert 2M rows; that's about 260MB (~20 segments) worth of WAL.
+$node->safe_psql('postgres',
+	q{insert into t (b) select md5(i::text) from generate_series(1,100000) s(i)}
+);
+
+# Advance slot to the current position, just to have everything "valid".
+$node->safe_psql('postgres',
+	q{select pg_replication_slot_advance('slot_physical', pg_current_wal_lsn())}
+);
+
+# Run another checkpoint to set a new restore LSN.
+$node->safe_psql('postgres', q{checkpoint});
+
+# Another 2M rows; that's about 260MB (~20 segments) worth of WAL.
+$node->safe_psql('postgres',
+	q{insert into t (b) select md5(i::text) from generate_series(1,1000000) s(i)}
+);
+
+my $restart_lsn_init = $node->safe_psql('postgres',
+	q{select restart_lsn from pg_replication_slots where slot_name = 'slot_physical'}
+);
+chomp($restart_lsn_init);
+note("restart lsn before checkpoint: $restart_lsn_init");
+
+# Run another checkpoint, this time in the background, and make it wait
+# on the injection point) so that the checkpoint stops right before
+# removing old WAL segments.
+note('starting checkpoint');
+
+my $checkpoint = $node->background_psql('postgres');
+$checkpoint->query_safe(
+	q{select injection_points_attach('checkpoint-before-old-wal-removal','wait')}
+);
+$checkpoint->query_until(
+	qr/starting_checkpoint/,
+	q(\echo starting_checkpoint
+checkpoint;
+\q
+));
+
+# Wait until the checkpoint stops right before removing WAL segments.
+note('waiting for injection_point');
+$node->wait_for_event('checkpointer', 'checkpoint-before-old-wal-removal');
+note('injection_point is reached');
+
+# OK, we're in the right situation: time to advance the physical slot, which
+# recalculates the required LSN and then unblock the checkpoint, which
+# removes the WAL still needed by the physical slot.
+$node->safe_psql('postgres',
+	q{select pg_replication_slot_advance('slot_physical', pg_current_wal_lsn())}
+);
+
+# Continue the checkpoint.
+$node->safe_psql('postgres',
+	q{select injection_points_wakeup('checkpoint-before-old-wal-removal')});
+
+my $restart_lsn_old = $node->safe_psql('postgres',
+	q{select restart_lsn from pg_replication_slots where slot_name = 'slot_physical'}
+);
+chomp($restart_lsn_old);
+note("restart lsn before stop: $restart_lsn_old");
+
+# Abruptly stop the server (1 second should be enough for the checkpoint
+# to finish; it would be better).
+$node->stop('immediate');
+
+$node->start;
+
+# Get the restart_lsn of the slot right after restarting.
+my $restart_lsn = $node->safe_psql('postgres',
+	q{select restart_lsn from pg_replication_slots where slot_name = 'slot_physical'}
+);
+chomp($restart_lsn);
+note("restart lsn: $restart_lsn");
+
+# Get the WAL segment name for the slot's restart_lsn.
+my $restart_lsn_segment = $node->safe_psql('postgres',
+	"SELECT pg_walfile_name('$restart_lsn'::pg_lsn)");
+chomp($restart_lsn_segment);
+
+# Check if the required wal segment exists.
+note("required by slot segment name: $restart_lsn_segment");
+my $datadir = $node->data_dir;
+ok( -f "$datadir/pg_wal/$restart_lsn_segment",
+	"WAL segment $restart_lsn_segment for physical slot's restart_lsn $restart_lsn exists"
+);
+
+done_testing();
-- 
2.39.5 (Apple Git-154)

#40Vitaly Davydov
v.davydov@postgrespro.ru
In reply to: Alexander Korotkov (#39)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

Dear Alexander, Amit

Alexander Korotkov wrote:

Also, I've changed ReplicationSlotsComputeRequiredLSN() call to
CheckPointReplicationSlots() to update required LSN after
SaveSlotToPath() updated last_saved_restart_lsn. This helps to pass
checks in 001_stream_rep.pl without additional hacks.

Thank you for the improvement and patch preparation. I confirm the test is
passed without additional hacks now.

I sill do not understand why this solution is favored. It is, in my opinion,
a non backward-compatible solution. In any case, I'm ok to go with this patch.
If needed, I may prepare a backward-compatible solution where
last_saved_restart_lsn values will be in an another place of the shmem, rather
than in ReplicationSlot struct.

I still would like to add my 5 cents to the discussion.

The purpose of the xmin value is to prevent tuples from vacuuming. Slots'
restart_lsn values are used to calculate the oldest lsn to keep WAL segments
from removal in checkpoint. These processes are pretty independent.

The logical slots are advanced in 2 steps. At the first step, the logical
decoding stuff periodically sets consistent candidate values for catalog_xmin and
restart_lsn. At the second step, when LogicalConfirmReceivedLocation is called,
the candidate values are assigned on catalog_xmin and restart_lsn values based
on the confirmed lsn value. The slot is saved with these consistent values.
It is important, that the candidate values are consistent, decoding guarantees
it. In case of a crash, we should guarantee that the loaded from the disk
catalog_xmin and restart_lsn values are consistent and valid for logical slots.
LogicalConfirmReceivedLocation function keeps this consistency by updating them
from consistent candidate values in a single operation.

We have to guarantee that we use saved to disk values to calculate xmin horizon
and slots' oldest lsn. For this purpose, effective_catalog_xmin is used. We
update effective_catalog_xmin in LogicalConfirmReceivedLocation just
after saving slot to disk. Another place where we update effective_catalog_xmin
is when walsender receives hot standby feedback message.

Once, we have two independent processes (vacuuming, checkpoint), we can calculate
xmin horizon and oldest WAL lsn values independently (at different times) from
the saved to disk values. Note, these values are updated in a non atomic way.

The xmin value is set when the node receives hot standby feedback and it is used
to keep tuples from vacuuming as well as catalog_xmin for decoding stuff. Not
sure, xmin is applicable for logical replication.

The confirmed flush lsn is used as a startpoint when a peer node doesn't provide
the start lsn and to check that the start lsn is not older than the latest
confirmed flush lsn. The saving of the slot on disk at each call of
LogicalConfirmReceivedLocation doesn't help to avoid conflicts completely, but
it helps to decrease the probability of conflicts. So, i'm still not sure, we
need to save logical slots on each advance to avoid conflicts, because it
doesn't help in general. The conflicts should be resolved by other means.

Once, we truncate old wal segments in checkpoint only. I believe, it is ok if we
calculate the oldest lsn only at the beginning of the checkpoint, as it was in
the alternative solution. I think, we can update xmin horizon in checkpoint only
but the horizon advancing will be more lazy in this case.

Taking into account these thoughts, I can't see any problems with the alternative
patch where oldest wal lsn is calculated only in checkpoint.

With best regards,
Vitaly

#41Amit Kapila
amit.kapila16@gmail.com
In reply to: Vitaly Davydov (#40)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

On Thu, Jun 5, 2025 at 8:51 PM Vitaly Davydov <v.davydov@postgrespro.ru> wrote:

Dear Alexander, Amit

Alexander Korotkov wrote:

Also, I've changed ReplicationSlotsComputeRequiredLSN() call to
CheckPointReplicationSlots() to update required LSN after
SaveSlotToPath() updated last_saved_restart_lsn. This helps to pass
checks in 001_stream_rep.pl without additional hacks.

Thank you for the improvement and patch preparation. I confirm the test is
passed without additional hacks now.

I sill do not understand why this solution is favored. It is, in my opinion,
a non backward-compatible solution. In any case, I'm ok to go with this patch.
If needed, I may prepare a backward-compatible solution where
last_saved_restart_lsn values will be in an another place of the shmem, rather
than in ReplicationSlot struct.

I think we can use this approach for HEAD and probably keep the
previous idea for backbranches. Keeping some value in shared_memory
per slot sounds risky to me in terms of introducing new bugs.

I still would like to add my 5 cents to the discussion.

The purpose of the xmin value is to prevent tuples from vacuuming. Slots'
restart_lsn values are used to calculate the oldest lsn to keep WAL segments
from removal in checkpoint. These processes are pretty independent.

The logical slots are advanced in 2 steps. At the first step, the logical
decoding stuff periodically sets consistent candidate values for catalog_xmin and
restart_lsn. At the second step, when LogicalConfirmReceivedLocation is called,
the candidate values are assigned on catalog_xmin and restart_lsn values based
on the confirmed lsn value. The slot is saved with these consistent values.
It is important, that the candidate values are consistent, decoding guarantees
it. In case of a crash, we should guarantee that the loaded from the disk
catalog_xmin and restart_lsn values are consistent and valid for logical slots.
LogicalConfirmReceivedLocation function keeps this consistency by updating them
from consistent candidate values in a single operation.

We have to guarantee that we use saved to disk values to calculate xmin horizon
and slots' oldest lsn. For this purpose, effective_catalog_xmin is used. We
update effective_catalog_xmin in LogicalConfirmReceivedLocation just
after saving slot to disk. Another place where we update effective_catalog_xmin
is when walsender receives hot standby feedback message.

Once, we have two independent processes (vacuuming, checkpoint), we can calculate
xmin horizon and oldest WAL lsn values independently (at different times) from
the saved to disk values. Note, these values are updated in a non atomic way.

The xmin value is set when the node receives hot standby feedback and it is used
to keep tuples from vacuuming as well as catalog_xmin for decoding stuff.

Yeah, but with physical slots, it is possible that the slot's xmin
value is pointing to some value, say 700 (after restart), but vacuum
would have removed tuples from transaction IDs greater than 700 as
explained in email [1]/messages/by-id/CAA4eK1KMaPA5jir_SFu+qr3qu55OOdFWVZpuUkqTSGZ9fyPpHA@mail.gmail.com.

Not

sure, xmin is applicable for logical replication.

The confirmed flush lsn is used as a startpoint when a peer node doesn't provide
the start lsn and to check that the start lsn is not older than the latest
confirmed flush lsn. The saving of the slot on disk at each call of
LogicalConfirmReceivedLocation doesn't help to avoid conflicts completely, but
it helps to decrease the probability of conflicts.

We don't save slots at each call of LogicalConfirmReceivedLocation()
and when we save also, it is not to avoid conflicts but to avoid
removing required WAL segments and tuples.

So, i'm still not sure, we

need to save logical slots on each advance to avoid conflicts, because it
doesn't help in general. The conflicts should be resolved by other means.

Once, we truncate old wal segments in checkpoint only. I believe, it is ok if we
calculate the oldest lsn only at the beginning of the checkpoint, as it was in
the alternative solution. I think, we can update xmin horizon in checkpoint only
but the horizon advancing will be more lazy in this case.

Taking into account these thoughts, I can't see any problems with the alternative
patch where oldest wal lsn is calculated only in checkpoint.

The alternative will needlessly prevent removing WAL segments in some
cases when logical slots are in use.

[1]: /messages/by-id/CAA4eK1KMaPA5jir_SFu+qr3qu55OOdFWVZpuUkqTSGZ9fyPpHA@mail.gmail.com

--
With Regards,
Amit Kapila.

#42Amit Kapila
amit.kapila16@gmail.com
In reply to: Alexander Korotkov (#39)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

On Tue, Jun 3, 2025 at 6:51 PM Alexander Korotkov <aekorotkov@gmail.com> wrote:

As per my understanding, for logical slots, effective_xmin is only set
during the initial copy phase (or say if one has to export a
snapshot), after that, its value won't change. Please read the
comments in CreateInitDecodingContext() where we set its value. If you
still have questions about it, we can discuss further.

OK, thank you for the clarification. I've read the comments in
CreateInitDecodingContext() as you suggested. All of above makes me
think *_xmin fields are handled properly.

Yes, they handled properly for logical slots, but there is no similar
safety mechanism for physical slots.

One minor comment:
+
+ /* Latest restart_lsn that has been flushed to disk. For persistent slots
+ * the flushed LSN should be taken into account when calculating the oldest

This doesn't follow our practice for multi-line comments.

--
With Regards,
Amit Kapila.

#43Vitaly Davydov
v.davydov@postgrespro.ru
In reply to: Amit Kapila (#41)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

Hi Amit,

I think we can use this approach for HEAD and probably keep the
previous idea for backbranches. Keeping some value in shared_memory
per slot sounds risky to me in terms of introducing new bugs.

Not sure, what kind of problems may occur. I propose to allocate in shmem an
array of last_saved_restart_lsn like below which is not a part of the public
api (see below). It will be allocated and deallocated in shmem the same way as
ReplicationSlotCtlData. I can prepare a patch, if needed.

typedef struct ReplicationSlotCtlDataExt {
XLogRecPtr last_saved_restart_lsn[1];
} ReplicationSlotCtlDataExt;

Yeah, but with physical slots, it is possible that the slot's xmin
value is pointing to some value, say 700 (after restart), but vacuum
would have removed tuples from transaction IDs greater than 700 as
explained in email [1].

I think, we have no xmin problem for physical slots. The xmin values of
physical slots are used to process HSF messages. If I correctly understood what
you mean, you are telling about the problem which is solved by hot standby
feedback messages. This message is used to disable tuples vacuuming on the
primary to avoid delete conflicts on the replica in queries (some queries may
select some tuples which were vacuumed on the primary and deletions are
replicated to the standby). If the primary receives a HSF message after slot
saving, I believe, it is allowable if autovacuum cleans tuples with xmin later
than the last saved value. If the primary restarts, the older value will be
loaded but the replica already confirmed the newer value. Concerning replica,
it is the obligation of the replica to send such HSF xmin that will survive
replica's immediate restart.

Taking into account these thoughts, I can't see any problems with the alternative
patch where oldest wal lsn is calculated only in checkpoint.

The alternative will needlessly prevent removing WAL segments in some
cases when logical slots are in use.

IMHO, I'm not sure, it will significantly impact the wal removal. We remove WAL
segments only in checkpoint. The alternate solution gets the oldest WAL segment
at the beginning of checkpoint, then saves dirty slots to disk, and removes old
WAL segments at the end of checkpoint using the oldest WAL segment obtained at
the beginning of checkpoint. The alternate solution may not be so effective
in terms of WAL segments removal, if a logical slot is advanced during
checkpoint, but I do not think it is a significant issue. From the other hand,
the alternate solution simplifies the logic of WAL removal, backward compatible
(avoids addition new in-memory states), decreases the number of locks in
ReplicationSlotsComputeRequiredLSN - no need to recalculate oldest slots'
restart lsn every time when a slot is advanced.

With best regards,
Vitaly

#44Alexander Korotkov
aekorotkov@gmail.com
In reply to: Vitaly Davydov (#43)
2 attachment(s)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

On Mon, Jun 9, 2025 at 7:09 PM Vitaly Davydov <v.davydov@postgrespro.ru> wrote:

I think we can use this approach for HEAD and probably keep the
previous idea for backbranches. Keeping some value in shared_memory
per slot sounds risky to me in terms of introducing new bugs.

Not sure, what kind of problems may occur. I propose to allocate in shmem an
array of last_saved_restart_lsn like below which is not a part of the public
api (see below). It will be allocated and deallocated in shmem the same way as
ReplicationSlotCtlData. I can prepare a patch, if needed.

typedef struct ReplicationSlotCtlDataExt {
XLogRecPtr last_saved_restart_lsn[1];
} ReplicationSlotCtlDataExt;

This could work, but I think this is not a solution for HEAD anyway.
In the HEAD, it would be better to keep everything inside the
ReplicationSlot struct. In the same time, I don't like idea to have
different shared memory structs between branches if we can avoid that.

Yeah, but with physical slots, it is possible that the slot's xmin
value is pointing to some value, say 700 (after restart), but vacuum
would have removed tuples from transaction IDs greater than 700 as
explained in email [1].

I think, we have no xmin problem for physical slots. The xmin values of
physical slots are used to process HSF messages. If I correctly understood what
you mean, you are telling about the problem which is solved by hot standby
feedback messages. This message is used to disable tuples vacuuming on the
primary to avoid delete conflicts on the replica in queries (some queries may
select some tuples which were vacuumed on the primary and deletions are
replicated to the standby). If the primary receives a HSF message after slot
saving, I believe, it is allowable if autovacuum cleans tuples with xmin later
than the last saved value. If the primary restarts, the older value will be
loaded but the replica already confirmed the newer value. Concerning replica,
it is the obligation of the replica to send such HSF xmin that will survive
replica's immediate restart.

+1

Taking into account these thoughts, I can't see any problems with the alternative
patch where oldest wal lsn is calculated only in checkpoint.

The alternative will needlessly prevent removing WAL segments in some
cases when logical slots are in use.

IMHO, I'm not sure, it will significantly impact the wal removal. We remove WAL
segments only in checkpoint. The alternate solution gets the oldest WAL segment
at the beginning of checkpoint, then saves dirty slots to disk, and removes old
WAL segments at the end of checkpoint using the oldest WAL segment obtained at
the beginning of checkpoint. The alternate solution may not be so effective
in terms of WAL segments removal, if a logical slot is advanced during
checkpoint, but I do not think it is a significant issue. From the other hand,
the alternate solution simplifies the logic of WAL removal, backward compatible
(avoids addition new in-memory states), decreases the number of locks in
ReplicationSlotsComputeRequiredLSN - no need to recalculate oldest slots'
restart lsn every time when a slot is advanced.

So, my proposal is to commit the attached patchset to the HEAD, and
commit [1] to the back branches. Any objections?

Links.
1. /messages/by-id/CAPpHfdutKQxpm-gJgiZRb2ouKC9+HZx3fG3F00zd=xdxDidm_g@mail.gmail.com

------
Regards,
Alexander Korotkov
Supabase

Attachments:

v3-0001-Keep-WAL-segments-by-slot-s-flushed-restart-LSN.patchapplication/octet-stream; name=v3-0001-Keep-WAL-segments-by-slot-s-flushed-restart-LSN.patchDownload
From 643ad0762e3aec45be5ff233a788a2659a8c0852 Mon Sep 17 00:00:00 2001
From: Alexander Korotkov <akorotkov@postgresql.org>
Date: Tue, 10 Jun 2025 23:05:48 +0300
Subject: [PATCH v3 1/2] Keep WAL segments by slot's flushed restart LSN

The slot data is flushed to the disk at the beginning of checkpoint. If
an existing slot is advanced in the middle of checkpoint execution, its
advanced restart LSN is taken to calculate the oldest LSN for WAL
segments removal at the end of checkpoint. If the node is restarted just
after the checkpoint, the slots data will be read from the disk at
recovery with the oldest restart LSN which can refer to removed WAL
segments.

The patch introduces a new in-memory state for slots -
flushed_restart_lsn which is used to calculate the oldest LSN for WAL
segments removal. This state is updated every time with the current
restart_lsn at the moment, when the slot is saving to disk.

Discussion: https://postgr.es/m/1d12d2-67235980-35-19a406a0%4063439497
Author: Vitaly Davydov <v.davydov@postgrespro.ru>
Author: Alexander Korotkov <aekorotkov@gmail.com>
Reviewed-by: Amit Kapila <amit.kapila16@gmail.com>
---
 src/backend/replication/slot.c | 57 ++++++++++++++++++++++++++++++++++
 src/include/replication/slot.h |  8 +++++
 2 files changed, 65 insertions(+)

diff --git a/src/backend/replication/slot.c b/src/backend/replication/slot.c
index 600b87fa9cb..c64f020742f 100644
--- a/src/backend/replication/slot.c
+++ b/src/backend/replication/slot.c
@@ -424,6 +424,7 @@ ReplicationSlotCreate(const char *name, bool db_specific,
 	slot->candidate_restart_valid = InvalidXLogRecPtr;
 	slot->candidate_restart_lsn = InvalidXLogRecPtr;
 	slot->last_saved_confirmed_flush = InvalidXLogRecPtr;
+	slot->last_saved_restart_lsn = InvalidXLogRecPtr;
 	slot->inactive_since = 0;
 
 	/*
@@ -1165,20 +1166,41 @@ ReplicationSlotsComputeRequiredLSN(void)
 	{
 		ReplicationSlot *s = &ReplicationSlotCtl->replication_slots[i];
 		XLogRecPtr	restart_lsn;
+		XLogRecPtr	last_saved_restart_lsn;
 		bool		invalidated;
+		ReplicationSlotPersistency persistency;
 
 		if (!s->in_use)
 			continue;
 
 		SpinLockAcquire(&s->mutex);
+		persistency = s->data.persistency;
 		restart_lsn = s->data.restart_lsn;
 		invalidated = s->data.invalidated != RS_INVAL_NONE;
+		last_saved_restart_lsn = s->last_saved_restart_lsn;
 		SpinLockRelease(&s->mutex);
 
 		/* invalidated slots need not apply */
 		if (invalidated)
 			continue;
 
+		/*
+		 * For persistent slot use last_saved_restart_lsn to compute the
+		 * oldest LSN for removal of WAL segments.  The segments between
+		 * last_saved_restart_lsn and restart_lsn might be needed by a
+		 * persistent slot in the case of database crash.  Non-persistent
+		 * slots can't survive the database crash, so we don't care about
+		 * last_saved_restart_lsn for them.
+		 */
+		if (persistency == RS_PERSISTENT)
+		{
+			if (last_saved_restart_lsn != InvalidXLogRecPtr &&
+				restart_lsn > last_saved_restart_lsn)
+			{
+				restart_lsn = last_saved_restart_lsn;
+			}
+		}
+
 		if (restart_lsn != InvalidXLogRecPtr &&
 			(min_required == InvalidXLogRecPtr ||
 			 restart_lsn < min_required))
@@ -1216,7 +1238,9 @@ ReplicationSlotsComputeLogicalRestartLSN(void)
 	{
 		ReplicationSlot *s;
 		XLogRecPtr	restart_lsn;
+		XLogRecPtr	last_saved_restart_lsn;
 		bool		invalidated;
+		ReplicationSlotPersistency persistency;
 
 		s = &ReplicationSlotCtl->replication_slots[i];
 
@@ -1230,14 +1254,33 @@ ReplicationSlotsComputeLogicalRestartLSN(void)
 
 		/* read once, it's ok if it increases while we're checking */
 		SpinLockAcquire(&s->mutex);
+		persistency = s->data.persistency;
 		restart_lsn = s->data.restart_lsn;
 		invalidated = s->data.invalidated != RS_INVAL_NONE;
+		last_saved_restart_lsn = s->last_saved_restart_lsn;
 		SpinLockRelease(&s->mutex);
 
 		/* invalidated slots need not apply */
 		if (invalidated)
 			continue;
 
+		/*
+		 * For persistent slot use last_saved_restart_lsn to compute the
+		 * oldest LSN for removal of WAL segments.  The segments between
+		 * last_saved_restart_lsn and restart_lsn might be needed by a
+		 * persistent slot in the case of database crash.  Non-persistent
+		 * slots can't survive the database crash, so we don't care about
+		 * last_saved_restart_lsn for them.
+		 */
+		if (persistency == RS_PERSISTENT)
+		{
+			if (last_saved_restart_lsn != InvalidXLogRecPtr &&
+				restart_lsn > last_saved_restart_lsn)
+			{
+				restart_lsn = last_saved_restart_lsn;
+			}
+		}
+
 		if (restart_lsn == InvalidXLogRecPtr)
 			continue;
 
@@ -1455,6 +1498,7 @@ ReplicationSlotReserveWal(void)
 
 	Assert(slot != NULL);
 	Assert(slot->data.restart_lsn == InvalidXLogRecPtr);
+	Assert(slot->last_saved_restart_lsn == InvalidXLogRecPtr);
 
 	/*
 	 * The replication slot mechanism is used to prevent removal of required
@@ -1766,6 +1810,8 @@ InvalidatePossiblyObsoleteSlot(uint32 possible_causes,
 		 */
 		SpinLockAcquire(&s->mutex);
 
+		Assert(s->data.restart_lsn >= s->last_saved_restart_lsn);
+
 		restart_lsn = s->data.restart_lsn;
 
 		/* we do nothing if the slot is already invalid */
@@ -1835,7 +1881,10 @@ InvalidatePossiblyObsoleteSlot(uint32 possible_causes,
 			 * just rely on .invalidated.
 			 */
 			if (invalidation_cause == RS_INVAL_WAL_REMOVED)
+			{
 				s->data.restart_lsn = InvalidXLogRecPtr;
+				s->last_saved_restart_lsn = InvalidXLogRecPtr;
+			}
 
 			/* Let caller know */
 			*invalidated = true;
@@ -2079,6 +2128,12 @@ CheckPointReplicationSlots(bool is_shutdown)
 		SaveSlotToPath(s, path, LOG);
 	}
 	LWLockRelease(ReplicationSlotAllocationLock);
+
+	/*
+	 * Recompute the required LSN as SaveSlotToPath() updated
+	 * last_saved_restart_lsn for slots.
+	 */
+	ReplicationSlotsComputeRequiredLSN();
 }
 
 /*
@@ -2354,6 +2409,7 @@ SaveSlotToPath(ReplicationSlot *slot, const char *dir, int elevel)
 	if (!slot->just_dirtied)
 		slot->dirty = false;
 	slot->last_saved_confirmed_flush = cp.slotdata.confirmed_flush;
+	slot->last_saved_restart_lsn = cp.slotdata.restart_lsn;
 	SpinLockRelease(&slot->mutex);
 
 	LWLockRelease(&slot->io_in_progress_lock);
@@ -2569,6 +2625,7 @@ RestoreSlotFromDisk(const char *name)
 		slot->effective_xmin = cp.slotdata.xmin;
 		slot->effective_catalog_xmin = cp.slotdata.catalog_xmin;
 		slot->last_saved_confirmed_flush = cp.slotdata.confirmed_flush;
+		slot->last_saved_restart_lsn = cp.slotdata.restart_lsn;
 
 		slot->candidate_catalog_xmin = InvalidTransactionId;
 		slot->candidate_xmin_lsn = InvalidXLogRecPtr;
diff --git a/src/include/replication/slot.h b/src/include/replication/slot.h
index eb0b93b1114..ffacba9d2ae 100644
--- a/src/include/replication/slot.h
+++ b/src/include/replication/slot.h
@@ -215,6 +215,14 @@ typedef struct ReplicationSlot
 	 * recently stopped.
 	 */
 	TimestampTz inactive_since;
+
+	/*
+	 * Latest restart_lsn that has been flushed to disk. For persistent slots
+	 * the flushed LSN should be taken into account when calculating the
+	 * oldest LSN for WAL segments removal.
+	 */
+	XLogRecPtr	last_saved_restart_lsn;
+
 } ReplicationSlot;
 
 #define SlotIsPhysical(slot) ((slot)->data.database == InvalidOid)
-- 
2.39.5 (Apple Git-154)

v3-0002-Add-TAP-tests-to-check-replication-slot-advance-d.patchapplication/octet-stream; name=v3-0002-Add-TAP-tests-to-check-replication-slot-advance-d.patchDownload
From dfb7510590a9c17295e0026ec076ba02b5f5ead3 Mon Sep 17 00:00:00 2001
From: Alexander Korotkov <akorotkov@postgresql.org>
Date: Sat, 24 May 2025 13:26:28 +0300
Subject: [PATCH v3 2/2] Add TAP tests to check replication slot advance during
 the checkpoint

The new tests verify that logical and physical replication slots are still
valid after an immediate restart on checkpoint completion when the slot was
advanced during the checkpoint.

This commit introduces two new injection points to make these tests possible:

* checkpoint-before-old-wal-removal - triggered in the checkpointer process
  just before old WAL segments cleanup;
* logical-replication-slot-advance-segment - triggered in
  LogicalConfirmReceivedLocation() when restart_lsn was changed enough to
  point to the next WAL segment.

Discussion: https://postgr.es/m/flat/1d12d2-67235980-35-19a406a0%4063439497
Author: Vitaly Davydov <v.davydov@postgrespro.ru>
Author: Tomas Vondra <tomas@vondra.me>
Reviewed-by: Alexander Korotkov <aekorotkov@gmail.com>
Backpatch-through: 17
---
 src/backend/access/transam/xlog.c             |   4 +
 src/backend/replication/logical/logical.c     |  18 +++
 src/test/recovery/meson.build                 |   2 +
 .../recovery/t/046_checkpoint_logical_slot.pl | 139 ++++++++++++++++++
 .../t/047_checkpoint_physical_slot.pl         | 133 +++++++++++++++++
 5 files changed, 296 insertions(+)
 create mode 100644 src/test/recovery/t/046_checkpoint_logical_slot.pl
 create mode 100644 src/test/recovery/t/047_checkpoint_physical_slot.pl

diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index 1914859b2ee..47ffc0a2307 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -7498,6 +7498,10 @@ CreateCheckPoint(int flags)
 	if (PriorRedoPtr != InvalidXLogRecPtr)
 		UpdateCheckPointDistanceEstimate(RedoRecPtr - PriorRedoPtr);
 
+#ifdef USE_INJECTION_POINTS
+	INJECTION_POINT("checkpoint-before-old-wal-removal", NULL);
+#endif
+
 	/*
 	 * Delete old log files, those no longer needed for last checkpoint to
 	 * prevent the disk holding the xlog from growing full.
diff --git a/src/backend/replication/logical/logical.c b/src/backend/replication/logical/logical.c
index 1d56d0c4ef3..f1eb798f3e9 100644
--- a/src/backend/replication/logical/logical.c
+++ b/src/backend/replication/logical/logical.c
@@ -29,6 +29,7 @@
 #include "postgres.h"
 
 #include "access/xact.h"
+#include "access/xlog_internal.h"
 #include "access/xlogutils.h"
 #include "fmgr.h"
 #include "miscadmin.h"
@@ -41,6 +42,7 @@
 #include "storage/proc.h"
 #include "storage/procarray.h"
 #include "utils/builtins.h"
+#include "utils/injection_point.h"
 #include "utils/inval.h"
 #include "utils/memutils.h"
 
@@ -1825,9 +1827,13 @@ LogicalConfirmReceivedLocation(XLogRecPtr lsn)
 	{
 		bool		updated_xmin = false;
 		bool		updated_restart = false;
+		XLogRecPtr	restart_lsn pg_attribute_unused();
 
 		SpinLockAcquire(&MyReplicationSlot->mutex);
 
+		/* remember the old restart lsn */
+		restart_lsn = MyReplicationSlot->data.restart_lsn;
+
 		/*
 		 * Prevent moving the confirmed_flush backwards, as this could lead to
 		 * data duplication issues caused by replicating already replicated
@@ -1881,6 +1887,18 @@ LogicalConfirmReceivedLocation(XLogRecPtr lsn)
 		/* first write new xmin to disk, so we know what's up after a crash */
 		if (updated_xmin || updated_restart)
 		{
+#ifdef USE_INJECTION_POINTS
+			XLogSegNo	seg1,
+						seg2;
+
+			XLByteToSeg(restart_lsn, seg1, wal_segment_size);
+			XLByteToSeg(MyReplicationSlot->data.restart_lsn, seg2, wal_segment_size);
+
+			/* trigger injection point, but only if segment changes */
+			if (seg1 != seg2)
+				INJECTION_POINT("logical-replication-slot-advance-segment", NULL);
+#endif
+
 			ReplicationSlotMarkDirty();
 			ReplicationSlotSave();
 			elog(DEBUG1, "updated xmin: %u restart: %u", updated_xmin, updated_restart);
diff --git a/src/test/recovery/meson.build b/src/test/recovery/meson.build
index cb983766c67..92429d28402 100644
--- a/src/test/recovery/meson.build
+++ b/src/test/recovery/meson.build
@@ -54,6 +54,8 @@ tests += {
       't/043_no_contrecord_switch.pl',
       't/044_invalidate_inactive_slots.pl',
       't/045_archive_restartpoint.pl',
+      't/046_checkpoint_logical_slot.pl',
+      't/047_checkpoint_physical_slot.pl'
     ],
   },
 }
diff --git a/src/test/recovery/t/046_checkpoint_logical_slot.pl b/src/test/recovery/t/046_checkpoint_logical_slot.pl
new file mode 100644
index 00000000000..b4265c4a6a5
--- /dev/null
+++ b/src/test/recovery/t/046_checkpoint_logical_slot.pl
@@ -0,0 +1,139 @@
+# Copyright (c) 2025, PostgreSQL Global Development Group
+#
+# This test verifies the case when the logical slot is advanced during
+# checkpoint. The test checks that the logical slot's restart_lsn still refers
+# to an existed WAL segment after immediate restart.
+#
+use strict;
+use warnings FATAL => 'all';
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+
+use Test::More;
+
+if ($ENV{enable_injection_points} ne 'yes')
+{
+	plan skip_all => 'Injection points not supported by this build';
+}
+
+my ($node, $result);
+
+$node = PostgreSQL::Test::Cluster->new('mike');
+$node->init;
+$node->append_conf('postgresql.conf',
+	"shared_preload_libraries = 'injection_points'");
+$node->append_conf('postgresql.conf', "wal_level = 'logical'");
+$node->start;
+$node->safe_psql('postgres', q(CREATE EXTENSION injection_points));
+
+# Create a simple table to generate data into.
+$node->safe_psql('postgres',
+	q{create table t (id serial primary key, b text)});
+
+# Create the two slots we'll need.
+$node->safe_psql('postgres',
+	q{select pg_create_logical_replication_slot('slot_logical', 'test_decoding')}
+);
+$node->safe_psql('postgres',
+	q{select pg_create_physical_replication_slot('slot_physical', true)});
+
+# Advance both slots to the current position just to have everything "valid".
+$node->safe_psql('postgres',
+	q{select count(*) from pg_logical_slot_get_changes('slot_logical', null, null)}
+);
+$node->safe_psql('postgres',
+	q{select pg_replication_slot_advance('slot_physical', pg_current_wal_lsn())}
+);
+
+# Run checkpoint to flush current state to disk and set a baseline.
+$node->safe_psql('postgres', q{checkpoint});
+
+# Generate some transactions to get RUNNING_XACTS.
+my $xacts = $node->background_psql('postgres');
+$xacts->query_until(
+	qr/run_xacts/,
+	q(\echo run_xacts
+SELECT 1 \watch 0.1
+\q
+));
+
+# Insert 2M rows; that's about 260MB (~20 segments) worth of WAL.
+$node->safe_psql('postgres',
+	q{insert into t (b) select md5(i::text) from generate_series(1,1000000) s(i)}
+);
+
+# Run another checkpoint to set a new restore LSN.
+$node->safe_psql('postgres', q{checkpoint});
+
+# Another 2M rows; that's about 260MB (~20 segments) worth of WAL.
+$node->safe_psql('postgres',
+	q{insert into t (b) select md5(i::text) from generate_series(1,1000000) s(i)}
+);
+
+# Run another checkpoint, this time in the background, and make it wait
+# on the injection point) so that the checkpoint stops right before
+# removing old WAL segments.
+note('starting checkpoint\n');
+
+my $checkpoint = $node->background_psql('postgres');
+$checkpoint->query_safe(
+	q(select injection_points_attach('checkpoint-before-old-wal-removal','wait'))
+);
+$checkpoint->query_until(
+	qr/starting_checkpoint/,
+	q(\echo starting_checkpoint
+checkpoint;
+\q
+));
+
+# Wait until the checkpoint stops right before removing WAL segments.
+note('waiting for injection_point\n');
+$node->wait_for_event('checkpointer', 'checkpoint-before-old-wal-removal');
+note('injection_point is reached');
+
+# Try to advance the logical slot, but make it stop when it moves to the next
+# WAL segment (this has to happen in the background, too).
+my $logical = $node->background_psql('postgres');
+$logical->query_safe(
+	q{select injection_points_attach('logical-replication-slot-advance-segment','wait');}
+);
+$logical->query_until(
+	qr/get_changes/,
+	q(
+\echo get_changes
+select count(*) from pg_logical_slot_get_changes('slot_logical', null, null) \watch 1
+\q
+));
+
+# Wait until the slot's restart_lsn points to the next WAL segment.
+note('waiting for injection_point\n');
+$node->wait_for_event('client backend',
+	'logical-replication-slot-advance-segment');
+note('injection_point is reached');
+
+# OK, we're in the right situation: time to advance the physical slot, which
+# recalculates the required LSN, and then unblock the checkpoint, which
+# removes the WAL still needed by the logical slot.
+$node->safe_psql('postgres',
+	q{select pg_replication_slot_advance('slot_physical', pg_current_wal_lsn())}
+);
+
+# Continue the checkpoint.
+$node->safe_psql('postgres',
+	q{select injection_points_wakeup('checkpoint-before-old-wal-removal')});
+
+# Abruptly stop the server (1 second should be enough for the checkpoint
+# to finish; it would be better).
+$node->stop('immediate');
+
+$node->start;
+
+eval {
+	$node->safe_psql('postgres',
+		q{select count(*) from pg_logical_slot_get_changes('slot_logical', null, null);}
+	);
+};
+is($@, '', "Logical slot still valid");
+
+done_testing();
diff --git a/src/test/recovery/t/047_checkpoint_physical_slot.pl b/src/test/recovery/t/047_checkpoint_physical_slot.pl
new file mode 100644
index 00000000000..454e56b9bd2
--- /dev/null
+++ b/src/test/recovery/t/047_checkpoint_physical_slot.pl
@@ -0,0 +1,133 @@
+# Copyright (c) 2025, PostgreSQL Global Development Group
+#
+# This test verifies the case when the physical slot is advanced during
+# checkpoint. The test checks that the physical slot's restart_lsn still refers
+# to an existed WAL segment after immediate restart.
+#
+use strict;
+use warnings FATAL => 'all';
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+
+use Test::More;
+
+if ($ENV{enable_injection_points} ne 'yes')
+{
+	plan skip_all => 'Injection points not supported by this build';
+}
+
+my ($node, $result);
+
+$node = PostgreSQL::Test::Cluster->new('mike');
+$node->init;
+$node->append_conf('postgresql.conf',
+	"shared_preload_libraries = 'injection_points'");
+$node->append_conf('postgresql.conf', "wal_level = 'replica'");
+$node->start;
+$node->safe_psql('postgres', q(CREATE EXTENSION injection_points));
+
+# Create a simple table to generate data into.
+$node->safe_psql('postgres',
+	q{create table t (id serial primary key, b text)});
+
+# Create a physical replication slot.
+$node->safe_psql('postgres',
+	q{select pg_create_physical_replication_slot('slot_physical', true)});
+
+# Advance slot to the current position, just to have everything "valid".
+$node->safe_psql('postgres',
+	q{select pg_replication_slot_advance('slot_physical', pg_current_wal_lsn())}
+);
+
+# Run checkpoint to flush current state to disk and set a baseline.
+$node->safe_psql('postgres', q{checkpoint});
+
+# Insert 2M rows; that's about 260MB (~20 segments) worth of WAL.
+$node->safe_psql('postgres',
+	q{insert into t (b) select md5(i::text) from generate_series(1,100000) s(i)}
+);
+
+# Advance slot to the current position, just to have everything "valid".
+$node->safe_psql('postgres',
+	q{select pg_replication_slot_advance('slot_physical', pg_current_wal_lsn())}
+);
+
+# Run another checkpoint to set a new restore LSN.
+$node->safe_psql('postgres', q{checkpoint});
+
+# Another 2M rows; that's about 260MB (~20 segments) worth of WAL.
+$node->safe_psql('postgres',
+	q{insert into t (b) select md5(i::text) from generate_series(1,1000000) s(i)}
+);
+
+my $restart_lsn_init = $node->safe_psql('postgres',
+	q{select restart_lsn from pg_replication_slots where slot_name = 'slot_physical'}
+);
+chomp($restart_lsn_init);
+note("restart lsn before checkpoint: $restart_lsn_init");
+
+# Run another checkpoint, this time in the background, and make it wait
+# on the injection point) so that the checkpoint stops right before
+# removing old WAL segments.
+note('starting checkpoint');
+
+my $checkpoint = $node->background_psql('postgres');
+$checkpoint->query_safe(
+	q{select injection_points_attach('checkpoint-before-old-wal-removal','wait')}
+);
+$checkpoint->query_until(
+	qr/starting_checkpoint/,
+	q(\echo starting_checkpoint
+checkpoint;
+\q
+));
+
+# Wait until the checkpoint stops right before removing WAL segments.
+note('waiting for injection_point');
+$node->wait_for_event('checkpointer', 'checkpoint-before-old-wal-removal');
+note('injection_point is reached');
+
+# OK, we're in the right situation: time to advance the physical slot, which
+# recalculates the required LSN and then unblock the checkpoint, which
+# removes the WAL still needed by the physical slot.
+$node->safe_psql('postgres',
+	q{select pg_replication_slot_advance('slot_physical', pg_current_wal_lsn())}
+);
+
+# Continue the checkpoint.
+$node->safe_psql('postgres',
+	q{select injection_points_wakeup('checkpoint-before-old-wal-removal')});
+
+my $restart_lsn_old = $node->safe_psql('postgres',
+	q{select restart_lsn from pg_replication_slots where slot_name = 'slot_physical'}
+);
+chomp($restart_lsn_old);
+note("restart lsn before stop: $restart_lsn_old");
+
+# Abruptly stop the server (1 second should be enough for the checkpoint
+# to finish; it would be better).
+$node->stop('immediate');
+
+$node->start;
+
+# Get the restart_lsn of the slot right after restarting.
+my $restart_lsn = $node->safe_psql('postgres',
+	q{select restart_lsn from pg_replication_slots where slot_name = 'slot_physical'}
+);
+chomp($restart_lsn);
+note("restart lsn: $restart_lsn");
+
+# Get the WAL segment name for the slot's restart_lsn.
+my $restart_lsn_segment = $node->safe_psql('postgres',
+	"SELECT pg_walfile_name('$restart_lsn'::pg_lsn)");
+chomp($restart_lsn_segment);
+
+# Check if the required wal segment exists.
+note("required by slot segment name: $restart_lsn_segment");
+my $datadir = $node->data_dir;
+ok( -f "$datadir/pg_wal/$restart_lsn_segment",
+	"WAL segment $restart_lsn_segment for physical slot's restart_lsn $restart_lsn exists"
+);
+
+done_testing();
-- 
2.39.5 (Apple Git-154)

#45Amit Kapila
amit.kapila16@gmail.com
In reply to: Alexander Korotkov (#44)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

On Wed, Jun 11, 2025 at 1:44 AM Alexander Korotkov <aekorotkov@gmail.com> wrote:

On Mon, Jun 9, 2025 at 7:09 PM Vitaly Davydov <v.davydov@postgrespro.ru> wrote:

I think we can use this approach for HEAD and probably keep the
previous idea for backbranches. Keeping some value in shared_memory
per slot sounds risky to me in terms of introducing new bugs.

Not sure, what kind of problems may occur. I propose to allocate in shmem an
array of last_saved_restart_lsn like below which is not a part of the public
api (see below). It will be allocated and deallocated in shmem the same way as
ReplicationSlotCtlData. I can prepare a patch, if needed.

typedef struct ReplicationSlotCtlDataExt {
XLogRecPtr last_saved_restart_lsn[1];
} ReplicationSlotCtlDataExt;

This could work, but I think this is not a solution for HEAD anyway.
In the HEAD, it would be better to keep everything inside the
ReplicationSlot struct. In the same time, I don't like idea to have
different shared memory structs between branches if we can avoid that.

Yeah, but with physical slots, it is possible that the slot's xmin
value is pointing to some value, say 700 (after restart), but vacuum
would have removed tuples from transaction IDs greater than 700 as
explained in email [1].

I think, we have no xmin problem for physical slots. The xmin values of
physical slots are used to process HSF messages. If I correctly understood what
you mean, you are telling about the problem which is solved by hot standby
feedback messages. This message is used to disable tuples vacuuming on the
primary to avoid delete conflicts on the replica in queries (some queries may
select some tuples which were vacuumed on the primary and deletions are
replicated to the standby). If the primary receives a HSF message after slot
saving, I believe, it is allowable if autovacuum cleans tuples with xmin later
than the last saved value. If the primary restarts, the older value will be
loaded but the replica already confirmed the newer value. Concerning replica,
it is the obligation of the replica to send such HSF xmin that will survive
replica's immediate restart.

+1

The point is about the general principle of slot's xmin values, which
is that the rows with xid greater than slot's xmin should be available
(or can't be removed by vacuum). But here, such a principle could be
violated after a restart. I don't have a test to show what harm it can
cause, but will try to think/investigate more on it.

Taking into account these thoughts, I can't see any problems with the alternative
patch where oldest wal lsn is calculated only in checkpoint.

The alternative will needlessly prevent removing WAL segments in some
cases when logical slots are in use.

IMHO, I'm not sure, it will significantly impact the wal removal. We remove WAL
segments only in checkpoint. The alternate solution gets the oldest WAL segment
at the beginning of checkpoint, then saves dirty slots to disk, and removes old
WAL segments at the end of checkpoint using the oldest WAL segment obtained at
the beginning of checkpoint. The alternate solution may not be so effective
in terms of WAL segments removal, if a logical slot is advanced during
checkpoint, but I do not think it is a significant issue. From the other hand,
the alternate solution simplifies the logic of WAL removal, backward compatible
(avoids addition new in-memory states), decreases the number of locks in
ReplicationSlotsComputeRequiredLSN - no need to recalculate oldest slots'
restart lsn every time when a slot is advanced.

So, my proposal is to commit the attached patchset to the HEAD, and
commit [1] to the back branches. Any objections?

No objections. I think we can keep discussing if slot's xmin
computation has any issues or not, but you can proceed with the LSN
stuff.

--
With Regards,
Amit Kapila.

#46Alexander Lakhin
exclusion@gmail.com
In reply to: Alexander Korotkov (#44)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

Hello Alexander,

10.06.2025 23:14, Alexander Korotkov wrote:

So, my proposal is to commit the attached patchset to the HEAD, and
commit [1] to the back branches. Any objections?

As the buildfarm animal prion shows [1]https://buildfarm.postgresql.org/cgi-bin/show_log.pl?nm=prion&amp;dt=2025-06-14%2001%3A58%3A06, the 046_checkpoint_logical_slot
test fails with "-DRELCACHE_FORCE_RELEASE -DCATCACHE_FORCE_RELEASE":
# poll_query_until timed out executing this query:
#
#         SELECT count(*) > 0 FROM pg_stat_activity
#         WHERE backend_type = 'client backend' AND wait_event = 'logical-replication-slot-advance-segment'
#
# expecting this output:
# t
# last actual query output:
# f
# with stderr:
[04:16:27] t/046_checkpoint_logical_slot.pl ......
Dubious, test returned 29 (wstat 7424, 0x1d00)
No subtests run
[04:20:58] t/047_checkpoint_physical_slot.pl ..... ok   271294 ms ( 0.00 usr  0.00 sys +  0.37 cusr  0.26 csys =  0.63 CPU)

I'm able to reproduce this locally as well. Though the test passes for me
with the increased timeout, that is it's not stuck:
PG_TEST_TIMEOUT_DEFAULT=360 PROVE_TESTS="t/046*" make -s check -C src/test/recovery/
# +++ tap check in src/test/recovery +++
t/046_checkpoint_logical_slot.pl .. ok
All tests successful.
Files=1, Tests=1, 533 wallclock secs ( 0.01 usr  0.00 sys +  4.70 cusr  9.61 csys = 14.32 CPU)
Result: PASS

Could you have a look?

[1]: https://buildfarm.postgresql.org/cgi-bin/show_log.pl?nm=prion&amp;dt=2025-06-14%2001%3A58%3A06

Best regards,
Alexander

#47Alexander Korotkov
aekorotkov@gmail.com
In reply to: Alexander Lakhin (#46)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

Hi, Alexander!

On Sun, Jun 15, 2025 at 12:00 PM Alexander Lakhin <exclusion@gmail.com> wrote:

Hello Alexander,

10.06.2025 23:14, Alexander Korotkov wrote:

So, my proposal is to commit the attached patchset to the HEAD, and
commit [1] to the back branches. Any objections?

As the buildfarm animal prion shows [1], the 046_checkpoint_logical_slot
test fails with "-DRELCACHE_FORCE_RELEASE -DCATCACHE_FORCE_RELEASE":
# poll_query_until timed out executing this query:
#
# SELECT count(*) > 0 FROM pg_stat_activity
# WHERE backend_type = 'client backend' AND wait_event = 'logical-replication-slot-advance-segment'
#
# expecting this output:
# t
# last actual query output:
# f
# with stderr:
[04:16:27] t/046_checkpoint_logical_slot.pl ......
Dubious, test returned 29 (wstat 7424, 0x1d00)
No subtests run
[04:20:58] t/047_checkpoint_physical_slot.pl ..... ok 271294 ms ( 0.00 usr 0.00 sys + 0.37 cusr 0.26 csys = 0.63 CPU)

I'm able to reproduce this locally as well. Though the test passes for me
with the increased timeout, that is it's not stuck:
PG_TEST_TIMEOUT_DEFAULT=360 PROVE_TESTS="t/046*" make -s check -C src/test/recovery/
# +++ tap check in src/test/recovery +++
t/046_checkpoint_logical_slot.pl .. ok
All tests successful.
Files=1, Tests=1, 533 wallclock secs ( 0.01 usr 0.00 sys + 4.70 cusr 9.61 csys = 14.32 CPU)
Result: PASS

Could you have a look?

[1] https://buildfarm.postgresql.org/cgi-bin/show_log.pl?nm=prion&amp;dt=2025-06-14%2001%3A58%3A06

Hmm... It seems to take too long to advance the segment with these
options on. Sure, I'll check this!

------
Regards,
Alexander Korotkov
Supabase

#48Alexander Korotkov
aekorotkov@gmail.com
In reply to: Alexander Lakhin (#46)
1 attachment(s)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

On Sun, Jun 15, 2025 at 12:00 PM Alexander Lakhin <exclusion@gmail.com> wrote:

Hello Alexander,

10.06.2025 23:14, Alexander Korotkov wrote:

So, my proposal is to commit the attached patchset to the HEAD, and
commit [1] to the back branches. Any objections?

As the buildfarm animal prion shows [1], the 046_checkpoint_logical_slot
test fails with "-DRELCACHE_FORCE_RELEASE -DCATCACHE_FORCE_RELEASE":
# poll_query_until timed out executing this query:
#
# SELECT count(*) > 0 FROM pg_stat_activity
# WHERE backend_type = 'client backend' AND wait_event = 'logical-replication-slot-advance-segment'
#
# expecting this output:
# t
# last actual query output:
# f
# with stderr:
[04:16:27] t/046_checkpoint_logical_slot.pl ......
Dubious, test returned 29 (wstat 7424, 0x1d00)
No subtests run
[04:20:58] t/047_checkpoint_physical_slot.pl ..... ok 271294 ms ( 0.00 usr 0.00 sys + 0.37 cusr 0.26 csys = 0.63 CPU)

I'm able to reproduce this locally as well. Though the test passes for me
with the increased timeout, that is it's not stuck:
PG_TEST_TIMEOUT_DEFAULT=360 PROVE_TESTS="t/046*" make -s check -C src/test/recovery/
# +++ tap check in src/test/recovery +++
t/046_checkpoint_logical_slot.pl .. ok
All tests successful.
Files=1, Tests=1, 533 wallclock secs ( 0.01 usr 0.00 sys + 4.70 cusr 9.61 csys = 14.32 CPU)
Result: PASS

Could you have a look?

[1] https://buildfarm.postgresql.org/cgi-bin/show_log.pl?nm=prion&amp;dt=2025-06-14%2001%3A58%3A06

Could you, please, check this patch? On my system it makes 046 and
047 execute in 140 secs with -O0 and -DRELCACHE_FORCE_RELEASE
-DCATCACHE_FORCE_RELEASE.

------
Regards,
Alexander Korotkov
Supabase

Attachments:

v1-0001-Fix-046_checkpoint_-logical-physical-_slot.pl-exe.patchapplication/octet-stream; name=v1-0001-Fix-046_checkpoint_-logical-physical-_slot.pl-exe.patchDownload
From db591b3c0b9ae760395f79df68ca78922108e7f4 Mon Sep 17 00:00:00 2001
From: Alexander Korotkov <akorotkov@postgresql.org>
Date: Sun, 15 Jun 2025 13:54:09 +0300
Subject: [PATCH v1] Fix 046_checkpoint_(logical/physical)_slot.pl execution
 time

Reported-by:
Bug:
Discussion:
Author:
Reviewed-by:
Tested-by:
Backpatch-through:
---
 src/test/recovery/t/046_checkpoint_logical_slot.pl  | 8 ++++----
 src/test/recovery/t/047_checkpoint_physical_slot.pl | 8 ++++----
 2 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/src/test/recovery/t/046_checkpoint_logical_slot.pl b/src/test/recovery/t/046_checkpoint_logical_slot.pl
index b4265c4a6a5..4fe928210dd 100644
--- a/src/test/recovery/t/046_checkpoint_logical_slot.pl
+++ b/src/test/recovery/t/046_checkpoint_logical_slot.pl
@@ -58,17 +58,17 @@ SELECT 1 \watch 0.1
 \q
 ));
 
-# Insert 2M rows; that's about 260MB (~20 segments) worth of WAL.
+# Insert 50K rows; that's about 86MB (~5 segments) worth of WAL.
 $node->safe_psql('postgres',
-	q{insert into t (b) select md5(i::text) from generate_series(1,1000000) s(i)}
+	q{insert into t (b) select repeat(md5(i::text),50) from generate_series(1,50000) s(i)}
 );
 
 # Run another checkpoint to set a new restore LSN.
 $node->safe_psql('postgres', q{checkpoint});
 
-# Another 2M rows; that's about 260MB (~20 segments) worth of WAL.
+# Another 50K rows; that's about 86MB (~5 segments) worth of WAL.
 $node->safe_psql('postgres',
-	q{insert into t (b) select md5(i::text) from generate_series(1,1000000) s(i)}
+	q{insert into t (b) select repeat(md5(i::text),50) from generate_series(1,50000) s(i)}
 );
 
 # Run another checkpoint, this time in the background, and make it wait
diff --git a/src/test/recovery/t/047_checkpoint_physical_slot.pl b/src/test/recovery/t/047_checkpoint_physical_slot.pl
index 454e56b9bd2..3141b256bf3 100644
--- a/src/test/recovery/t/047_checkpoint_physical_slot.pl
+++ b/src/test/recovery/t/047_checkpoint_physical_slot.pl
@@ -43,9 +43,9 @@ $node->safe_psql('postgres',
 # Run checkpoint to flush current state to disk and set a baseline.
 $node->safe_psql('postgres', q{checkpoint});
 
-# Insert 2M rows; that's about 260MB (~20 segments) worth of WAL.
+# Insert 50K rows; that's about 86MB (~5 segments) worth of WAL.
 $node->safe_psql('postgres',
-	q{insert into t (b) select md5(i::text) from generate_series(1,100000) s(i)}
+	q{insert into t (b) select repeat(md5(i::text),50) from generate_series(1,50000) s(i)}
 );
 
 # Advance slot to the current position, just to have everything "valid".
@@ -56,9 +56,9 @@ $node->safe_psql('postgres',
 # Run another checkpoint to set a new restore LSN.
 $node->safe_psql('postgres', q{checkpoint});
 
-# Another 2M rows; that's about 260MB (~20 segments) worth of WAL.
+# Another 50K rows; that's about 86MB (~5 segments) worth of WAL.
 $node->safe_psql('postgres',
-	q{insert into t (b) select md5(i::text) from generate_series(1,1000000) s(i)}
+	q{insert into t (b) select repeat(md5(i::text),50) from generate_series(1,50000) s(i)}
 );
 
 my $restart_lsn_init = $node->safe_psql('postgres',
-- 
2.39.5 (Apple Git-154)

#49Alexander Lakhin
exclusion@gmail.com
In reply to: Alexander Korotkov (#48)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

15.06.2025 14:02, Alexander Korotkov wrote:

Could you, please, check this patch? On my system it makes 046 and
047 execute in 140 secs with -O0 and -DRELCACHE_FORCE_RELEASE
-DCATCACHE_FORCE_RELEASE.

Thank you for the patch!

It decreases the test's duration significantly:
# +++ tap check in src/test/recovery +++
t/046_checkpoint_logical_slot.pl .. ok
All tests successful.
Files=1, Tests=1, 29 wallclock secs ( 0.01 usr  0.00 sys +  0.23 cusr  0.56 csys =  0.80 CPU)

Without the patch:
t/046_checkpoint_logical_slot.pl .. ok
All tests successful.
Files=1, Tests=1, 519 wallclock secs ( 0.01 usr  0.00 sys +  3.05 cusr  7.64 csys = 10.70 CPU)
Result: PASS

Best regards,
Alexander

#50Tom Lane
tgl@sss.pgh.pa.us
In reply to: Alexander Lakhin (#49)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

BTW, while you're cleaning up this commit, could you remove the
excess newlines in some of the "note" commands in 046 and 047, like

note('starting checkpoint\n');

This produces bizarre output, as shown in the buildfarm logs:

[04:04:38.953](603.550s) # starting checkpoint\\n

regards, tom lane

#51Alexander Korotkov
aekorotkov@gmail.com
In reply to: Tom Lane (#50)
1 attachment(s)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

Hi, Tom!

On Sun, Jun 15, 2025 at 7:05 PM Tom Lane <tgl@sss.pgh.pa.us> wrote:

BTW, while you're cleaning up this commit, could you remove the
excess newlines in some of the "note" commands in 046 and 047, like

note('starting checkpoint\n');

This produces bizarre output, as shown in the buildfarm logs:

Thank you for reporting this. The revised patch is attached. In
addition to reducing tests runtime, it removes excess newlines from
some note() calls. The commit message is here. I'm going to push
this if no objections.

------
Regards,
Alexander Korotkov
Supabase

Attachments:

v2-0001-Improve-runtime-and-output-of-tests-for-replicati.patchapplication/octet-stream; name=v2-0001-Improve-runtime-and-output-of-tests-for-replicati.patchDownload
From 5e332ece97a6aefcec569af7e16a4251fc79071c Mon Sep 17 00:00:00 2001
From: Alexander Korotkov <akorotkov@postgresql.org>
Date: Sun, 15 Jun 2025 13:54:09 +0300
Subject: [PATCH v2] Improve runtime and output of tests for replication slots
 checkpointing.

The TAP tests that verify logical and physical replication slot behavior
during checkpoints (046_checkpoint_logical_slot.pl and
047_checkpoint_physical_slot.pl) inserted two batches of 2 million rows each,
generating approximately 520 MB of WAL.  On slow machines, or when compiled
with '-DRELCACHE_FORCE_RELEASE -DCATCACHE_FORCE_RELEASE', this caused the
tests to run for 8-9 minutes and occasionally time out, as seen on the
buildfarm animal prion.

Reduce each INSERT to 50k rows of wider data, which yields approximately
5 segments of WAL.  This volume is still sufficient to advance the slot to
the next segment and exercise the code paths under test, but it cuts
the total wall-clock run time.

While here, remove superfluous '\n' characters from several note() calls;
these appeared literally in the build-farm logs and looked odd.

Reported-by: Alexander Lakhin <exclusion@gmail.com>
Reported-by: Tom Lane <tgl@sss.pgh.pa.us>
Discussion: https://postgr.es/m/fbc5d94e-6fbd-4a64-85d4-c9e284a58eb2%40gmail.com
---
 src/test/recovery/t/046_checkpoint_logical_slot.pl | 14 +++++++-------
 .../recovery/t/047_checkpoint_physical_slot.pl     |  8 ++++----
 2 files changed, 11 insertions(+), 11 deletions(-)

diff --git a/src/test/recovery/t/046_checkpoint_logical_slot.pl b/src/test/recovery/t/046_checkpoint_logical_slot.pl
index b4265c4a6a5..964bc34fbe8 100644
--- a/src/test/recovery/t/046_checkpoint_logical_slot.pl
+++ b/src/test/recovery/t/046_checkpoint_logical_slot.pl
@@ -58,23 +58,23 @@ SELECT 1 \watch 0.1
 \q
 ));
 
-# Insert 2M rows; that's about 260MB (~20 segments) worth of WAL.
+# Insert 50K rows; that's about 86MB (~5 segments) worth of WAL.
 $node->safe_psql('postgres',
-	q{insert into t (b) select md5(i::text) from generate_series(1,1000000) s(i)}
+	q{insert into t (b) select repeat(md5(i::text),50) from generate_series(1,50000) s(i)}
 );
 
 # Run another checkpoint to set a new restore LSN.
 $node->safe_psql('postgres', q{checkpoint});
 
-# Another 2M rows; that's about 260MB (~20 segments) worth of WAL.
+# Another 50K rows; that's about 86MB (~5 segments) worth of WAL.
 $node->safe_psql('postgres',
-	q{insert into t (b) select md5(i::text) from generate_series(1,1000000) s(i)}
+	q{insert into t (b) select repeat(md5(i::text),50) from generate_series(1,50000) s(i)}
 );
 
 # Run another checkpoint, this time in the background, and make it wait
 # on the injection point) so that the checkpoint stops right before
 # removing old WAL segments.
-note('starting checkpoint\n');
+note('starting checkpoint');
 
 my $checkpoint = $node->background_psql('postgres');
 $checkpoint->query_safe(
@@ -88,7 +88,7 @@ checkpoint;
 ));
 
 # Wait until the checkpoint stops right before removing WAL segments.
-note('waiting for injection_point\n');
+note('waiting for injection_point');
 $node->wait_for_event('checkpointer', 'checkpoint-before-old-wal-removal');
 note('injection_point is reached');
 
@@ -107,7 +107,7 @@ select count(*) from pg_logical_slot_get_changes('slot_logical', null, null) \wa
 ));
 
 # Wait until the slot's restart_lsn points to the next WAL segment.
-note('waiting for injection_point\n');
+note('waiting for injection_point');
 $node->wait_for_event('client backend',
 	'logical-replication-slot-advance-segment');
 note('injection_point is reached');
diff --git a/src/test/recovery/t/047_checkpoint_physical_slot.pl b/src/test/recovery/t/047_checkpoint_physical_slot.pl
index 454e56b9bd2..3141b256bf3 100644
--- a/src/test/recovery/t/047_checkpoint_physical_slot.pl
+++ b/src/test/recovery/t/047_checkpoint_physical_slot.pl
@@ -43,9 +43,9 @@ $node->safe_psql('postgres',
 # Run checkpoint to flush current state to disk and set a baseline.
 $node->safe_psql('postgres', q{checkpoint});
 
-# Insert 2M rows; that's about 260MB (~20 segments) worth of WAL.
+# Insert 50K rows; that's about 86MB (~5 segments) worth of WAL.
 $node->safe_psql('postgres',
-	q{insert into t (b) select md5(i::text) from generate_series(1,100000) s(i)}
+	q{insert into t (b) select repeat(md5(i::text),50) from generate_series(1,50000) s(i)}
 );
 
 # Advance slot to the current position, just to have everything "valid".
@@ -56,9 +56,9 @@ $node->safe_psql('postgres',
 # Run another checkpoint to set a new restore LSN.
 $node->safe_psql('postgres', q{checkpoint});
 
-# Another 2M rows; that's about 260MB (~20 segments) worth of WAL.
+# Another 50K rows; that's about 86MB (~5 segments) worth of WAL.
 $node->safe_psql('postgres',
-	q{insert into t (b) select md5(i::text) from generate_series(1,1000000) s(i)}
+	q{insert into t (b) select repeat(md5(i::text),50) from generate_series(1,50000) s(i)}
 );
 
 my $restart_lsn_init = $node->safe_psql('postgres',
-- 
2.39.5 (Apple Git-154)

#52Hayato Kuroda (Fujitsu)
kuroda.hayato@fujitsu.com
In reply to: Alexander Korotkov (#51)
RE: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

Dear Alexander,

Thanks for pushing the fix patch! BTW, I have few comments for your commits.
Can you check and include them if needed?

01.
```
$node->append_conf('postgresql.conf',
"shared_preload_libraries = 'injection_points'");
```

No need to set shared_preload_libraries in 046/047. ISTM it must be set when we
enable the statistics.

02.
We should also check whether the injection_points can be installed or not.
You can check check_extension() and callers.

Best regards,
Hayato Kuroda
FUJITSU LIMITED

#53Alexander Korotkov
aekorotkov@gmail.com
In reply to: Hayato Kuroda (Fujitsu) (#52)
1 attachment(s)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

Dear Kuroda-san,

On Mon, Jun 16, 2025 at 12:11 PM Hayato Kuroda (Fujitsu)
<kuroda.hayato@fujitsu.com> wrote:

Thanks for pushing the fix patch! BTW, I have few comments for your commits.
Can you check and include them if needed?

01.
```
$node->append_conf('postgresql.conf',
"shared_preload_libraries = 'injection_points'");
```

No need to set shared_preload_libraries in 046/047. ISTM it must be set when we
enable the statistics.

02.
We should also check whether the injection_points can be installed or not.
You can check check_extension() and callers.

Thank you! All of these totally make sense. The updated patch is attached.

------
Regards,
Alexander Korotkov
Supabase

Attachments:

v3-0001-Improve-runtime-and-output-of-tests-for-replicati.patchapplication/octet-stream; name=v3-0001-Improve-runtime-and-output-of-tests-for-replicati.patchDownload
From 7b02905e9bad091a269cae3194f4715ed41dffe0 Mon Sep 17 00:00:00 2001
From: Alexander Korotkov <akorotkov@postgresql.org>
Date: Sun, 15 Jun 2025 13:54:09 +0300
Subject: [PATCH v3] Improve runtime and output of tests for replication slots
 checkpointing.

The TAP tests that verify logical and physical replication slot behavior
during checkpoints (046_checkpoint_logical_slot.pl and
047_checkpoint_physical_slot.pl) inserted two batches of 2 million rows each,
generating approximately 520 MB of WAL.  On slow machines, or when compiled
with '-DRELCACHE_FORCE_RELEASE -DCATCACHE_FORCE_RELEASE', this caused the
tests to run for 8-9 minutes and occasionally time out, as seen on the
buildfarm animal prion.

Reduce each INSERT to 50k rows of wider data, which yields approximately
5 segments of WAL.  This volume is still sufficient to advance the slot to
the next segment and exercise the code paths under test, but it cuts
the total wall-clock run time.

While here, remove superfluous '\n' characters from several note() calls;
these appeared literally in the build-farm logs and looked odd.  Also, remove
excessive 'shared_preload_libraries' GUC from the config and add a check for
'injection_points' extension availability.

Reported-by: Alexander Lakhin <exclusion@gmail.com>
Reported-by: Tom Lane <tgl@sss.pgh.pa.us>
Discussion: https://postgr.es/m/fbc5d94e-6fbd-4a64-85d4-c9e284a58eb2%40gmail.com
---
 .../recovery/t/046_checkpoint_logical_slot.pl | 25 ++++++++++++-------
 .../t/047_checkpoint_physical_slot.pl         | 19 +++++++++-----
 2 files changed, 29 insertions(+), 15 deletions(-)

diff --git a/src/test/recovery/t/046_checkpoint_logical_slot.pl b/src/test/recovery/t/046_checkpoint_logical_slot.pl
index b4265c4a6a5..86cdc1a2d2c 100644
--- a/src/test/recovery/t/046_checkpoint_logical_slot.pl
+++ b/src/test/recovery/t/046_checkpoint_logical_slot.pl
@@ -21,10 +21,17 @@ my ($node, $result);
 
 $node = PostgreSQL::Test::Cluster->new('mike');
 $node->init;
-$node->append_conf('postgresql.conf',
-	"shared_preload_libraries = 'injection_points'");
 $node->append_conf('postgresql.conf', "wal_level = 'logical'");
 $node->start;
+
+# Check if the extension injection_points is available, as it may be
+# possible that this script is run with installcheck, where the module
+# would not be installed by default.
+if (!$node->check_extension('injection_points'))
+{
+	plan skip_all => 'Extension injection_points not installed';
+}
+
 $node->safe_psql('postgres', q(CREATE EXTENSION injection_points));
 
 # Create a simple table to generate data into.
@@ -58,23 +65,23 @@ SELECT 1 \watch 0.1
 \q
 ));
 
-# Insert 2M rows; that's about 260MB (~20 segments) worth of WAL.
+# Insert 50K rows; that's about 86MB (~5 segments) worth of WAL.
 $node->safe_psql('postgres',
-	q{insert into t (b) select md5(i::text) from generate_series(1,1000000) s(i)}
+	q{insert into t (b) select repeat(md5(i::text),50) from generate_series(1,50000) s(i)}
 );
 
 # Run another checkpoint to set a new restore LSN.
 $node->safe_psql('postgres', q{checkpoint});
 
-# Another 2M rows; that's about 260MB (~20 segments) worth of WAL.
+# Another 50K rows; that's about 86MB (~5 segments) worth of WAL.
 $node->safe_psql('postgres',
-	q{insert into t (b) select md5(i::text) from generate_series(1,1000000) s(i)}
+	q{insert into t (b) select repeat(md5(i::text),50) from generate_series(1,50000) s(i)}
 );
 
 # Run another checkpoint, this time in the background, and make it wait
 # on the injection point) so that the checkpoint stops right before
 # removing old WAL segments.
-note('starting checkpoint\n');
+note('starting checkpoint');
 
 my $checkpoint = $node->background_psql('postgres');
 $checkpoint->query_safe(
@@ -88,7 +95,7 @@ checkpoint;
 ));
 
 # Wait until the checkpoint stops right before removing WAL segments.
-note('waiting for injection_point\n');
+note('waiting for injection_point');
 $node->wait_for_event('checkpointer', 'checkpoint-before-old-wal-removal');
 note('injection_point is reached');
 
@@ -107,7 +114,7 @@ select count(*) from pg_logical_slot_get_changes('slot_logical', null, null) \wa
 ));
 
 # Wait until the slot's restart_lsn points to the next WAL segment.
-note('waiting for injection_point\n');
+note('waiting for injection_point');
 $node->wait_for_event('client backend',
 	'logical-replication-slot-advance-segment');
 note('injection_point is reached');
diff --git a/src/test/recovery/t/047_checkpoint_physical_slot.pl b/src/test/recovery/t/047_checkpoint_physical_slot.pl
index 454e56b9bd2..5ff7ecdb905 100644
--- a/src/test/recovery/t/047_checkpoint_physical_slot.pl
+++ b/src/test/recovery/t/047_checkpoint_physical_slot.pl
@@ -21,10 +21,17 @@ my ($node, $result);
 
 $node = PostgreSQL::Test::Cluster->new('mike');
 $node->init;
-$node->append_conf('postgresql.conf',
-	"shared_preload_libraries = 'injection_points'");
 $node->append_conf('postgresql.conf', "wal_level = 'replica'");
 $node->start;
+
+# Check if the extension injection_points is available, as it may be
+# possible that this script is run with installcheck, where the module
+# would not be installed by default.
+if (!$node->check_extension('injection_points'))
+{
+	plan skip_all => 'Extension injection_points not installed';
+}
+
 $node->safe_psql('postgres', q(CREATE EXTENSION injection_points));
 
 # Create a simple table to generate data into.
@@ -43,9 +50,9 @@ $node->safe_psql('postgres',
 # Run checkpoint to flush current state to disk and set a baseline.
 $node->safe_psql('postgres', q{checkpoint});
 
-# Insert 2M rows; that's about 260MB (~20 segments) worth of WAL.
+# Insert 50K rows; that's about 86MB (~5 segments) worth of WAL.
 $node->safe_psql('postgres',
-	q{insert into t (b) select md5(i::text) from generate_series(1,100000) s(i)}
+	q{insert into t (b) select repeat(md5(i::text),50) from generate_series(1,50000) s(i)}
 );
 
 # Advance slot to the current position, just to have everything "valid".
@@ -56,9 +63,9 @@ $node->safe_psql('postgres',
 # Run another checkpoint to set a new restore LSN.
 $node->safe_psql('postgres', q{checkpoint});
 
-# Another 2M rows; that's about 260MB (~20 segments) worth of WAL.
+# Another 50K rows; that's about 86MB (~5 segments) worth of WAL.
 $node->safe_psql('postgres',
-	q{insert into t (b) select md5(i::text) from generate_series(1,1000000) s(i)}
+	q{insert into t (b) select repeat(md5(i::text),50) from generate_series(1,50000) s(i)}
 );
 
 my $restart_lsn_init = $node->safe_psql('postgres',
-- 
2.39.5 (Apple Git-154)

#54Hayato Kuroda (Fujitsu)
kuroda.hayato@fujitsu.com
In reply to: Alexander Korotkov (#53)
RE: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

Dear Alexander,

Thank you! All of these totally make sense. The updated patch is attached.

Thanks for the update. I found another point.

```
-# Another 2M rows; that's about 260MB (~20 segments) worth of WAL.
+# Another 50K rows; that's about 86MB (~5 segments) worth of WAL.
 $node->safe_psql('postgres',
-	q{insert into t (b) select md5(i::text) from generate_series(1,1000000) s(i)}
+	q{insert into t (b) select repeat(md5(i::text),50) from generate_series(1,50000) s(i)}
 );
```

I think a perl function advance_wal() can be used instead of doing actual INSERT
command because no one refers the replicated result. Same thing can be said in
046/047.

Best regards,
Hayato Kuroda
FUJITSU LIMITED

#55vignesh C
vignesh21@gmail.com
In reply to: Alexander Korotkov (#53)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

Hi Alexander,

While tracking buildfarm for one of other commits, I noticed this failure:
TRAP: failed Assert("s->data.restart_lsn >=
s->last_saved_restart_lsn"), File:
"../pgsql/src/backend/replication/slot.c", Line: 1813, PID: 3945797
postgres: standby: checkpointer (ExceptionalCondition+0x83) [0x55fa69b79f5e]
postgres: standby: checkpointer
(InvalidateObsoleteReplicationSlots+0x53c) [0x55fa69982171]
postgres: standby: checkpointer (CreateCheckPoint+0x9ad) [0x55fa6971feb2]
postgres: standby: checkpointer (CheckpointerMain+0x4b1) [0x55fa6996431c]
postgres: standby: checkpointer (postmaster_child_launch+0x130) [0x55fa69964b41]
postgres: standby: checkpointer (+0x40a1a7) [0x55fa699671a7]
postgres: standby: checkpointer (PostmasterMain+0x1563) [0x55fa6996aed6]
postgres: standby: checkpointer (main+0x7f0) [0x55fa6989f798]
/lib/x86_64-linux-gnu/libc.so.6(+0x29ca8) [0x7f1876a54ca8]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0x85) [0x7f1876a54d65]
postgres: standby: checkpointer (_start+0x21) [0x55fa696421a1]

Scorpion is failing for pg_basebackup's 020_pg_receivewal test at [1]https://buildfarm.postgresql.org/cgi-bin/show_stage_log.pl?nm=scorpion&amp;dt=2025-06-17%2000%3A40%3A46&amp;stg=pg_basebackup-check.
[1]: https://buildfarm.postgresql.org/cgi-bin/show_stage_log.pl?nm=scorpion&amp;dt=2025-06-17%2000%3A40%3A46&amp;stg=pg_basebackup-check

Regards,
Vignesh

Show quoted text

On Mon, 16 Jun 2025 at 16:47, Alexander Korotkov <aekorotkov@gmail.com> wrote:

Dear Kuroda-san,

On Mon, Jun 16, 2025 at 12:11 PM Hayato Kuroda (Fujitsu)
<kuroda.hayato@fujitsu.com> wrote:

Thanks for pushing the fix patch! BTW, I have few comments for your commits.
Can you check and include them if needed?

01.
```
$node->append_conf('postgresql.conf',
"shared_preload_libraries = 'injection_points'");
```

No need to set shared_preload_libraries in 046/047. ISTM it must be set when we
enable the statistics.

02.
We should also check whether the injection_points can be installed or not.
You can check check_extension() and callers.

Thank you! All of these totally make sense. The updated patch is attached.

------
Regards,
Alexander Korotkov
Supabase

#56Alexander Korotkov
aekorotkov@gmail.com
In reply to: Vitaly Davydov (#1)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

Hi, Vitaly!

On Tue, Jun 17, 2025 at 6:02 PM Vitaly Davydov <v.davydov@postgrespro.ru> wrote:

Thank you for reporting the issue.

While tracking buildfarm for one of other commits, I noticed this failure:
TRAP: failed Assert("s->data.restart_lsn >=
s->last_saved_restart_lsn"), File:
"../pgsql/src/backend/replication/slot.c", Line: 1813, PID: 3945797
postgres: standby: checkpointer (ExceptionalCondition+0x83) [0x55fa69b79f5e]
postgres: standby: checkpointer
(InvalidateObsoleteReplicationSlots+0x53c) [0x55fa69982171]
postgres: standby: checkpointer (CreateCheckPoint+0x9ad) [0x55fa6971feb2]

This assert was introduced in the patch. Now, I think, it is a wrong one. Let me
please explain one of the possible scenarios when it can be triggered. In case
of physical replication, when walsender receives a standby reply message, it
calls PhysicalConfirmReceivedLocation function which updates slots' restart_lsn
from received flush_lsn value. This value may be older than the saved value. If
it happens during checkpoint, after slot saving to disk, this assert will be
triggered, because last_saved_restart_lsn value may be lesser than the new
restart_lsn value, updated from walsender.

I propose to remove this assert.

Yes, but is it OK for restart_lsn to move backward? That might mean
that if checkpoint happen faster than
PhysicalConfirmReceivedLocation(), then crash could cause this WAL
location to be unavailable. Is that true?

Also, what do you think about proposed changes in [1]? I wonder if it
could somehow decrease the coverage.

Links.
1. /messages/by-id/OSCPR01MB149665B3F0629D10731B18E5AF570A@OSCPR01MB14966.jpnprd01.prod.outlook.com

------
Regards,
Alexander Korotkov
Supabase

#57Tom Lane
tgl@sss.pgh.pa.us
In reply to: vignesh C (#55)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

vignesh C <vignesh21@gmail.com> writes:

While tracking buildfarm for one of other commits, I noticed this failure:
TRAP: failed Assert("s->data.restart_lsn >=
s->last_saved_restart_lsn"), File:
"../pgsql/src/backend/replication/slot.c", Line: 1813, PID: 3945797

My animal mamba is also showing this assertion failure, but in a
different test (recovery/t/040_standby_failover_slots_sync.pl).
It's failed in two out of its three runs since ca307d5ce went in,
so it's more reproducible than scorpion's report, though still not
perfectly so.

I suspect that mamba is prone to this simply because it's slow,
although perhaps there's a different reason. Anyway, happy to
investigate manually if there's something you'd like me to
check for.

regards, tom lane

#58Hayato Kuroda (Fujitsu)
kuroda.hayato@fujitsu.com
In reply to: Vitaly Davydov (#1)
RE: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

Dear Vitaly,

I've been working on the bug...

This assert was introduced in the patch. Now, I think, it is a wrong one. Let me
please explain one of the possible scenarios when it can be triggered. In case
of physical replication, when walsender receives a standby reply message, it
calls PhysicalConfirmReceivedLocation function which updates slots' restart_lsn
from received flush_lsn value. This value may be older than the saved value.

To confirm, can you tell me the theory why the walsender received old LSN?
It is sent by the walreceiver, so is there a case that LogstreamResult.Flush can go backward?
Not sure we can accept the situation.

Best regards,
Hayato Kuroda
FUJITSU LIMITED

#59vignesh C
vignesh21@gmail.com
In reply to: Vitaly Davydov (#1)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

On Wed, 18 Jun 2025 at 14:35, Vitaly Davydov <v.davydov@postgrespro.ru> wrote:

Dear Hayato,

To confirm, can you tell me the theory why the walsender received old LSN?
It is sent by the walreceiver, so is there a case that LogstreamResult.Flush can go backward?
Not sure we can accept the situation.

I can't say anything about the origin of the issue, but it can be easily reproduced
on the master branch:

1. Add an assert in PhysicalConfirmReceivedLocation (apply the attached patch)
2. Compile & install with tap tests and assertions enabled
3. cd src/bin/pg_basebackup/
3. PROVE_TESTS=t/020_pg_receivewal.pl gmake check

Thanks for the steps, I was able to reproduce the issue with the
suggested steps.

The test will fail because of the assertion. I plan to investigate the issue
but I need some more time for it. Once, it happens on the original master
branch, I think, this problem already exists. The proposed patch seems
to be not guilty.

This issue occurs even prior to this commit, I was able to reproduce
it on a version just before it. I’ll also look into analyzing the root
cause further.

It may be the same problem as discussed in:
/messages/by-id/CALDaNm2uQbhEVJzvnja6rw7Q9AYu9FpVmET=TbwLjV3DcPRhLw@mail.gmail.com

This issue was related to confirmed_flush and was addressed in commit
d1ffcc7fa3c54de8b2a677a3e503fc808c7b419c. It is not related to
restart_lsn.

Regards,
Vignesh

#60Alexander Korotkov
aekorotkov@gmail.com
In reply to: Vitaly Davydov (#1)
2 attachment(s)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

On Wed, Jun 18, 2025 at 6:50 PM Vitaly Davydov <v.davydov@postgrespro.ru> wrote:

I think, it is a good idea. Once we do not use the generated data, it is ok
just to generate WAL segments using the proposed function. I've tested this
function. The tests worked as expected with and without the fix. The attached
patch does the change.

Sorry, forgot to attach the patch. It is created on the current master branch.
It may conflict with your corrections. I hope, it could be useful.

Thank you. I've integrated this into a patch to improve these tests.

Regarding assertion failure, I've found that assert in
PhysicalConfirmReceivedLocation() conflicts with restart_lsn
previously set by ReplicationSlotReserveWal(). As I can see,
ReplicationSlotReserveWal() just picks fresh XLogCtl->RedoRecPtr lsn.
So, it doesn't seems there is a guarantee that restart_lsn never goes
backward. The commit in ReplicationSlotReserveWal() even states there
is a "chance that we have to retry". Thus, I propose to remove the
assertion introduced by ca307d5cec90.

Any objection from backpatching 0001 though 17 and pushing 0002 to the head?

------
Regards,
Alexander Korotkov
Supabase

Attachments:

v4-0002-Remove-excess-assert-from-InvalidatePossiblyObsol.patchapplication/octet-stream; name=v4-0002-Remove-excess-assert-from-InvalidatePossiblyObsol.patchDownload
From a805b5fc6320069b33c3f60037f32f3e679db5cd Mon Sep 17 00:00:00 2001
From: Alexander Korotkov <akorotkov@postgresql.org>
Date: Wed, 18 Jun 2025 19:34:00 +0300
Subject: [PATCH v4 2/2] Remove excess assert from
 InvalidatePossiblyObsoleteSlot()

ca307d5cec90 introduced keeping WAL segments by slot's last saved restart
LSN. It also added an assertion that the slot's restart LSN never goes
backward. As stated in the ReplicationSlotReserveWal() comment, this is not
always true. Additionally, this issue has been spotted by some buildfarm
members.

Vitaly Davydov <v.davydov@postgrespro.ru> proposed the fix idea.

Reported-by: Vignesh C <vignesh21@gmail.com>
Reported-by: Tom Lane <tgl@sss.pgh.pa.us>
Discussion: https://postgr.es/m/CALDaNm3s-jpQTe1MshsvQ8GO%3DTLj233JCdkQ7uZ6pwqRVpxAdw%40mail.gmail.com
---
 src/backend/replication/slot.c | 2 --
 1 file changed, 2 deletions(-)

diff --git a/src/backend/replication/slot.c b/src/backend/replication/slot.c
index c64f020742f..c11e588d632 100644
--- a/src/backend/replication/slot.c
+++ b/src/backend/replication/slot.c
@@ -1810,8 +1810,6 @@ InvalidatePossiblyObsoleteSlot(uint32 possible_causes,
 		 */
 		SpinLockAcquire(&s->mutex);
 
-		Assert(s->data.restart_lsn >= s->last_saved_restart_lsn);
-
 		restart_lsn = s->data.restart_lsn;
 
 		/* we do nothing if the slot is already invalid */
-- 
2.39.5 (Apple Git-154)

v4-0001-Improve-runtime-and-output-of-tests-for-replicati.patchapplication/octet-stream; name=v4-0001-Improve-runtime-and-output-of-tests-for-replicati.patchDownload
From 0b28994d5780bb6ca4b381de9dd8b96ea5dda3c0 Mon Sep 17 00:00:00 2001
From: Alexander Korotkov <akorotkov@postgresql.org>
Date: Wed, 18 Jun 2025 19:32:05 +0300
Subject: [PATCH v4 1/2] Improve runtime and output of tests for replication
 slots checkpointing.

The TAP tests that verify logical and physical replication slot behavior
during checkpoints (046_checkpoint_logical_slot.pl and
047_checkpoint_physical_slot.pl) inserted two batches of 2 million rows each,
generating approximately 520 MB of WAL.  On slow machines, or when compiled
with '-DRELCACHE_FORCE_RELEASE -DCATCACHE_FORCE_RELEASE', this caused the
tests to run for 8-9 minutes and occasionally time out, as seen on the
buildfarm animal prion.

This commit modifies the mentioned tests to utilize the $node->advance_wal()
function, thereby reducing runtime. Once we do not use the generated data,
the proposed function is a good alternative, which cuts the total wall-clock
run time.

While here, remove superfluous '\n' characters from several note() calls;
these appeared literally in the build-farm logs and looked odd.  Also, remove
excessive 'shared_preload_libraries' GUC from the config and add a check for
'injection_points' extension availability.

Reported-by: Alexander Lakhin <exclusion@gmail.com>
Reported-by: Tom Lane <tgl@sss.pgh.pa.us>
Author: Alexander Korotkov <aekorotkov@gmail.com>
Author: Vitaly Davydov <v.davydov@postgrespro.ru>
Reviewed-by: Hayato Kuroda <kuroda.hayato@fujitsu.com>
Discussion: https://postgr.es/m/fbc5d94e-6fbd-4a64-85d4-c9e284a58eb2%40gmail.com
Backpatch-through: 17
---
 .../recovery/t/046_checkpoint_logical_slot.pl | 31 +++++++++----------
 .../t/047_checkpoint_physical_slot.pl         | 23 +++++++-------
 2 files changed, 25 insertions(+), 29 deletions(-)

diff --git a/src/test/recovery/t/046_checkpoint_logical_slot.pl b/src/test/recovery/t/046_checkpoint_logical_slot.pl
index b4265c4a6a5..d67c5108d78 100644
--- a/src/test/recovery/t/046_checkpoint_logical_slot.pl
+++ b/src/test/recovery/t/046_checkpoint_logical_slot.pl
@@ -21,15 +21,18 @@ my ($node, $result);
 
 $node = PostgreSQL::Test::Cluster->new('mike');
 $node->init;
-$node->append_conf('postgresql.conf',
-	"shared_preload_libraries = 'injection_points'");
 $node->append_conf('postgresql.conf', "wal_level = 'logical'");
 $node->start;
-$node->safe_psql('postgres', q(CREATE EXTENSION injection_points));
 
-# Create a simple table to generate data into.
-$node->safe_psql('postgres',
-	q{create table t (id serial primary key, b text)});
+# Check if the extension injection_points is available, as it may be
+# possible that this script is run with installcheck, where the module
+# would not be installed by default.
+if (!$node->check_extension('injection_points'))
+{
+	plan skip_all => 'Extension injection_points not installed';
+}
+
+$node->safe_psql('postgres', q(CREATE EXTENSION injection_points));
 
 # Create the two slots we'll need.
 $node->safe_psql('postgres',
@@ -58,23 +61,17 @@ SELECT 1 \watch 0.1
 \q
 ));
 
-# Insert 2M rows; that's about 260MB (~20 segments) worth of WAL.
-$node->safe_psql('postgres',
-	q{insert into t (b) select md5(i::text) from generate_series(1,1000000) s(i)}
-);
+$node->advance_wal(20);
 
 # Run another checkpoint to set a new restore LSN.
 $node->safe_psql('postgres', q{checkpoint});
 
-# Another 2M rows; that's about 260MB (~20 segments) worth of WAL.
-$node->safe_psql('postgres',
-	q{insert into t (b) select md5(i::text) from generate_series(1,1000000) s(i)}
-);
+$node->advance_wal(20);
 
 # Run another checkpoint, this time in the background, and make it wait
 # on the injection point) so that the checkpoint stops right before
 # removing old WAL segments.
-note('starting checkpoint\n');
+note('starting checkpoint');
 
 my $checkpoint = $node->background_psql('postgres');
 $checkpoint->query_safe(
@@ -88,7 +85,7 @@ checkpoint;
 ));
 
 # Wait until the checkpoint stops right before removing WAL segments.
-note('waiting for injection_point\n');
+note('waiting for injection_point');
 $node->wait_for_event('checkpointer', 'checkpoint-before-old-wal-removal');
 note('injection_point is reached');
 
@@ -107,7 +104,7 @@ select count(*) from pg_logical_slot_get_changes('slot_logical', null, null) \wa
 ));
 
 # Wait until the slot's restart_lsn points to the next WAL segment.
-note('waiting for injection_point\n');
+note('waiting for injection_point');
 $node->wait_for_event('client backend',
 	'logical-replication-slot-advance-segment');
 note('injection_point is reached');
diff --git a/src/test/recovery/t/047_checkpoint_physical_slot.pl b/src/test/recovery/t/047_checkpoint_physical_slot.pl
index 454e56b9bd2..a1332b5d44c 100644
--- a/src/test/recovery/t/047_checkpoint_physical_slot.pl
+++ b/src/test/recovery/t/047_checkpoint_physical_slot.pl
@@ -21,15 +21,18 @@ my ($node, $result);
 
 $node = PostgreSQL::Test::Cluster->new('mike');
 $node->init;
-$node->append_conf('postgresql.conf',
-	"shared_preload_libraries = 'injection_points'");
 $node->append_conf('postgresql.conf', "wal_level = 'replica'");
 $node->start;
-$node->safe_psql('postgres', q(CREATE EXTENSION injection_points));
 
-# Create a simple table to generate data into.
-$node->safe_psql('postgres',
-	q{create table t (id serial primary key, b text)});
+# Check if the extension injection_points is available, as it may be
+# possible that this script is run with installcheck, where the module
+# would not be installed by default.
+if (!$node->check_extension('injection_points'))
+{
+	plan skip_all => 'Extension injection_points not installed';
+}
+
+$node->safe_psql('postgres', q(CREATE EXTENSION injection_points));
 
 # Create a physical replication slot.
 $node->safe_psql('postgres',
@@ -44,9 +47,7 @@ $node->safe_psql('postgres',
 $node->safe_psql('postgres', q{checkpoint});
 
 # Insert 2M rows; that's about 260MB (~20 segments) worth of WAL.
-$node->safe_psql('postgres',
-	q{insert into t (b) select md5(i::text) from generate_series(1,100000) s(i)}
-);
+$node->advance_wal(20);
 
 # Advance slot to the current position, just to have everything "valid".
 $node->safe_psql('postgres',
@@ -57,9 +58,7 @@ $node->safe_psql('postgres',
 $node->safe_psql('postgres', q{checkpoint});
 
 # Another 2M rows; that's about 260MB (~20 segments) worth of WAL.
-$node->safe_psql('postgres',
-	q{insert into t (b) select md5(i::text) from generate_series(1,1000000) s(i)}
-);
+$node->advance_wal(20);
 
 my $restart_lsn_init = $node->safe_psql('postgres',
 	q{select restart_lsn from pg_replication_slots where slot_name = 'slot_physical'}
-- 
2.39.5 (Apple Git-154)

#61Amit Kapila
amit.kapila16@gmail.com
In reply to: Alexander Korotkov (#60)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

On Wed, Jun 18, 2025 at 10:17 PM Alexander Korotkov
<aekorotkov@gmail.com> wrote:

On Wed, Jun 18, 2025 at 6:50 PM Vitaly Davydov <v.davydov@postgrespro.ru> wrote:

I think, it is a good idea. Once we do not use the generated data, it is ok
just to generate WAL segments using the proposed function. I've tested this
function. The tests worked as expected with and without the fix. The attached
patch does the change.

Sorry, forgot to attach the patch. It is created on the current master branch.
It may conflict with your corrections. I hope, it could be useful.

Thank you. I've integrated this into a patch to improve these tests.

Regarding assertion failure, I've found that assert in
PhysicalConfirmReceivedLocation() conflicts with restart_lsn
previously set by ReplicationSlotReserveWal(). As I can see,
ReplicationSlotReserveWal() just picks fresh XLogCtl->RedoRecPtr lsn.
So, it doesn't seems there is a guarantee that restart_lsn never goes
backward. The commit in ReplicationSlotReserveWal() even states there
is a "chance that we have to retry".

I don't see how this theory can lead to a restart_lsn of a slot going
backwards. The retry mentioned there is just a retry to reserve the
slot's position again if the required WAL is already removed. Such a
retry can only get the position later than the previous restart_lsn.

Thus, I propose to remove the
assertion introduced by ca307d5cec90.

If what I said above is correct, then the following part of the commit
message will be incorrect:
"As stated in the ReplicationSlotReserveWal() comment, this is not
always true. Additionally, this issue has been spotted by some
buildfarm
members."

--
With Regards,
Amit Kapila.

#62Hayato Kuroda (Fujitsu)
kuroda.hayato@fujitsu.com
In reply to: Amit Kapila (#61)
RE: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

Dear Amit, Alexander,

Regarding assertion failure, I've found that assert in
PhysicalConfirmReceivedLocation() conflicts with restart_lsn
previously set by ReplicationSlotReserveWal(). As I can see,
ReplicationSlotReserveWal() just picks fresh XLogCtl->RedoRecPtr lsn.
So, it doesn't seems there is a guarantee that restart_lsn never goes
backward. The commit in ReplicationSlotReserveWal() even states there
is a "chance that we have to retry".

I don't see how this theory can lead to a restart_lsn of a slot going
backwards. The retry mentioned there is just a retry to reserve the
slot's position again if the required WAL is already removed. Such a
retry can only get the position later than the previous restart_lsn.

We analyzed the assertion failure happened at pg_basebackup/020_pg_receivewal,
and confirmed that restart_lsn can go backward. This meant that Assert() added
by the ca307d5 can cause crash.

Background
===========
When pg_receivewal starts the replication and it uses the replication slot, it
sets as the beginning of the segment where restart_lsn exists, as the startpoint.
E.g., if the restart_lsn of the slot is 0/B000D0, pg_receivewal requests WALs
from 0/B00000.
More detail of this behavior, see f61e1dd2 and d9bae531.

What happened here
==================
Based on above theory, walsender sent from the beginning of segment (0/B00000).
When walreceiver receives, it tried to send reply. At that time the flushed
location of WAL would be 0/B00000. walsender sets the received lsn as restart_lsn
in PhysicalConfirmReceivedLocation(). Here the restart_lsn went backward (0/B000D0->0/B00000).

The assertion failure could happen if CHECKPOINT happened at that time.
Attribute last_saved_restart_lsn of the slot was 0/B000D0, but the data.restart_lsn
was 0/B00000. It could not satisfy the assertion added in InvalidatePossiblyObsoleteSlot().

Note
====
1.
In this case, starting from the beginning of the segment is not a problem, because
the checkpoint process only removes WAL files from segments that precede the
restart_lsn's wal segment. The current segment (0/B00000) will not be removed,
so there is no risk of data loss or inconsistency.

2.
A similar pattern applies to pg_basebackup. Both use logic that adjusts the
requested streaming position to the start of the segment, and it replies the
received LSN as flushed.

3.
I considered the theory above, but I could not reproduce 040_standby_failover_slots_sync
because it is a timing issue. Have someone else reproduced?

We are still investigating failure caused at 040_standby_failover_slots_sync.

[1]: https://buildfarm.postgresql.org/cgi-bin/show_stage_log.pl?nm=scorpion&amp;dt=2025-06-17%2000%3A40%3A46&amp;stg=pg_basebackup-check

Best regards,
Hayato Kuroda
FUJITSU LIMITED

#63Alexander Korotkov
aekorotkov@gmail.com
In reply to: Amit Kapila (#61)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

On Thu, Jun 19, 2025 at 1:29 PM Amit Kapila <amit.kapila16@gmail.com> wrote:

On Wed, Jun 18, 2025 at 10:17 PM Alexander Korotkov
<aekorotkov@gmail.com> wrote:

On Wed, Jun 18, 2025 at 6:50 PM Vitaly Davydov <v.davydov@postgrespro.ru> wrote:

I think, it is a good idea. Once we do not use the generated data, it is ok
just to generate WAL segments using the proposed function. I've tested this
function. The tests worked as expected with and without the fix. The attached
patch does the change.

Sorry, forgot to attach the patch. It is created on the current master branch.
It may conflict with your corrections. I hope, it could be useful.

Thank you. I've integrated this into a patch to improve these tests.

Regarding assertion failure, I've found that assert in
PhysicalConfirmReceivedLocation() conflicts with restart_lsn
previously set by ReplicationSlotReserveWal(). As I can see,
ReplicationSlotReserveWal() just picks fresh XLogCtl->RedoRecPtr lsn.
So, it doesn't seems there is a guarantee that restart_lsn never goes
backward. The commit in ReplicationSlotReserveWal() even states there
is a "chance that we have to retry".

I don't see how this theory can lead to a restart_lsn of a slot going
backwards. The retry mentioned there is just a retry to reserve the
slot's position again if the required WAL is already removed. Such a
retry can only get the position later than the previous restart_lsn.

Yes, if retry is needed, then the new position must be later for sure.
What I mean is that ReplicationSlotReserveWal() can reserve something
later than what standby is going to read (and correspondingly report
with PhysicalConfirmReceivedLocation()).

Thus, I propose to remove the
assertion introduced by ca307d5cec90.

If what I said above is correct, then the following part of the commit
message will be incorrect:
"As stated in the ReplicationSlotReserveWal() comment, this is not
always true. Additionally, this issue has been spotted by some
buildfarm
members."

I agree, this comment needs improvement in terms of clarity.

Meanwhile I've pushed the patch for TAP tests, which I think didn't
get any objections.

------
Regards,
Alexander Korotkov
Supabase

#64Alexander Korotkov
aekorotkov@gmail.com
In reply to: Hayato Kuroda (Fujitsu) (#62)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

Dear Kuroda-san,

On Thu, Jun 19, 2025 at 2:05 PM Hayato Kuroda (Fujitsu)
<kuroda.hayato@fujitsu.com> wrote:

Regarding assertion failure, I've found that assert in
PhysicalConfirmReceivedLocation() conflicts with restart_lsn
previously set by ReplicationSlotReserveWal(). As I can see,
ReplicationSlotReserveWal() just picks fresh XLogCtl->RedoRecPtr lsn.
So, it doesn't seems there is a guarantee that restart_lsn never goes
backward. The commit in ReplicationSlotReserveWal() even states there
is a "chance that we have to retry".

I don't see how this theory can lead to a restart_lsn of a slot going
backwards. The retry mentioned there is just a retry to reserve the
slot's position again if the required WAL is already removed. Such a
retry can only get the position later than the previous restart_lsn.

We analyzed the assertion failure happened at pg_basebackup/020_pg_receivewal,
and confirmed that restart_lsn can go backward. This meant that Assert() added
by the ca307d5 can cause crash.

Background
===========
When pg_receivewal starts the replication and it uses the replication slot, it
sets as the beginning of the segment where restart_lsn exists, as the startpoint.
E.g., if the restart_lsn of the slot is 0/B000D0, pg_receivewal requests WALs
from 0/B00000.
More detail of this behavior, see f61e1dd2 and d9bae531.

What happened here
==================
Based on above theory, walsender sent from the beginning of segment (0/B00000).
When walreceiver receives, it tried to send reply. At that time the flushed
location of WAL would be 0/B00000. walsender sets the received lsn as restart_lsn
in PhysicalConfirmReceivedLocation(). Here the restart_lsn went backward (0/B000D0->0/B00000).

The assertion failure could happen if CHECKPOINT happened at that time.
Attribute last_saved_restart_lsn of the slot was 0/B000D0, but the data.restart_lsn
was 0/B00000. It could not satisfy the assertion added in InvalidatePossiblyObsoleteSlot().

Thank you for your detailed explanation!

Note
====
1.
In this case, starting from the beginning of the segment is not a problem, because
the checkpoint process only removes WAL files from segments that precede the
restart_lsn's wal segment. The current segment (0/B00000) will not be removed,
so there is no risk of data loss or inconsistency.

2.
A similar pattern applies to pg_basebackup. Both use logic that adjusts the
requested streaming position to the start of the segment, and it replies the
received LSN as flushed.

3.
I considered the theory above, but I could not reproduce 040_standby_failover_slots_sync
because it is a timing issue. Have someone else reproduced?

We are still investigating failure caused at 040_standby_failover_slots_sync.

I didn't manage to reproduce this. But as I see from the logs [1]https://buildfarm.postgresql.org/cgi-bin/show_stage_log.pl?nm=mamba&amp;dt=2025-06-17%2005%3A10%3A36&amp;stg=recovery-check on
mamba that START_REPLICATION command was issued just before assert
trap. Could it be something similar to what I described in [2]/messages/by-id/CAPpHfdv3UEUBjsLhB_CwJT0xX9LmN6U+__myYopq4KcgvCSbTg@mail.gmail.com.
Namely:
1. ReplicationSlotReserveWal() sets restart_lsn for the slot.
2. Concurrent checkpoint flushes that restart_lsn to the disk.
3. PhysicalConfirmReceivedLocation() sets restart_lsn of the slot to
the beginning of the segment.

[1]: https://buildfarm.postgresql.org/cgi-bin/show_stage_log.pl?nm=mamba&amp;dt=2025-06-17%2005%3A10%3A36&amp;stg=recovery-check
[2]: /messages/by-id/CAPpHfdv3UEUBjsLhB_CwJT0xX9LmN6U+__myYopq4KcgvCSbTg@mail.gmail.com

------
Regards,
Alexander Korotkov
Supabase

#65Amit Kapila
amit.kapila16@gmail.com
In reply to: Alexander Korotkov (#63)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

On Fri, Jun 20, 2025 at 5:48 AM Alexander Korotkov <aekorotkov@gmail.com> wrote:

If what I said above is correct, then the following part of the commit
message will be incorrect:
"As stated in the ReplicationSlotReserveWal() comment, this is not
always true. Additionally, this issue has been spotted by some
buildfarm
members."

I agree, this comment needs improvement in terms of clarity.

Meanwhile I've pushed the patch for TAP tests, which I think didn't
get any objections.

Sounds reasonable. As per analysis till now, it seems removal of new
assert is correct and we just need to figure out the reason in all
failure cases as to why the physical slot's restart_lsn goes backward,
and then add a comment somewhere to ensure that we don't repeat a
similar mistake in the future.

--
With Regards,
Amit Kapila.

#66vignesh C
vignesh21@gmail.com
In reply to: Alexander Korotkov (#64)
2 attachment(s)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

On Fri, 20 Jun 2025 at 05:54, Alexander Korotkov <aekorotkov@gmail.com> wrote:

Dear Kuroda-san,

On Thu, Jun 19, 2025 at 2:05 PM Hayato Kuroda (Fujitsu)
<kuroda.hayato@fujitsu.com> wrote:

Regarding assertion failure, I've found that assert in
PhysicalConfirmReceivedLocation() conflicts with restart_lsn
previously set by ReplicationSlotReserveWal(). As I can see,
ReplicationSlotReserveWal() just picks fresh XLogCtl->RedoRecPtr lsn.
So, it doesn't seems there is a guarantee that restart_lsn never goes
backward. The commit in ReplicationSlotReserveWal() even states there
is a "chance that we have to retry".

I don't see how this theory can lead to a restart_lsn of a slot going
backwards. The retry mentioned there is just a retry to reserve the
slot's position again if the required WAL is already removed. Such a
retry can only get the position later than the previous restart_lsn.

We analyzed the assertion failure happened at pg_basebackup/020_pg_receivewal,
and confirmed that restart_lsn can go backward. This meant that Assert() added
by the ca307d5 can cause crash.

Background
===========
When pg_receivewal starts the replication and it uses the replication slot, it
sets as the beginning of the segment where restart_lsn exists, as the startpoint.
E.g., if the restart_lsn of the slot is 0/B000D0, pg_receivewal requests WALs
from 0/B00000.
More detail of this behavior, see f61e1dd2 and d9bae531.

What happened here
==================
Based on above theory, walsender sent from the beginning of segment (0/B00000).
When walreceiver receives, it tried to send reply. At that time the flushed
location of WAL would be 0/B00000. walsender sets the received lsn as restart_lsn
in PhysicalConfirmReceivedLocation(). Here the restart_lsn went backward (0/B000D0->0/B00000).

The assertion failure could happen if CHECKPOINT happened at that time.
Attribute last_saved_restart_lsn of the slot was 0/B000D0, but the data.restart_lsn
was 0/B00000. It could not satisfy the assertion added in InvalidatePossiblyObsoleteSlot().

Thank you for your detailed explanation!

Note
====
1.
In this case, starting from the beginning of the segment is not a problem, because
the checkpoint process only removes WAL files from segments that precede the
restart_lsn's wal segment. The current segment (0/B00000) will not be removed,
so there is no risk of data loss or inconsistency.

2.
A similar pattern applies to pg_basebackup. Both use logic that adjusts the
requested streaming position to the start of the segment, and it replies the
received LSN as flushed.

3.
I considered the theory above, but I could not reproduce 040_standby_failover_slots_sync
because it is a timing issue. Have someone else reproduced?

We are still investigating failure caused at 040_standby_failover_slots_sync.

I didn't manage to reproduce this. But as I see from the logs [1] on
mamba that START_REPLICATION command was issued just before assert
trap. Could it be something similar to what I described in [2].
Namely:
1. ReplicationSlotReserveWal() sets restart_lsn for the slot.
2. Concurrent checkpoint flushes that restart_lsn to the disk.
3. PhysicalConfirmReceivedLocation() sets restart_lsn of the slot to
the beginning of the segment.

Here is my analysis for the 040_standby_failover_slots_sync test
failure where in physical replication slot can point to backward lsn:
In certain rare cases the restart LSN can go backwards. This scenario
can be reproduced by performing checkpoint continuously and slowing
the WAL applying. I have a patch with changes to handle this.

Here's a summary of the sequence of events:
1) Standby confirms a new LSN (0/40369C8) when primary sends some WAL contents:
After standby writes the received WAL contents in XLogWalRcvWrite, the
standby sends this lsn 0/40369C8 as the confirmed flush location. The
primary acknowledges this and updates the replication slot's
restart_lsn accordingly:
2025-06-20 14:33:21.777 IST [134998] standby1 LOG:
PhysicalConfirmReceivedLocation replication slot "sb1_slot" set
restart_lsn to 0/40369C8
2025-06-20 14:33:21.777 IST [134998] standby1 STATEMENT:
START_REPLICATION SLOT "sb1_slot" 0/3000000 TIMELINE 1
Checkpoint persists the new restart_lsn:

2) Shortly after receiving the new LSN, a checkpoint occurs which
saves this restart_lsn:
2025-06-20 14:33:21.780 IST [134913] LOG: checkpoint complete: wrote
0 buffers (0.0%), wrote 0 SLRU buffers; 0 WAL file(s) added, 0
removed, 0 recycled; write=0.001 s, sync=0.001 s, total=0.002 s; sync
files=0, longest=0.000 s, average=0.000 s; distance=0 kB, estimate=0
kB; lsn=0/4036A20, redo lsn=0/40369C8

3)Streaming replication is restarted because of primary_conninfo
change and reload
The WAL receiver process is restarted:
25-06-20 14:33:21.779 IST [134997] FATAL: terminating walreceiver
process due to administrator command

4) Standby sends an older flush pointer after restart:
Upon restart, the WAL receiver sends a flush location (0/401D448)
derived from XLogRecoveryCtl->lastReplayedEndRecPtr, which is older
than the previously confirmed restart_lsn. It is important to note
that we are sending the lastReplayedEndRecPtr which is the last
successfully replayed lsn in this case:
5-06-20 14:33:21.796 IST [135135] LOG: WalReceiverMain
LogstreamResult.Flush initialized to 0/401D448
2025-06-20 14:33:21.796 IST [135135] LOG: sending write 0/401D448
flush 0/401D448 apply 0/401D448

This is done from here:
....
/* Initialize LogstreamResult and buffers for processing messages */
LogstreamResult.Write = LogstreamResult.Flush = GetXLogReplayRecPtr(NULL);

initStringInfo(&reply_message);

/* Initialize nap wakeup times. */
now = GetCurrentTimestamp();
for (int i = 0; i < NUM_WALRCV_WAKEUPS; ++i)
WalRcvComputeNextWakeup(i, now);

/* Send initial reply/feedback messages. */
XLogWalRcvSendReply(true, false);
...

In case of step 1, we are sending the lsn of the WAL that is written,
since we have slowed down the WAL applying the replay location is
lesser and the replay location is being sent here.

5) I have added logs to detect this inconsistency:
This leads to a scenario where the standby tries to confirm a
restart_lsn older than the one currently held by the primary:
2025-06-20 14:33:21.797 IST [135136] standby1 LOG: crash scenario -
slot sb1_slot, cannot confirm a restart LSN (0/401D448) that is older
than the current one (0/40369C8)

If a checkpoint happens concurrently during this condition, it may
trigger an assertion failure on the primary due to the restart_lsn
being less than the last_saved_restart_lsn.
Currently this does not break physical replication, but I'm not sure
if the gap increases to many WAL files and if the WAL files get
deleted, how it will behave.
Attached the patch changes with which you can reproduce. Grep for
"crash scenario" in the logs. For me it occurs with every run. The
reproduced logs are attached.

This proves that the restart_lsn can go backward in cases where the
standby is slowly applying. But this has nothing to do with this
thread, I felt you can commit the assert removal patch. I will
continue the analysis further and see if there is any impact or not
and we can later add comments accordingly.

Regards,
Vignesh

Attachments:

restart_lsn_backup_repro_v1.patchapplication/octet-stream; name=restart_lsn_backup_repro_v1.patchDownload
diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index 47ffc0a2307..1eea132bfcc 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -7160,6 +7160,7 @@ CreateCheckPoint(int flags)
 	if ((flags & (CHECKPOINT_IS_SHUTDOWN | CHECKPOINT_END_OF_RECOVERY |
 				  CHECKPOINT_FORCE)) == 0)
 	{
+		#if 0
 		if (last_important_lsn == ControlFile->checkPoint)
 		{
 			END_CRIT_SECTION();
@@ -7167,6 +7168,7 @@ CreateCheckPoint(int flags)
 					(errmsg_internal("checkpoint skipped because system is idle")));
 			return false;
 		}
+		#endif
 	}
 
 	/*
diff --git a/src/backend/access/transam/xlogrecovery.c b/src/backend/access/transam/xlogrecovery.c
index 6ce979f2d8b..c3804939780 100644
--- a/src/backend/access/transam/xlogrecovery.c
+++ b/src/backend/access/transam/xlogrecovery.c
@@ -2009,7 +2009,7 @@ ApplyWalRecord(XLogReaderState *xlogreader, XLogRecord *record, TimeLineID *repl
 
 	/* Pop the error context stack */
 	error_context_stack = errcallback.previous;
-
+	pg_usleep(1000L);
 	/*
 	 * Update lastReplayedEndRecPtr after this record has been successfully
 	 * replayed.
diff --git a/src/backend/postmaster/checkpointer.c b/src/backend/postmaster/checkpointer.c
index fda91ffd1ce..885d17ebde7 100644
--- a/src/backend/postmaster/checkpointer.c
+++ b/src/backend/postmaster/checkpointer.c
@@ -345,7 +345,7 @@ CheckpointerMain(const void *startup_data, size_t startup_data_len)
 	 */
 	for (;;)
 	{
-		bool		do_checkpoint = false;
+		bool		do_checkpoint = true;
 		int			flags = 0;
 		pg_time_t	now;
 		int			elapsed_secs;
@@ -573,11 +573,14 @@ CheckpointerMain(const void *startup_data, size_t startup_data_len)
 				continue;		/* no sleep for us ... */
 			cur_timeout = Min(cur_timeout, XLogArchiveTimeout - elapsed_secs);
 		}
+		pg_usleep(1000L);
 
+		#if 0
 		(void) WaitLatch(MyLatch,
 						 WL_LATCH_SET | WL_TIMEOUT | WL_EXIT_ON_PM_DEATH,
 						 cur_timeout * 1000L /* convert to ms */ ,
 						 WAIT_EVENT_CHECKPOINTER_MAIN);
+		#endif
 	}
 
 	/*
diff --git a/src/backend/replication/slot.c b/src/backend/replication/slot.c
index c64f020742f..c1f1241309d 100644
--- a/src/backend/replication/slot.c
+++ b/src/backend/replication/slot.c
@@ -1810,7 +1810,7 @@ InvalidatePossiblyObsoleteSlot(uint32 possible_causes,
 		 */
 		SpinLockAcquire(&s->mutex);
 
-		Assert(s->data.restart_lsn >= s->last_saved_restart_lsn);
+		//Assert(s->data.restart_lsn >= s->last_saved_restart_lsn);
 
 		restart_lsn = s->data.restart_lsn;
 
diff --git a/src/backend/replication/walreceiver.c b/src/backend/replication/walreceiver.c
index 8c4d0fd9aed..d705cba5ae5 100644
--- a/src/backend/replication/walreceiver.c
+++ b/src/backend/replication/walreceiver.c
@@ -396,6 +396,9 @@ WalReceiverMain(const void *startup_data, size_t startup_data_len)
 
 			/* Initialize LogstreamResult and buffers for processing messages */
 			LogstreamResult.Write = LogstreamResult.Flush = GetXLogReplayRecPtr(NULL);
+			elog(LOG, "WalReceiverMain LogstreamResult.Flush initialized to %X/%X",
+				 LSN_FORMAT_ARGS(LogstreamResult.Flush));
+
 			initStringInfo(&reply_message);
 
 			/* Initialize nap wakeup times. */
@@ -960,6 +963,8 @@ XLogWalRcvWrite(char *buf, Size nbytes, XLogRecPtr recptr, TimeLineID tli)
 		buf += byteswritten;
 
 		LogstreamResult.Write = recptr;
+		elog(LOG, "XLogWalRcvFlush LogstreamResult.Write set to %X/%X",
+			 LSN_FORMAT_ARGS(LogstreamResult.Write));
 	}
 
 	/* Update shared-memory status */
@@ -994,6 +999,9 @@ XLogWalRcvFlush(bool dying, TimeLineID tli)
 
 		LogstreamResult.Flush = LogstreamResult.Write;
 
+		elog(LOG, "XLogWalRcvFlush LogstreamResult.Flush initialized to %X/%X",
+			 LSN_FORMAT_ARGS(LogstreamResult.Flush));
+
 		/* Update shared-memory status */
 		SpinLockAcquire(&walrcv->mutex);
 		if (walrcv->flushedUpto < LogstreamResult.Flush)
@@ -1138,7 +1146,7 @@ XLogWalRcvSendReply(bool force, bool requestReply)
 	pq_sendbyte(&reply_message, requestReply ? 1 : 0);
 
 	/* Send it */
-	elog(DEBUG2, "sending write %X/%X flush %X/%X apply %X/%X%s",
+	elog(LOG, "sending write %X/%X flush %X/%X apply %X/%X%s",
 		 LSN_FORMAT_ARGS(writePtr),
 		 LSN_FORMAT_ARGS(flushPtr),
 		 LSN_FORMAT_ARGS(applyPtr),
diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c
index f2c33250e8b..3192581cb4c 100644
--- a/src/backend/replication/walsender.c
+++ b/src/backend/replication/walsender.c
@@ -2377,7 +2377,14 @@ PhysicalConfirmReceivedLocation(XLogRecPtr lsn)
 	if (slot->data.restart_lsn != lsn)
 	{
 		changed = true;
+
+		if (lsn < slot->data.restart_lsn)
+			elog(LOG, "crash scenario - slot %s, cannot confirm a restart LSN (%X/%X) that is older than the current one (%X/%X)",
+				 NameStr(slot->data.name), LSN_FORMAT_ARGS(lsn), LSN_FORMAT_ARGS(slot->data.restart_lsn));
+
 		slot->data.restart_lsn = lsn;
+		elog(LOG, "PhysicalConfirmReceivedLocation replication slot \"%s\" set restart_lsn to %X/%X",
+			 NameStr(slot->data.name), LSN_FORMAT_ARGS(slot->data.restart_lsn));
 	}
 	SpinLockRelease(&slot->mutex);
 
diff --git a/src/test/recovery/t/040_standby_failover_slots_sync.pl b/src/test/recovery/t/040_standby_failover_slots_sync.pl
index 9c8b49e942d..a23d0561a2f 100644
--- a/src/test/recovery/t/040_standby_failover_slots_sync.pl
+++ b/src/test/recovery/t/040_standby_failover_slots_sync.pl
@@ -401,570 +401,4 @@ $primary->safe_psql('postgres',
 # the failover slots.
 $primary->wait_for_replay_catchup($standby1);
 
-$standby1->safe_psql('postgres', "SELECT pg_sync_replication_slots();");
-
-# Two xl_running_xacts logs are generated here. When decoding the first log, it
-# only serializes the snapshot, without advancing the restart_lsn to the latest
-# position. This is because if a transaction is running, the restart_lsn can
-# only move to a position before that transaction. Hence, the second
-# xl_running_xacts log is needed, the decoding for which allows the restart_lsn
-# to advance to the last serialized snapshot's position (the first log).
-$primary->safe_psql(
-	'postgres', qq(
-		BEGIN;
-		SELECT txid_current();
-		SELECT pg_log_standby_snapshot();
-		COMMIT;
-		BEGIN;
-		SELECT txid_current();
-		SELECT pg_log_standby_snapshot();
-		COMMIT;
-));
-
-# Advance the restart_lsn to the position of the first xl_running_xacts log
-# generated above. Note that there might be concurrent xl_running_xacts logs
-# written by the bgwriter, which could cause the position to be advanced to an
-# unexpected point, but that would be a rare scenario and doesn't affect the
-# test results.
-$primary->safe_psql('postgres',
-	"SELECT pg_replication_slot_advance('snap_test_slot', pg_current_wal_lsn());"
-);
-
-# Wait for the standby to catch up so that the standby is not lagging behind
-# the failover slots.
-$primary->wait_for_replay_catchup($standby1);
-
-# Log a message that will be consumed on the standby after promotion using the
-# synced slot. See the test where we promote standby (Promote the standby1 to
-# primary.)
-$primary->safe_psql('postgres',
-	"SELECT pg_logical_emit_message(false, 'test', 'test');");
-
-# Get the confirmed_flush_lsn for the logical slot snap_test_slot on the primary
-my $confirmed_flush_lsn = $primary->safe_psql('postgres',
-	"SELECT confirmed_flush_lsn from pg_replication_slots WHERE slot_name = 'snap_test_slot';"
-);
-
-$standby1->safe_psql('postgres', "SELECT pg_sync_replication_slots();");
-
-# Verify that confirmed_flush_lsn of snap_test_slot slot is synced to the standby
-ok( $standby1->poll_query_until(
-		'postgres',
-		"SELECT '$confirmed_flush_lsn' = confirmed_flush_lsn from pg_replication_slots WHERE slot_name = 'snap_test_slot' AND synced AND NOT temporary;"
-	),
-	'confirmed_flush_lsn of slot snap_test_slot synced to standby');
-
-##################################################
-# Test to confirm that the slot synchronization is protected from malicious
-# users.
-##################################################
-
-$primary->psql('postgres', "CREATE DATABASE slotsync_test_db");
-$primary->wait_for_replay_catchup($standby1);
-
-$standby1->stop;
-
-# On the primary server, create '=' operator in another schema mapped to
-# inequality function and redirect the queries to use new operator by setting
-# search_path. The new '=' operator is created with leftarg as 'bigint' and
-# right arg as 'int' to redirect 'count(*) = 1' in slot sync's query to use
-# new '=' operator.
-$primary->safe_psql(
-	'slotsync_test_db', q{
-
-CREATE ROLE repl_role REPLICATION LOGIN;
-CREATE SCHEMA myschema;
-
-CREATE FUNCTION myschema.myintne(bigint, int) RETURNS bool as $$
-		BEGIN
-		  RETURN $1 <> $2;
-		END;
-	  $$ LANGUAGE plpgsql immutable;
-
-CREATE OPERATOR myschema.= (
-	  leftarg    = bigint,
-	  rightarg   = int,
-	  procedure  = myschema.myintne);
-
-ALTER DATABASE slotsync_test_db SET SEARCH_PATH TO myschema,pg_catalog;
-GRANT USAGE on SCHEMA myschema TO repl_role;
-});
-
-# Start the standby with changed primary_conninfo.
-$standby1->append_conf('postgresql.conf',
-	"primary_conninfo = '$connstr_1 dbname=slotsync_test_db user=repl_role'");
-$standby1->start;
-
-# Run the synchronization function. If the sync flow was not prepared
-# to handle such attacks, it would have failed during the validation
-# of the primary_slot_name itself resulting in
-# ERROR:  slot synchronization requires valid primary_slot_name
-$standby1->safe_psql('slotsync_test_db',
-	"SELECT pg_sync_replication_slots();");
-
-# Reset the dbname and user in primary_conninfo to the earlier values.
-$standby1->append_conf('postgresql.conf',
-	"primary_conninfo = '$connstr_1 dbname=postgres'");
-$standby1->reload;
-
-# Drop the newly created database.
-$primary->psql('postgres', q{DROP DATABASE slotsync_test_db;});
-
-##################################################
-# Test to confirm that the slot sync worker exits on invalid GUC(s) and
-# get started again on valid GUC(s).
-##################################################
-
-$log_offset = -s $standby1->logfile;
-
-# Enable slot sync worker.
-$standby1->append_conf('postgresql.conf', qq(sync_replication_slots = on));
-$standby1->reload;
-
-# Confirm that the slot sync worker is able to start.
-$standby1->wait_for_log(qr/slot sync worker started/, $log_offset);
-
-$log_offset = -s $standby1->logfile;
-
-# Disable another GUC required for slot sync.
-$standby1->append_conf('postgresql.conf', qq(hot_standby_feedback = off));
-$standby1->reload;
-
-# Confirm that slot sync worker acknowledge the GUC change and logs the msg
-# about wrong configuration.
-$standby1->wait_for_log(
-	qr/slot synchronization worker will restart because of a parameter change/,
-	$log_offset);
-$standby1->wait_for_log(
-	qr/slot synchronization requires "hot_standby_feedback" to be enabled/,
-	$log_offset);
-
-$log_offset = -s $standby1->logfile;
-
-# Re-enable the required GUC
-$standby1->append_conf('postgresql.conf', "hot_standby_feedback = on");
-$standby1->reload;
-
-# Confirm that the slot sync worker is able to start now.
-$standby1->wait_for_log(qr/slot sync worker started/, $log_offset);
-
-##################################################
-# Test to confirm that confirmed_flush_lsn of the logical slot on the primary
-# is synced to the standby via the slot sync worker.
-##################################################
-
-# Insert data on the primary
-$primary->safe_psql(
-	'postgres', qq[
-	CREATE TABLE tab_int (a int PRIMARY KEY);
-	INSERT INTO tab_int SELECT generate_series(1, 10);
-]);
-
-# Subscribe to the new table data and wait for it to arrive
-$subscriber1->safe_psql(
-	'postgres', qq[
-	CREATE TABLE tab_int (a int PRIMARY KEY);
-	CREATE SUBSCRIPTION regress_mysub1 CONNECTION '$publisher_connstr' PUBLICATION regress_mypub WITH (slot_name = lsub1_slot, failover = true, create_slot = false);
-]);
-
-$subscriber1->wait_for_subscription_sync;
-
-# Do not allow any further advancement of the confirmed_flush_lsn for the
-# lsub1_slot.
-$subscriber1->safe_psql('postgres',
-	"ALTER SUBSCRIPTION regress_mysub1 DISABLE");
-
-# Wait for the replication slot to become inactive on the publisher
-$primary->poll_query_until(
-	'postgres',
-	"SELECT COUNT(*) FROM pg_catalog.pg_replication_slots WHERE slot_name = 'lsub1_slot' AND active='f'",
-	1);
-
-# Get the confirmed_flush_lsn for the logical slot lsub1_slot on the primary
-my $primary_flush_lsn = $primary->safe_psql('postgres',
-	"SELECT confirmed_flush_lsn from pg_replication_slots WHERE slot_name = 'lsub1_slot';"
-);
-
-# Confirm that confirmed_flush_lsn of lsub1_slot slot is synced to the standby
-ok( $standby1->poll_query_until(
-		'postgres',
-		"SELECT '$primary_flush_lsn' = confirmed_flush_lsn from pg_replication_slots WHERE slot_name = 'lsub1_slot' AND synced AND NOT temporary;"
-	),
-	'confirmed_flush_lsn of slot lsub1_slot synced to standby');
-
-##################################################
-# Test that logical failover replication slots wait for the specified
-# physical replication slots to receive the changes first. It uses the
-# following set up:
-#
-#				(physical standbys)
-#				| ----> standby1 (primary_slot_name = sb1_slot)
-#				| ----> standby2 (primary_slot_name = sb2_slot)
-# primary -----	|
-#				(logical replication)
-#				| ----> subscriber1 (failover = true, slot_name = lsub1_slot)
-#				| ----> subscriber2 (failover = false, slot_name = lsub2_slot)
-#
-# synchronized_standby_slots = 'sb1_slot'
-#
-# The setup is configured in such a way that the logical slot of subscriber1 is
-# enabled for failover, and thus the subscriber1 will wait for the physical
-# slot of standby1(sb1_slot) to catch up before receiving the decoded changes.
-##################################################
-
-$backup_name = 'backup3';
-
-$primary->psql('postgres',
-	q{SELECT pg_create_physical_replication_slot('sb2_slot');});
-
-$primary->backup($backup_name);
-
-# Create another standby
-my $standby2 = PostgreSQL::Test::Cluster->new('standby2');
-$standby2->init_from_backup(
-	$primary, $backup_name,
-	has_streaming => 1,
-	has_restoring => 1);
-$standby2->append_conf(
-	'postgresql.conf', qq(
-primary_slot_name = 'sb2_slot'
-));
-$standby2->start;
-$primary->wait_for_replay_catchup($standby2);
-
-# Configure primary to disallow any logical slots that have enabled failover
-# from getting ahead of the specified physical replication slot (sb1_slot).
-$primary->append_conf(
-	'postgresql.conf', qq(
-synchronized_standby_slots = 'sb1_slot'
-));
-$primary->reload;
-
-# Create another subscriber node without enabling failover, wait for sync to
-# complete
-my $subscriber2 = PostgreSQL::Test::Cluster->new('subscriber2');
-$subscriber2->init;
-$subscriber2->start;
-$subscriber2->safe_psql(
-	'postgres', qq[
-	CREATE TABLE tab_int (a int PRIMARY KEY);
-	CREATE SUBSCRIPTION regress_mysub2 CONNECTION '$publisher_connstr' PUBLICATION regress_mypub WITH (slot_name = lsub2_slot);
-]);
-
-$subscriber2->wait_for_subscription_sync;
-
-$subscriber1->safe_psql('postgres',
-	"ALTER SUBSCRIPTION regress_mysub1 ENABLE");
-
-my $offset = -s $primary->logfile;
-
-# Stop the standby associated with the specified physical replication slot
-# (sb1_slot) so that the logical replication slot (lsub1_slot) won't receive
-# changes until the standby comes up.
-$standby1->stop;
-
-# Create some data on the primary
-my $primary_row_count = 20;
-$primary->safe_psql('postgres',
-	"INSERT INTO tab_int SELECT generate_series(11, $primary_row_count);");
-
-# Wait until the standby2 that's still running gets the data from the primary
-$primary->wait_for_replay_catchup($standby2);
-$result = $standby2->safe_psql('postgres',
-	"SELECT count(*) = $primary_row_count FROM tab_int;");
-is($result, 't', "standby2 gets data from primary");
-
-# Wait for regress_mysub2 to get the data from the primary. This subscription
-# was not enabled for failover so it gets the data without waiting for any
-# standbys.
-$primary->wait_for_catchup('regress_mysub2');
-$result = $subscriber2->safe_psql('postgres',
-	"SELECT count(*) = $primary_row_count FROM tab_int;");
-is($result, 't', "subscriber2 gets data from primary");
-
-# Wait until the primary server logs a warning indicating that it is waiting
-# for the sb1_slot to catch up.
-$primary->wait_for_log(
-	qr/replication slot \"sb1_slot\" specified in parameter "synchronized_standby_slots" does not have active_pid/,
-	$offset);
-
-# The regress_mysub1 was enabled for failover so it doesn't get the data from
-# primary and keeps waiting for the standby specified in synchronized_standby_slots
-# (sb1_slot aka standby1).
-$result =
-  $subscriber1->safe_psql('postgres',
-	"SELECT count(*) <> $primary_row_count FROM tab_int;");
-is($result, 't',
-	"subscriber1 doesn't get data from primary until standby1 acknowledges changes"
-);
-
-# Start the standby specified in synchronized_standby_slots (sb1_slot aka standby1) and
-# wait for it to catch up with the primary.
-$standby1->start;
-$primary->wait_for_replay_catchup($standby1);
-$result = $standby1->safe_psql('postgres',
-	"SELECT count(*) = $primary_row_count FROM tab_int;");
-is($result, 't', "standby1 gets data from primary");
-
-# Now that the standby specified in synchronized_standby_slots is up and running, the
-# primary can send the decoded changes to the subscription enabled for failover
-# (i.e. regress_mysub1). While the standby was down, regress_mysub1 didn't
-# receive any data from the primary. i.e. the primary didn't allow it to go
-# ahead of standby.
-$primary->wait_for_catchup('regress_mysub1');
-$result = $subscriber1->safe_psql('postgres',
-	"SELECT count(*) = $primary_row_count FROM tab_int;");
-is($result, 't',
-	"subscriber1 gets data from primary after standby1 acknowledges changes");
-
-##################################################
-# Verify that when using pg_logical_slot_get_changes to consume changes from a
-# logical failover slot, it will also wait for the slots specified in
-# synchronized_standby_slots to catch up.
-##################################################
-
-# Stop the standby associated with the specified physical replication slot so
-# that the logical replication slot won't receive changes until the standby
-# slot's restart_lsn is advanced or the slot is removed from the
-# synchronized_standby_slots list.
-$primary->safe_psql('postgres', "TRUNCATE tab_int;");
-$primary->wait_for_catchup('regress_mysub1');
-$standby1->stop;
-
-# Disable the regress_mysub1 to prevent the logical walsender from generating
-# more warnings.
-$subscriber1->safe_psql('postgres',
-	"ALTER SUBSCRIPTION regress_mysub1 DISABLE");
-
-# Wait for the replication slot to become inactive on the publisher
-$primary->poll_query_until(
-	'postgres',
-	"SELECT COUNT(*) FROM pg_catalog.pg_replication_slots WHERE slot_name = 'lsub1_slot' AND active = 'f'",
-	1);
-
-# Create a logical 'test_decoding' replication slot with failover enabled
-$primary->safe_psql('postgres',
-	"SELECT pg_create_logical_replication_slot('test_slot', 'test_decoding', false, false, true);"
-);
-
-my $back_q = $primary->background_psql(
-	'postgres',
-	on_error_stop => 0,
-	timeout => $PostgreSQL::Test::Utils::timeout_default);
-
-# pg_logical_slot_get_changes will be blocked until the standby catches up,
-# hence it needs to be executed in a background session.
-$offset = -s $primary->logfile;
-$back_q->query_until(
-	qr/logical_slot_get_changes/, q(
-   \echo logical_slot_get_changes
-   SELECT pg_logical_slot_get_changes('test_slot', NULL, NULL);
-));
-
-# Wait until the primary server logs a warning indicating that it is waiting
-# for the sb1_slot to catch up.
-$primary->wait_for_log(
-	qr/replication slot \"sb1_slot\" specified in parameter "synchronized_standby_slots" does not have active_pid/,
-	$offset);
-
-# Remove the standby from the synchronized_standby_slots list and reload the
-# configuration.
-$primary->adjust_conf('postgresql.conf', 'synchronized_standby_slots', "''");
-$primary->reload;
-
-# Since there are no slots in synchronized_standby_slots, the function
-# pg_logical_slot_get_changes should now return, and the session can be
-# stopped.
-$back_q->quit;
-
-$primary->safe_psql('postgres',
-	"SELECT pg_drop_replication_slot('test_slot');");
-
-# Add the physical slot (sb1_slot) back to the synchronized_standby_slots for further
-# tests.
-$primary->adjust_conf('postgresql.conf', 'synchronized_standby_slots',
-	"'sb1_slot'");
-$primary->reload;
-
-# Enable the regress_mysub1 for further tests
-$subscriber1->safe_psql('postgres',
-	"ALTER SUBSCRIPTION regress_mysub1 ENABLE");
-
-##################################################
-# Test that logical replication will wait for the user-created inactive
-# physical slot to catch up until we remove the slot from synchronized_standby_slots.
-##################################################
-
-$offset = -s $primary->logfile;
-
-# Create some data on the primary
-$primary_row_count = 10;
-$primary->safe_psql('postgres',
-	"INSERT INTO tab_int SELECT generate_series(1, $primary_row_count);");
-
-# Wait until the primary server logs a warning indicating that it is waiting
-# for the sb1_slot to catch up.
-$primary->wait_for_log(
-	qr/replication slot \"sb1_slot\" specified in parameter "synchronized_standby_slots" does not have active_pid/,
-	$offset);
-
-# The regress_mysub1 doesn't get the data from primary because the specified
-# standby slot (sb1_slot) in synchronized_standby_slots is inactive.
-$result =
-  $subscriber1->safe_psql('postgres', "SELECT count(*) = 0 FROM tab_int;");
-is($result, 't',
-	"subscriber1 doesn't get data as the sb1_slot doesn't catch up");
-
-# Remove the standby from the synchronized_standby_slots list and reload the
-# configuration.
-$primary->adjust_conf('postgresql.conf', 'synchronized_standby_slots', "''");
-$primary->reload;
-
-# Since there are no slots in synchronized_standby_slots, the primary server should now
-# send the decoded changes to the subscription.
-$primary->wait_for_catchup('regress_mysub1');
-$result = $subscriber1->safe_psql('postgres',
-	"SELECT count(*) = $primary_row_count FROM tab_int;");
-is($result, 't',
-	"subscriber1 gets data from primary after standby1 is removed from the synchronized_standby_slots list"
-);
-
-# Add the physical slot (sb1_slot) back to the synchronized_standby_slots for further
-# tests.
-$primary->adjust_conf('postgresql.conf', 'synchronized_standby_slots',
-	"'sb1_slot'");
-$primary->reload;
-
-##################################################
-# Test the synchronization of the two_phase setting for a subscription with the
-# standby. Additionally, prepare a transaction before enabling the two_phase
-# option; subsequent tests will verify if it can be correctly replicated to the
-# subscriber after committing it on the promoted standby.
-##################################################
-
-$standby1->start;
-
-# Prepare a transaction
-$primary->safe_psql(
-	'postgres', qq[
-	BEGIN;
-	INSERT INTO tab_int values(0);
-	PREPARE TRANSACTION 'test_twophase_slotsync';
-]);
-
-$primary->wait_for_replay_catchup($standby1);
-$primary->wait_for_catchup('regress_mysub1');
-
-# Disable the subscription to allow changing the two_phase option.
-$subscriber1->safe_psql('postgres',
-	"ALTER SUBSCRIPTION regress_mysub1 DISABLE");
-
-# Wait for the replication slot to become inactive on the publisher
-$primary->poll_query_until(
-	'postgres',
-	"SELECT COUNT(*) FROM pg_catalog.pg_replication_slots WHERE slot_name = 'lsub1_slot' AND active='f'",
-	1);
-
-# Set two_phase to true and enable the subscription
-$subscriber1->safe_psql(
-	'postgres', qq[
-	ALTER SUBSCRIPTION regress_mysub1 SET (two_phase = true);
-	ALTER SUBSCRIPTION regress_mysub1 ENABLE;
-]);
-
-$primary->wait_for_catchup('regress_mysub1');
-
-my $two_phase_at = $primary->safe_psql('postgres',
-	"SELECT two_phase_at from pg_replication_slots WHERE slot_name = 'lsub1_slot';"
-);
-
-# Confirm that two_phase setting of lsub1_slot slot is synced to the standby
-ok( $standby1->poll_query_until(
-		'postgres',
-		"SELECT two_phase AND '$two_phase_at' = two_phase_at from pg_replication_slots WHERE slot_name = 'lsub1_slot' AND synced AND NOT temporary;"
-	),
-	'two_phase setting of slot lsub1_slot synced to standby');
-
-# Confirm that the prepared transaction is not yet replicated to the
-# subscriber.
-$result = $subscriber1->safe_psql('postgres',
-	"SELECT count(*) = 0 FROM pg_prepared_xacts;");
-is($result, 't',
-	"the prepared transaction is not replicated to the subscriber");
-
-##################################################
-# Promote the standby1 to primary. Confirm that:
-# a) the slot 'lsub1_slot' and 'snap_test_slot' are retained on the new primary
-# b) logical replication for regress_mysub1 is resumed successfully after failover
-# c) changes from the transaction prepared 'test_twophase_slotsync' can be
-#    consumed from the synced slot 'snap_test_slot' once committed on the new
-#    primary.
-# d) changes can be consumed from the synced slot 'snap_test_slot'
-##################################################
-$primary->wait_for_replay_catchup($standby1);
-
-# Capture the time before the standby is promoted
-my $promotion_time_on_primary = $standby1->safe_psql(
-	'postgres', qq[
-    SELECT current_timestamp;
-]);
-
-$standby1->promote;
-
-# Capture the inactive_since of the synced slot after the promotion.
-# The expectation here is that the slot gets its inactive_since as part of the
-# promotion. We do this check before the slot is enabled on the new primary
-# below, otherwise, the slot gets active setting inactive_since to NULL.
-my $inactive_since_on_new_primary =
-  $standby1->validate_slot_inactive_since('lsub1_slot',
-	$promotion_time_on_primary);
-
-is( $standby1->safe_psql(
-		'postgres',
-		"SELECT '$inactive_since_on_new_primary'::timestamptz > '$inactive_since_on_primary'::timestamptz"
-	),
-	"t",
-	'synchronized slot has got its own inactive_since on the new primary after promotion'
-);
-
-# Update subscription with the new primary's connection info
-my $standby1_conninfo = $standby1->connstr . ' dbname=postgres';
-$subscriber1->safe_psql('postgres',
-	"ALTER SUBSCRIPTION regress_mysub1 CONNECTION '$standby1_conninfo';");
-
-# Confirm the synced slot 'lsub1_slot' is retained on the new primary
-is( $standby1->safe_psql(
-		'postgres',
-		q{SELECT count(*) = 2 FROM pg_replication_slots WHERE slot_name IN ('lsub1_slot', 'snap_test_slot') AND synced AND NOT temporary;}
-	),
-	't',
-	'synced slot retained on the new primary');
-
-# Commit the prepared transaction
-$standby1->safe_psql('postgres',
-	"COMMIT PREPARED 'test_twophase_slotsync';");
-$standby1->wait_for_catchup('regress_mysub1');
-
-# Confirm that the prepared transaction is replicated to the subscriber
-is($subscriber1->safe_psql('postgres', q{SELECT count(*) FROM tab_int;}),
-	"11", 'prepared data replicated from the new primary');
-
-# Insert data on the new primary
-$standby1->safe_psql('postgres',
-	"INSERT INTO tab_int SELECT generate_series(11, 20);");
-$standby1->wait_for_catchup('regress_mysub1');
-
-# Confirm that data in tab_int replicated on the subscriber
-is($subscriber1->safe_psql('postgres', q{SELECT count(*) FROM tab_int;}),
-	"21", 'data replicated from the new primary');
-
-# Consume the data from the snap_test_slot. The synced slot should reach a
-# consistent point by restoring the snapshot at the restart_lsn serialized
-# during slot synchronization.
-$result = $standby1->safe_psql('postgres',
-	"SELECT count(*) FROM pg_logical_slot_get_changes('snap_test_slot', NULL, NULL) WHERE data ~ 'message*';"
-);
-
-is($result, '1', "data can be consumed using snap_test_slot");
-
 done_testing();
040_standby_failover_slots_sync_logs.7zapplication/x-compressed; name=040_standby_failover_slots_sync_logs.7zDownload
7z��'���U[$U��
����%intg�|n�L���c1�;W'�PAT�Z�n��	xi|w��5��	*�f�0F�������	HL����(��6�l�nH��oO�-z&����SL�.c�i���[��dw����s��S�V���Z[��4Y8dE$:LbL�����f�o��rV�~d���c���4���
%�����v����Y;�:Jf�"
���`���"�j@M��~=<��j7(6d��F<u���+��@JJ����"|;���B��\�G�R@5�����+�Z{7����m?{����'��T�4:4���Q&��d���6��r��_9\�H��{�z��e�4�~a�b9�]]���s[����S���G_3�����t�����q�B6^<��)�������*�{E�����U�����'���g	?�����)-O<�6���=��L`���b&��4��n,���V����|����m����P�@�U�{��gj��|y�w��K�P������.:���|	���,��h?�I���
��jk6<5SPP��vN�����X\�,�w��}�u@���h'�qj?�Q�)IZq:���F@�>q�N����c�$Q��egc#e�/f&8!����t�������o��c��"������f��>GVy��u�P<�������<�SP���!<R��)vq��������bKq��f��~��(
@�
��F��]3R���p�����n��PCHB?��W�t�����������)��m��(h\!��vp��3n�w���]��bO��~X��&<�h~��[����k����@�C���G���A�������'&�z�Jg���5�c���V�������x�q���q�`[��*a�k�=�^C�@�]�R��Uzvq����z��&�#]��V;�2�Z�]v���	l]����4�������I��1�w���(��$��7�E�cCj����ib�G������4����j���(��]���&��'����\�MC|%u,�p�:W�}�<�[���lz�6����F�q���|��S��������<__3����IB��;�S'/�	{d.a�/�g��Uj�"���E(?��,1&�p���������i*�Zr�6e��E_��f��(�����E\%���`YL[
��i�+�����&]*����g�_-y�(0#�B����K����
�����6 ����4�Z�/��z�:o�9�Epf������*]1��Nvy�
pbg��>@���_M]��e�������<F���Fy��i���D{���/����:H[1�L��
��M��8��/��+����\xI<��N���z����@�^'XQL���x6�L���)����v���=����S�0=�s>�(=�X52?�z��S;9���Z��s%��'l�k��l(4B����f���h�q��:�+������~��Z�(��EH]I���3y�����x0b $���O��[(��~���jv'�wN��\!T>
0����Td/������n-�t�
��L�d}��9��,��,�_�������c�� �����)�]�c��4�U��r�]p���2�?FV��'@d;��$�1���E4���a+uj8.
}���t�T�=�K%�}��,k���5���:{r6

V���2�\����R�Om��P�������F� ����zpI�1�c��PA<X��%���������3� ��������)� ��X5��)E���$�fF����$���?S����w���Z0b
1c�97NO���c31s�s��~:x`���zb�d\�4�-�|X��F���fy������f�gI]P^��e��0b*c�����I7.s���{��?}��Eg�����^�����r�W��t����q�D��k��E��1��9��V�os�7���������fU��.�]������N��[>5�G�2t-R����R}s���>�M�LY��r�=4�j?�(��P������zF��)3�;@\��H�e�,-��M4��i'f�������v
+w�t�<�n@��qi���C\��!���u������vB�q�|����$�&��_ �I�k�NLj���;8Z(�f;���	����S��Tb.��S�����	C�,�G������!��O����:���zR12�o��;��w?�6�l-��vEF��]QT�o���$Ag"1����M���W�1��U&{�p�o-]�!����N�>�FD���;�+X�oew����V��pn�)R
��84J�3�C.�G�^���*Og�D�K_�����cp$a��i?�l4_���L�hN��O��x��I+�5��j<�v����z� ����ryZ����)����qo����VV����V����}�m��K�:�D�&YO�������:�=���
�<�1+�KtV�\��[�FE%���>B=��M��}8H?S������v�N;�����JnE[$%:tc!��������y����UV��B��tfJ��9��5��7#�.1�.H4�4���{�A�����,�	������	q|A�jec����������(���H��G9�3�g�I����+�-QZ��)����Pld���c�7��_�<�\`�h����wJ��9PM5���5{��n�|�
'j�'�22���I��U����H��^�s0����u�K)��OO�
�5�(@7��{ W\������
E�nYK�^���pN6k��MQ��[��m��PB=���(���rva\}t^�`�\�'.���Sd�����`�I[���	~*� �jQ-9�'�z�?�(R�4\��Z�$��L
:�"���{��8�:���2��6��vc��0����,��N2�����apwR&`��J��"�"�����=7'��������?n�0�����`��]Y�)g�4���=I�I�3�z!�����w����2��	,�1��u��;��t"���?�?�fP,�>�
�A��y|Jt&��8�!��� ^�kY�:���O��s�)�����
��.B������n��#����$�>������RJr2����=�x7��PIy��&N�'n�E�Rs�C^���`1������@5+���TH�ZH>��T�t��$�,�'�X@j���<��V�,#����)ff	���R�M�z�oJ���>~ <��J4��=K��V��R���3��UV�<���qRL.`=���A�_�/���T	�����4U�FZK���Q�5?���@	����a��A����x�l^��7r����:,^�0I���>�w2)�*%��
��k���b3���apZ��Qpi$#g7����[B'�G��$�C
��
���>K�aQP�8��L�dRh�+W��F�a�m������u���-�-���a��$�z�
�M6�%�"jd�xgB���W,���{Q��r:w��j���E��9w����-��,p��3t'Z�S����cik����	Bdf�b��.��6��?*���UY4hEL��6��_I��m�����h���z��H�f��
�cV����Z�����HY��?�hC#�u,�V����,�`t�<�Yk_&h�B1�����|����P��6K���6�[>'���i���
���p�-����u�F,X���H�*P��us�{������@�=��$���"Z�w�g�Gpv�
�y1�"&�n��1�z��?�4x����Z�&`�ol�R\���\�P9��.�[�n����{����B�W��������,v�L"^7U���=��!�C@�3C��Ob�#'n���?�7���7�b�\yW�8���1Mp��Pc�V��0P�qI�2�2��%pj�D�{���,l&�e�������I3e�w��V����].���z�g#��i�_)��f1�EF;����8:S�a������o�8����8	�p1�n�q	gCI�G��^��*���[a��1Bh��]�������-_�[?���jTq�#S���A�1������l)"V���s�m�k��x-��s����Rg#Y'#*�Y��NY;��������������kQ1��e�����sK��x�e�����@k����}M=��r=�����K��������+����&j+��j4��{U��5-5������Om3����|��f}�4bY���&n�$u���V�!�)�+�������4'��D��L�#��[���Kz��C�Y�(-��F7�*��w�QSU�g0�TUc��Cz���k ��L�]C<���l������]	W�M�=#���y�pD}H@�%������Q��`��|:�����O�s���L79G>0��� �����f�mCV`M��k�9�Mf9����Q]+i_��tg�o2���\����S�(�
U��.�#����Tu~��*���V��l ����<� ?�6�����J����j�e9p���w0*��_��_H����9	���S���0�$�#���/fg�3��'��>Z�u�L?Z�n��\-��V���l;N�+�bA��	��"����n�L�d���|�l�O
6�5-<"N��1Q2�m���1�V;^�������.*e�	$�������9F������j��b���pu�M���/d�hD��R��V�t��|k�=S�@�]2��|�`��IY&I?l��D�i�V�{����Xn��A��qow=����C��lD�u���%��B�L���	w��dG��^�_�i{<�J��
2�$��&]�����i�xt���y���6m�P7c��\�?�������6^��W�P2Qr�t�Vq)8�����&�9xk�)��&�+i����P�}��Nz:���km�����v��?�>
���_�Z\�l9b']����������i�f��5�}'�\���/���guH�b��#b��2L:�fq��k��N#�L~�Av��������t�T2�1��6;L$�p�_�.�>����H
\�^3�TZ��>W��
2����s���t�~����1����q�U��A�*3zq�S��$ �~�zbTFg$���K��L������z]W�������f�X�6�S�4�Jo�@D`D�!%F���M)rlB��t@����������0W7�R'��0��?��|w�V�����Y��q��|��������u�����j��eeD�C�b�6$���O�f*
[)��b�|v8�K�
��L�'�=P"����[w.�����D������o��������?,��kr%�6���hr�"��}@�X�9�J��NGJgbca������Q��
p��\u��o��O�������TX���`n.�r������v��.
�����8O���*��YF��Xf2:7&;���Lr�;R#52�C����Z���
��T�rP�/��@�`i�rTN��2�����(�t��W��Y�	/��"]���_\5~x�Tk,�Lm�<.����?��������m��z�p���K����\A���n��U�Q����lA��<S�����Q�������F���nU��uPU������}��9�������BV���h�?qy�����K�)��^�I�����8�k.+�#o���]�g��r����$G] ��3�z�����^��2���?fer�@~Z�TzN��Y�����&;��(8Ra8���@�	�*�����M��C����G?u'{�;B��0�P��i��Z��+�����Y�hg��3�y0��#�PA�����j����	�uS��.��	'�`��M�RD�����w{~�x�=*��uc�%�A�9J�b3d�4�$7fKZ�c@��V�c�U��G��av�P�c����xh���������G�+h�O�T1Wl�n;"x�GE� R�t� ������	+��
�S�B+S�>`(�/9��AWQ��>"�3�U��;��WP\:�R��+i�z����>0= �$�e>�0q�'I>*���'��{*K<<�x>�
|����������~�
\��Lo9�l����=J�������V�t�h��I��9-[��c�	�[������:���+����f����
��K��I�SLG�Jq�>8������� ���i%�\
�'k�9a���a������86�T���3�M��=�������cW����f���-����t:��i���0f�����QvL=*:���A�� ��D���d��*n���O�w<	5�'<�9N����y�������=�Z����1!b�5��<���:�hh8��[5��L��p/��d7z���M����B���>��F�a�h�b|�K��!���j���q�OD�g'!�W�a/���s|��I���F�
m��8a�t���OV�������������A���:��;`���I�,�F.+�bN�`��[��j�A���NT�� (�g<�W���EI�v
��D�d����w�
;�6���Y%�dI������ c��E��5�NUi��a@G$P����1/��z�Uj�Uz=F3�#�$W!mg!.��V;�5��������V{PT���R����:���#j{�-C<&�i��{1���J^��F^�{����Yoc7�a�Q:2Y/�|��9��Y�����k����s���^3d��m�yO8@+��=�@��!��������s��d1.���}]!OJ�-`BTP�Vl��gw%������
!O�����DN;wphYy:��6=���Q`To���H�L��.��Ba���v�J�s���&W`Y���f�~������-m0��N��S���S�S�^��I�C�]w��h��vw�����k}�.��A\�`&����H�F�b.��R���R��@�����i^9�V3 z�;�Y�7B�G�z6���+�,,���L�A�������m@���s��D������2��;�#YW/���:������,O$iZ��f���6�D��F;������Gtv��1�J�5���IN��D}v�F	�8����J�t���&v��N)����&LM���e�Dp�\���LB,��������D%�5����s�s81��z>��GX~��7"��?U����Ik?A��J��@����wx^]o���0
0��o}LYR��)�pDS��lh@W	��Gm��g��k��s����������G��0qq~70��f`d>����Cg���i[���r#����2v��6�]]w��c�\����&�uxb/efv�P�t<�m����@�Zc�A��]�"��=��kULCg�0��8�B����2
;�3�9yh�G$��6����'��M&�\B�����<{h��H���V(�H99���3����;�U?��?������W#V2�k������E���M)����e�<�W=�j�����8��	sQ�������v�'�.��/���A,5���P	b%�"K���e�H�w������?%P�dEE��V@�>lU�1��S�������������
N���Tx�|��[���������j�!��.�����;��f��3R����s����/����)�[�=� ~������P�����l<��U'4�U���7x)�������1�j>�%��'J@��<����o&E�\��Q?/u=���M���� �GS
��
.G����r58����C����q��!��3�+�yW�_�Fcx��)�/r~F���3��&"���t�b�������JLeJ����Ha���I��8y�6�JH����G����R�g~���_59�Jr��;la��z�?
����9�5�t,�i������Z:�A�:�}������%�����|"[���f�d9�w�c����#�6��A;;Q�(�U�����&q�(q��*Rj����E��k���Mi��<��Q�sae����E%�J_��iA�0�^^�ov������"�D���~C���k�S�|�d�*����d>��=����{)�� ���[O���\��lD}���P���Yg?��������	K�����S��9�#�/X����Y���W�:�gA�huu��� f�Z�����2*_)y��D�HW���o�����)��2��-��>��`��=�����T�
�B���$^U��p��(}���������������vGl����:5��g�Y	fQ\`>�������h�@I��p8Wy��Vv+����TE�<
�r��������{�o
q�����#u�FXD�*��6�R��}/b�U��V)�0[3��������=�u�I���?��Q0E��x$������)�1�=��%x&j�W+@����W�Vo�#-��1�rP��v6�q���J�J��c�E�0K���RE��_}��]�Ei�����W=�8j��������Ds�;^�F�8�-�iz��L�Y;�`A~z�9K���,��$p�n���z���l��g%��5nh�>a��v7�3a�?��"�d��aR�V�&#�*�cG}�p|t���O*�x�����.���A��5u}�
��o�?��T��#G�/���k�JQ���"&:�92,g��S��W������"]T�VG����,��2m���������#�����m1�0v������T�Pv�A����t��G�w4N���_���x������c��U��r�Wao��� T[�GJ��p���
���*P����E�L��g`-�-<0
�61��rD`/fl�kL5����.x
����7��1�?��p�i�x����B����iJoS/_'��%'�S����,���zM��	�������2!ZA������!����>+b�`��[����>���e&��vb��+ �!�!�^&�F�RBDV���FS���s	������E��7�1�����N�#\��Ne�U�B!���\j��������H�)�
�Y�f:����_�j��g�����\���	��7�V�8�
���b�~Qj�j����_h�7�r1H����%���v�/���+t��_���	��O3��{�����FfP����r:�4S
C��,����*�w�_V�C`�@d��K=���
?v3d�
:��<�w�k�#�D���!17k'L4U�Yp���@2�T���P�w����:-������,?�C�0N~g��A�)�O8U����K�e�������YC�o��LCB�y���{���Z���A���� �q��\%=KR7sc��p!5�Hl����s:,o�����L�V����C���G'�}������x�PZp�Y��Y�nU+#��]�1h`z�ZM��X�"t2�@������>���u��GL=f2������	���tA��|����Y��e�k(����a��2��1�t�����pQ8�A������-f�.�S��Ii�c��*G����R4��_�}�����]���)O�+y����&YR+���?!�L�*��u��]c�uC�������0
6y]�P�Xo?���
}����#]7�^Ly�H���h�:O��P.B��Km�t]��%�5���B��7��<Lq\_�O��m����4��E��O_��r���z����>#���h�����O�nx��d>����A"~�.�>�9o����{ZM������-����:���@�������uQ7�����<�F1�vr�
�o(�r,-�T/T��6$0^	�����l�^v:l��
�afh1��:G�#���m���^@�k�r&�'k��]�j����\X�P&��gb
��;-� ����o�oGx�6h�B#�8������������M�9
gY}���F
���Ew���E�D�
%a�+���!������������������8��S�O�����?���L��0��2�u�z�	oc(�`^G�6���"�\~\1�7���id�KWx�}��zzLHmg��;������a�y�b�r���c��V|��������-��lpPFm7�!�����>��&�/��n%c�M.O���=.{�QR
^h���/6�"���}�+��~���yg����;_���r�L���1i�
:�r����^�u�u�fN���>�\���#��X�}��g.�7����g���4����������#��?�Zd����<�]��,�b	)����^�=rt��r������_���`�}*W��S��
K3��d�^7����N��qWS0�}y6e
��0?\�;g��[���ER���NeS�������WsZ��,I_�X����Qs�$H�0�w"�]�U�j�C�G���|�2�������}��h;���*�a�N�;]{�Z�����i�����"o��][��7�s\_B����gw!�uey�|��{
��f�sP��^�u�C��&�^_����������3���mQ��kj�_�i���p�s����l}<�	{�X��.w�����F�=k���Nl)4
�B��f�
m[n������n�~���G#(v^��'�����I�.>D��RX~�Rz���� Y�N��=z�SNR�E'�_����!��YS���Nq��f�~�E���)�B�P?p�I�5C��K�Nx�z����Y{���X;�r�B��1/=D������ZdG�������T+(+�o�c�8T�
�C��vC����;�:��oa�������v���
�=�pv�zt�]��hJ�J����m���(���CJ�l�����v_�ch�����S>_���|7v?b[So,��N�*����������+@���K�q��T�qz��g��)�Rr�(�)�����xa����A���}�;���5-^���C[w��J8�Py)=�E�4'�O��P�C#��Ejfq��s6Xd�Q3���57=�	������|#e��b�G9��%��r������$Xs����>�U�I��b�5TN��=(����1��$�z�ovLo
�������P�;����R�3Qz{�$����|�hJAYjGj&Cb���XL�t�#�����j����$��!t�8P����}!����}K�2H���|��y��+b�����D>��CA"��?�z��C'U��KB�P�4�;�0����xE�`����:G*-�_��f�q�����t�������Of5@���p�F���R766�-��q�c�v�lg��e�fE������iK����$n�����s�Gw+%�!U=�B]>q�$��F�����I�w�m&���w�U���i�~"��������=`����sF�0}����� M�����66[�;�Qe>1t��M�^�m4�����u�$�D��gC��Qxl����Q��c���r�V�/�)��l�9�e���X�v�W4�^�lu��"`.%��Z:Z9��v����c����z%^^,?�Sy�YzW�4���
r(��MG��k��|�@�����y1��e�q��9]��2���f5<C���O;K6���e���\5����{��H�����[q�	5�?^��~5qq�Ro��O9�D����C����z����Y"J7\�K����c�1C&P^����9�����+xv�N��<&���h�����?�|�67�!�FW��6X����O(j�1�7�|����{�6���Sb1�h�Ou��+n�����������Vq.�K'VM�^>qm8C�T�K|~7�Z�<-\����L�9h)
���Z��[�@����u��������%�Eu.�T������������3Gq>:���y~�����K�_����^��	/���H��sL�����{N�js*���h�T^�� �@3����u�lr�-�j��e��+,k6i��a�@b�9.�4RQ\'v����&����^����"]������[6M�������p)�p��`�I�����F������(.�{KI��t�4Iy1C i������Tb�J��������B���a(�����	wCX��I�����5���]���r�5���''�J��zW�N�2��4�����qR���t��1�H��� W7-�-Ucx_j����/�-�OD�5��D:B�	�$�g�O`��kv
� ��YT|�����H���g��zw���`�����{��d�������}M���?���9O9%�x�`��:����f��������\���?}�
C��(�6	��J���Z�h�X|~t/����7�Ha��yK�B��tT4:a-�U�O��n�|�������K���X�0@�n�N2-�D��&���
���{��<A�N�R*��8U����&�,�ak�*����6kXF���J[�J���t@��,�iWg�0��u����@F1X�.�\���<��6J2=�F��|�L���=�X������x����j.��J^5BE*yo���]m�����������H��4x��R�U0����;(������)�����F�	�?����?S��l��x�N@U�I�^{�����{���s��7w������z�*�_A�iG�Q���0�b�*����|g����_���W�]qn����/�c���?R��������p5XK<"L�a1m�v��H_oK��v�;|���k5�'ty,�-y�>
�/��+��������Q&Y^����)���S�k~;U�"K%�;,��=�g)�}��n������G�'�����������	�:��-��d��SN�r��w����g!�W}��D>ds�w��%�Y{��<�����t��,��:M�{����9^��|k�%�w��x��7�h��_'�h��`�IB��9���0��h��r�x������4�;}_!/��5����&sA��������;U>������rX�'$����\�>���?3��w-��\��i�Y�c��s�7�k����	JF�{�'�A���H�`��5�L�����J�&�����&�����aa���;��I:m��}���0D���)OT�+��Yn�?���>�`���s�����uw���c�+���B{������2���5�.t�S����A���bS��'*��B|��cw��D&;��[������I�Uq�m���>�V�dwy���q�?\��-h
\=��c=�A�[N\�&�U>�jt�l�����������Du�Ji8��6cCz�M<����k���r��|�~V3y&��D���v���8������{i�������G�:��Xt�7�
����U�� m�s��(>Q
�Y>%����Z��&���($�^���� ����6��+���T�2�@�C�w.���X�.���]��&A�zc�\�HB>������9t�����H$�q��Q��2(.1TB!'6|F�&bqb���I�g0�F�]�D��H-�F@~���N
��N0��!�����o�eh��z�U8��fc�F��0e[bp3�o��5�`>���^��@��W��?�Ao���
��������H(�8�]����l%c �+�����X�X���d&��������`�E��[if#�K���%.����]��P8X6������z��"��������x����}>�A�������.�Ipv
��KA������
��:��a���c������gK�]�V9V��������4Gp�>M�'�����%����'n2:��&3������0i��o����/7^���d��~�u_,&z����b'w��������ir�=�8�����~���]Y�_��7���FeHS���J��������m��� ��*��0���+}@\Ms9�2�N! b�f�BK=1@�FYv����0Q�������<Bf����0=����������,�2(���4�!A/\2A������&�~�r�t�����S���Y�g�\����9�����>Y��\����g�"A3�6��.\pV���!7������f}
�0JA��i��t�7�����!���&0��=���1�B�o
��u9����;e��p�<��By�I#_'*���(u������ ;����3��c�������v�XF�FJ�����p����d�OEa9��!I����������Rn�u��RrH�[���p$�����������ix6z 8������N�#J������Zr��i���|K2����b����e�ey"��������~@hU$�(D�4��T�6�FJ��T���)��l���|��[�P�L"����#�'�������G���K�!,M�-��%v����pVQ�`�

`��������oKkv�|=zVh�@�_�BUW~)j����Q�'����K�-�*�q��]���;�(/��j��F2U�*X���O*����?���Z������~��s�M���F��6��P�C�xN����pSB�v��X��d_��{�J1>�������-J�?���Ix�,�T���'
AT���;Y<���1KJ�N���2��0��O���Q�uL�\�i��H��^Q`h��������ux���n
h��L�n�{5�`�LF����A:#��:�7�;���|���ob�\`�"�&��0��K3��}Z�?<�A���>��b�����5d���"`�l��e����.�gg:/g5�'����
����a|�w.6��������3t����	+`��J������D�����3�U������a,<�lC�������!Z��#J�
��������3��� x]5^�����0S���e,�K!�����K"-��U�p!N������Z���g��������?j���X)#�KU�����:�d��5�a'=�&�L��X@1�eLJ�Ij�K�,���f'|�#���7�`�pd5�	L�=��_?���� :������NO�:��m1�����A::+�J�����U�KR�Gb`��I|�� ���6���%�W3��2�w�h.c���a;p�Y[��jv,<��r�����71���`B,�1���?�0�t��[r��{2����x�	����z&U�c��>����Z�����W�C0����mg��q�4���]O)"Y�[��.ZF���t��z6/p�-^y�t��z�[�L����j���1[t�����1�:&�z��?�O���C}:`������)v��*�e��+o���p����]r'���[�Bm��Z�1�f��i"-,�l����%�X	�� ���2TG9������6��)`�!�_�_�=v,�4x�����B��	���s!�iV��<U8b8�_���0E��tT�s�b��.����M{��DV���O�Ot�����I&u�e]�G������R�,��7�����9��},Wo�(���vb���a ���;z?��1�4)��'�%�&��+�X�-rp4L�����sQJ��y�v�I��$X��E����Yg���1�gM�����A���4��N����.��x��y���sA�����mv��t��������"f�7"�~iM����kU�Q�"�XE*�Y����L���B�&f����Ni��,��
��z	y�I�9�#�E��A��s�(�La	WI���w��;��}I��m���$5�k����*f�J�k�����p-���l��s�O�0��C�*��O����)\��],��xP6�3u�b��O4a	��RS�7g{�M��T-����XU���(nY�������Z����]����Zt9�;���������Ovw�����&�v4cqa)QCe�_J���k��������$|Dz��u��gz�]
����%I��cv�mG����p�3�5���I�#f��Vs�m���:�9#�)��g��fU_��������~����f7�*���THU� �j�O�3�����?T�83�S�c9��~@���P`eSq��9"�[-�R�!;eN��Dy8�1�q��W��C����K���*���\fU�9Obu������������i�)^J�J5K�w+�����)Q��w�v�A5�!�>q�'��v1]R�,6P4*$��@����tl
�!�C>�-�M����l�5_�XGd�
�J5�}��Rln��a��g��W �(]
�*���.%���d:���p�R�D���1aGN��b]���Q�dsY�-��%�+yd���c{��/���d�%���Nz�
v-��Q����P:JmH�� ��TT��^����N�Q#�������r: !T)I���M�{c���X��$����U�v��`������2��w����
�Q�L�h[�d�#V�*.%L`�b�Xc-�F�#Q�WK������������b����.�1:�;����{�hQ�qr��Xg<?*�?-3(�O`z�$E:R���������c���z�O��&O����Gm'Z�0�$'p0�g�����'�������e�kDv�v�.w���N�q���t�� r6�[����o	��kFD�����)B~8<�j�_��-�S�8<�������:"����]L�-6��=h���]�k�_zn�s�~�S������y,��d��u�<�(��2�����P�����<���.X�8K������[y�*���b B�y��$J��{���
&��N���g�P����y;2/��Cf?��~�9���N�p��n��S�\��T��)q!s8>��3�2����A��������'1�T6n�ZeT��k��L�6�������'^�!�lR�$����,�u�[�G05\.�����`�y�����t���#$z�v���f2��w!n�25=	�C�k���X��#q��1������!����	H%�M�����kn�7D*B��0�]����s|j�>z�vv�����������{�8O�z:��l�Q�*�WK����U�R�|��?������F����o������V��Q�F�:�����|�)b��=��E�V9�7���T�e���4M�F��C�1�e��jx�_H"�so��\�k9Q����@�+<�#�pi����	�[8���.�a�[���Lk+m&[��������S.���M�g��(��9�0z��bI��u|CVVt��iu�R���� V�����Cm��,\}<j�V���g��,����������� 1K�z���G8j��PF$;�����V�*4���h�dK�����'�(��9<��H�������w�&3��O=���7�����G��c����i�i>s0d�(�+���h�=E+4�
cd�;F��]�l�?��|5����\�*u&3�l����\1�����>�kgA��;h���bj���y	}
?��[�������j�E����/�Y�=���O�-��|�m9esZ���x�;��V��z8�NA�����"E���jm"�plv�F��b"T�����������6��/����p�����KU�2;Z"8�����N
@���a���x��p������	�O�x�����n��3)�� 4q���s,������o _�tX��G�u���u���t�>��v��xI-��R����;9�6Z�A/@��E/�������:MD�|�a��hH�����7�UfxfO�tn���bR��O�r����oClK_����N��������
MS�������u�����	���*�S��e"n����=������C��5 �k��-�A�,���S&P�����%R�x>����\�}���~ro��x������`*�U�����19�n=hF5��Q�{GeQ�SUc�zU��/f������=�C�W���OT��B�x�s+*IA��k=CE�����g�%�����XTz��B�f�2%�T�;W{!)�F2N�8M\�
8!��/	�jXoFC
�k����GH-[-�����������&IZ%�?�p�l���^L��c���D���ct�yW5�`[��������f	q�Z�c��V�_������fc��m������t�kG��V|�>K(l�O����@#�'��`�41X/�J�6�<�����2:������kY�v2����%a��O�n�`O�"\�t��� )x��1�����|>���!
t�.lFe���x	��	�0���l
���	�80f)[����'���w&�<�|k�|������Co�
W��A�^Q
Me9��N�|�-�L���A����.�>�,A�d�_/O��[���es������
���8��o����������z����U���G��{����0�H�]��r�8�q������{d�^�t�3e��gH�� sInib��{��1�9���5�&�=\�xw��u���H+���&+�~�;����U��F�i^���9�R�h�����i����`�>�h[�YA��X%����
p>w����zQ�Ty�cy��Y9��������m��.�d�[�^��b���qX���^]�*.�����0V
�Ko��6�$��;�CpH��%��������C=�-�<��G��H�Z���(���To�6�%2���#���:����x�d�-��S��S�����r�
g���M=�r��{��?7L�`��U�P���f�jf�i8v��@���6���]�����+Wvv�Z86��|�r�f�]��k>g,���/}�{?�=��
g���D8\�hq{������c��m
TS^�����������o[#�g�*U�=�x
%���6��mrV��a�&��x�d0�yL,���m�?[���a���{|rm���_X���;E���E�N��J`~��������J9���#���g�� �=:f�����Q
(n�����W�M��
�T����g�I�\d��eJ�4����-�%=��&U���#���W���^�Y��'�@1o��HV�).���lM���0pan^����&�f]�z�������B�`C��Q��;j~:��%II�.*
Yp�$���N�����;���dVr��!�Y����W�=gV������>fX��'�'0L�O�� �	 ����3�r�	g���O�����`�x;5��;�%����mL�s�G�e���-C��cV����)�����O��wq*����{�E�}����.<3	�^�B�4�2Y�Z\�|�C��e��&�V��l�Ez�*�x���|j��<��=0�)bt\�-�q��,K�����5���2/w�E�{�Ca�t� 0Y�U����:r��$�3x^"<'
<MR���T!Q����B��@P��^,2�Y��������yEL#�OqBVI������rnjbs��{��%�����Dr���|O�gz���L\�����A��c����%�A
Jq�&�'��c�o�1����e�H7�Se+�r�h�!�)�s�1��q���{�A�kVn�4�/_��=���`�@�6K�qe��X=�o����N���]�>�b�sS)�������!���$�4�m����� ����-~�}e�$P�6�ZO!�x�M�#�MzpP��j
<b��e�c�~-���N�}7g/]�s���R��9�*c�����������W02�>���VV���GiU��A	��<fz�#��@c/*���t6���!���.����{r�����?H�`�F]���d_�\[D���1e�w9�El,�=/�~d6N&�;y\�woX�d2�o,��������`1��_�'��.H�^_M��!e��3����my�L����|��p��j�V6&/Ut�w�,��,������Sv�B2+e��um~K����L�-U1�
p�s5��);���������8i���&��F$����T=	����@�`�0����m�q������T�N�0VU^mj���=���?��NP����V9�e�������Y�}S� ����	Z��F��8�fR��s���4g��Ur��b-������$�D������
{�>^(x�Mm�tD��m2/�3t��B�bH�n�v<�D�T�i�@{���i�����<�DC�L��Csb�4!��KaL�/�t��b�%���r�C&G��D8�/LnA�`W���������"H�������]L};���J�C�_�d���o����{����9")c����u�5����J����Z����lB{�B���,��.]+�a��thO�(���ie��;�c:���N�]�W���V���N
#�k�#�����dH�����^�n�V/�v
�f���]�M�m}�1�J�N�������Z����5D���t����H��N\�e��18���~�/�s�`~�h�F%EH��A�!ssmo��7��e}�bV�].8O�W4��'O)[u&�9� �#%�I����"8o����24��dP���D�v������M!�����L:��<�x%�}��m����>���w�ro:�![]V�Rouu]�fC-dP�Y37U�	q��7���sC�A�Y������gE�U��/e'$��������,�����������0]�z�AD�[�����}���W��	��O�zP�Yb^�P���?��� G�=z#��]�!axo}gh���Ei�M�='����B��x0��Y,��.�9��l�l�27�v�����j�-rw���em��x�
�^��c��'Dya���������W�	�W-�|h��f����a��^l���5�_�O!3���i�������b���,�l	��)�$o_c�
�w^��E�����!����y���]n����UV�M�5�)���u�H��aQrZ������9�9 ��j"��f�$���K�L����6c%�x2hL�?]z�c�!�r�k�(����+v���2=|�X�7����=D���t@j��R[�,c������V(.�4<�"�����IhhS,K<���
����I9��P�H_�j�����73@��\��&���I2x�Z���MYT1��I��=��=���'l*Rh�$����������
m��!���Q9H�+�`(!����l��U��QP��m!�q������������{��0r�[�H���9����u��8H�r���y�Aq�h�K��V���CM�4���o��J�������#�H�����:&0�I���e������^/
EU�O7~?H��/C��DOe�}����?Z\��U}"R��cC����P#
����A �R�e�WNj������1�U��~l��x���\X2|�w%� ���F������0�� �o��cvU�>J�)��DJ�]h�j
!�;[�L�����8S���d)��q'���wh�|����r�t��Cj
M:j
��9Z#-��d���w)���;���Y�s[������v<h�z����u�)���m�	�xP$��0t�@G-���{�����rB�h��n-�}0���S�/.i���j9�o,,�%��C�>JJn��k�.W�7���2�v��-��O�1,��0�&:��P���>[e[���[������kJa��5*�?P���6
1{#892^�r�������c�����5x�8��E��gE`9���uY�(8pQC��W�5�o�oAhI��/����.���%��Pn��'e7��\��i:�Ny���$��c����}��0���O���V��(uq�tD��A�A�#���4]��\�5���xy�c�%�����d�����!��0�����ue�';<l��=D8�<��~�Sj%Z�J'4���	�iojMzF`��$�Vx�[�55w�8������uB��N�.hp�y���7�CC����w�p�50�3��w6NM���V|c������C�[^
��-���hD7���z�`�#��7D_���Q���nT��z>3�e�l����
CB��M��"N������*&�tRb=��0`�M����7��d;��D�>�->z�5qT��k,��
����~+��np��~��
R)����I4����!��X�#>� +�779;K{�������f������g�w^���c��?��[�����pig$��e�������������RLk(��+����6��\B����[3ty�W�*=�G��O�����R��-<���������p��c�C��bL��[ �������%���4Y�`�s~���1J�%��t�z~��#�u�>8�!���4��sbE���@�`q���Xq{������{]jk�L�����@����L��\�����m�0h���v;$ ��\�\��gR
�����Kl���s�������K����g����%���`a�?_Q�V� �|\�bi*�@���
6�sl~No|��Z�����	�a;1O�M�r4`��O��Z���KV�{��Ch����!�d=�n�?�
}%Z��1�[a.�T�w#���,����0�V21�� ��a��f��4�6��	B�kO��3�f<k|������>@���j��6�
J#F�dC��T$����A2�J��
xq�Z1��W��#�t���3E��>m}n��2���mj=]�6=3�'
u�4I�l����6Z��4-�e��d����v��7
���.E��+#����<����8F��s���O}���si����ZuF����!�$4���w�,�B'�L�'^n�Ve?*��
�����{H��L0�RJO����&U���
�N-�+X��YvCR���%�t��D"��>jD��H��]c�����J�����cq���oANW�E�|�K���a�#��8�������RsmY�aQ�bT%�se�2Tlgo���{����Mk]�OHi�N�3�)����������u^(��b���l�g/��
��s����_e�G�
t�g�e,��E�isY>�?[BW�I�ew�Lw:��e�0����I�}�s4�b���`O�wtn�5�X	���d>�Udz(�!b_�������'hVv�gTKDP�/k��|�O�`�O�<��Y��.�c$�2,@q�)��|_Qu{VXGgN9��a�����&�A@�H�<�,�h{<��^���������;�h�����[y�MN��K�%����#D?��I���&������p#?��HIG�5��;oCy=��0z����30��K��O$��S������I�^����u�	_�l�$����f��'C_��?$9�	m����g��%nr7������	��A[���4hh�#�z>�p9:i��x�20�^�Vx�`pX�I[�B�V6<�ur�c��������r4Q{
(+I)�����g{������F���"��\J�pWJ��
)'�3h��<d��<��v���HtG����� �M2h��{�>����t�D��lcVW������Q(:��]��:�YV+�6*�?9m���`oo{���R��/hg����`���0]�+�c�7I9��?�&c�t2�i�Z��Gyw/���kB�{Z�}�~�x'��NpKv-���1�/{�Aki���~g�v��<���Q�~��ot�Z�d����`tA�J9+�H�����|s�,�^S��\E�h(�7;���a��
��;V�.�
���8�3��
O��������]J����S�D�IV"X�����t��&��4$�^.XS)���z����w�7���-O0*-���������g�M1���H"��Q'|�Az=@O�!�(lu{�K%��o������A�������U���A�������	�=c�j}\[�>nD���3���o����,I�d��@O���gy<�Z���.`~����mz�ev�Fl��, ���q�(�1bz�8��S�#��_H�R��c�DZ,y�a2���X�~���������	�~��i�_��+6�B�uGq{U���r���K��T@�"�&��C�����f���.�T
��l�!U`x�L�~�
��Abt��
SH��G����5@�=�ly�.�Z������1<�li�w�����(�����v1���]uW6���gk�$#��w@���b��;���,_���vX���wt:�s>(_���m��~���5��M�(,�i�aE��#h�%!��&��A���PeW��G��`c'�U�4��5���JK��;���
o�������u��bOn�%/|�����w��D{�1&)�}�U�\9��!T���<��`#�����f��W����C�n�M�����0>Pk�*�����AZE5�������������R(����"[����LNN43��EFrX:����.�v��RC��^S��k�!��������\{���`�g����h�O��h����l���}p��!)K�E]�����u�{�?�Q��e-���Z0������PF}�$��}����CjK��m�hvWny�����o�Y�"�`.I<�Q ����G���
�D�:����������e����KL�����$	��H�-�-!�bxc����0���?�d{�+����]nq���/Wf��2[�V]k\���\�|��em��Y���������dJ~��'���� >;�t���+0/�d��
�.h�6}Y�Tpnen2i�w���o�#�{���b[p� �@�t��"�t��mA#���}o�'�X�&f�Q?�Uq��Z��s���m9��$�4\(�W��q����4'h�/yP�o�����Q��W���g�zYXhia��!��WS�������NF*:Y��c�;�����jy1G,5���zv >�L��n�(���h��o��
W��x�q$}�_����a�BL�AG��J������>��
���
r����7�m�g���{�*�:���nk8 r�LQX,Lx��S�7y:���a���K�e�&{}���[$�e�������^����J���8��������]��G�u��AH�|�� ����]���o�
���_i�_f���8K���P�����G�AU9J\g�����������-c�������E9"��=�n�z��-���B����#�4{LL��yG�s��D���L��*h/w�.��h��>gQ��lw��G0Y9��7?2���<�����������+�w��c���lB=��4{W�%Y�x�_C����r����G
����%����l4�����K��	��X�W��1N����m�:���2��FFn
B�m���0�����y�a�,�{@�- $������1?�$������!L:����:|y�"��</�zTl�(����R��p�<n�hlK)2�u3��xN��{�2��}v����*��7C�Q�"�.����Z
m�>�>{�R/�Q�ooI1-I>E�"0=�E��p0�4��eC��Y�)����3��6kSH"�H-9�������!5���+)BI\���E�T�Cx�Zh_c�����f����X6���,9�@��2N����!.Rr��eoW���/G`����r�B�|�(������������t}p=��k��������������J��7�6�9�������%�������B�r���v�!�3��Z	^�a9��1]��|���`����%&�q�a~�%6E������X�P��-!J%��G����L��>c]�]�E9��I��`�A-��y.R����A�r�Hh����v�M#�En���. ������`�N�������

j��~TE�:�2�\�F8[�k��U}���R�I���M��\����s�����`D��Ucj�G4��o���6��Gi�?��GF:z��}�+���$�����o-
��o5�&��0=%2�Co�8��G�i�������@�iOt��e��#��u�}��6������$�oobZL[�M�������6v�oC��%Sp
2/8��g�LI��5s��v�-2����Y���/`w�7��L���F�.�~|��q��o%��t��a���Lz����>Y�?8�@�s#~��\�a,��&Sa8`�Y[�A��,]����4��	b���d7<\��<!���V%�-� �JV�$��B��m���5
��c�Vs,5e�:i{��NE��a5���o���K����'�(BB��r�����@|�Nm��������{/�����GKQ��c*��">C��{�yc����eZy(������0m?������[N�%%\�;�qK��#����p_�����LP��	�=�`�T1E�v��l?�z��7
f=V�����iUW��u�}��9c�)h9�&�@BA�����vw���$B����h��F.�.��7}�y�-��;Y��iQ��aU��u[!�;��_�����������6(O�0 ��e�g
)�b>�%8aKx�
�+?�N��0i��&0�
W������c����Yl����U=�j��t%�q���k#
-�W����_3�gT����<B1��/���X2�.���q��^�C�SD�b�A`�O0��Mcg��A m��_�k5��krL�����E�q��< :���&������H���1�el��3-������q�c�{��l	.!DK{G��Q���n�:�}�����W����#���)�E4�?�f��EY�H.x��E�����?�M������L�d�w�h ��m��l��9B�z��Lo&�D�:��Vu�rn�B�s(+tf�K���e����w_s���%|�%�f�I�������]������^�]j�W���ZV���Dz�������_
��Z�
DO;
w�L1���@�Z�e��(�G`9�6%��U*�����L�::�`�l������,���\Lm��,Z8��������_!Kc�_'��
,w��-+�J���l!0���W�.���@���:��]��C���LJ�o�?y�����9�)Ua9j��6`�~'yPj�O^gd�"��Z�wV$���Vm�|y�d�T��.���r��=�������[{/n>����5+T��|)���������IC����{�5C�����|�r������=�<�i��D�i
7��Vb�r ��e���G8�zu�Y�1���U�����7B^��e\N�����n��wV?:0��:�����G@��6J�*O�?g�����i���Y�/����+l�kE ���ccCl�g<�'�'����1����YjBq��!���e
gM~=�����r-�J.��8K=?�C�����O3U�)�c�����	�F�����(C�������7s�aq���A$������x*��P s�3;�CZ�1�����u HuJ��C����?���G���(�P���~8���i5��T(�_tz��?�9���4f9�$�#������/pi�1���t�F�hR}��>���,�aH���7���6��
��+��Fln�w��q�`:a���%,����h��/��x���m�kx~��������3� ��r����e�����e�{#��^���&���W�N�A+����)@�-����(���Z]M�P�]�a!o�Cj�����+l���@L�-xDM\R�:q���r���W�'����hP�d�Yg_���^F�������c�eb��RpD
�v)�1���I����}�=���S���#���R��m� ��M|���c��F��q+�����t
m��q�A#����pS`��_��}=�_&�~��G�1�T�����i����4��gz�U��:-��C`������8���9u��Nk��kyn����\3�-�\1z������)~v��0�Eo' ���T���Q���3�m��z�]�<�h�5���t��r��>��Ck����3����Y��{�
�!:iUPJ�U^tH�A{�TnG�O9
r��l��I�n
�x�l�� �q��C��0��:��m
������aV��Wm����\�h�e#��U�dt���l�X������e�6�<��ys�'D�V~?�@�����W���u�1sJ��w�L���6y���%c����Q�_�o?�p��%��j^������x�u� Ja����X������A����U�t�Y�|�H�d��~��I"��4��'�P��o=
kZ�er�a?���A<'�S0\��t����&[����L�����3Dv-�r�'3����Y�J9�=q�2�.�<�R���I�X�G��F�'7 �Lq�`*��@�)
��sQ�zs���%D��P�nJ#uM/,2U%�k
�e�r����U�0��Z�\������S�_Me��B���s�=[ns�%k����L'�Q~��[G���h)�_��s�d|d���=����M����#u*�W<�Ea"�l��q�yX9-~j��|�k�-�y�0�R��*�&*6�3��AQD����r&�p��{��������e�.�V��U��,R����.���5��aF�~�����F�xu1�3��\�)iW��\�����/��r�����u��R��E*��5��R�WP`�#M�^��'��7;5B����E|j][������GZ\���8���w����&b"oB�*q�(���\��;Gw4@yK����6\���[��������\�T��r�y9��0�G�(��
���w�`%5�W�{����3V���Zz��5��"��,��U/Q����Wu�	a�xx��1M�Ef��?�:�����d�g����p���q���������8�
�OU�������<�PK�l3��������(��rYW�*[��\����h|������u�(@x�G�[������Q����w�N��P]��
\�%�	 E�=(�W:k��6$)�iso�T_������X5�;�����F
~!f��z������������:�Q��W���g`�46���b)K�d�=y?�k�I��<qwrL����~E[�;��+qq9�y��-�S'P�/���z�������r������G:d��g�������e�Gmq���`0�PX�u�)4h_Pq 6N�3������
�>\�������(����n�1������!i�n>PZ�����B���t�sg�M��U~��:�Eo�����A��,���u�4�
�0�:���T�QRS�J�Z���3^`9E
�&Y|Z09]���w�������&���Q<AuJ�!���M�H�2���(>#�e��u|[���0���;��I��w,YZo�<N�s��U�G���%����e���Y���|Z����9����a�h�230��;�vkpA��f��]��V�E_��S���ta�hY�����V��51O*)A��3aK#����u�b�!�.�<��y$0�]�^�s��bE�);1��i4��P.���!7>�$X6G���{���4�U�G���L��3�N��+Quv��-�:*!���X���T��w�avKD�c}���V�����I�gY�M�~?�`�[���A���b��PE���D�z��!?+�n���f�3B�Hm�AZ�S�S����4e\�]���L������o��t���c$!r]�
3����:~"��{$G���F���R��W�y�ca�]Wu	�,eC�,�o���xv��4�L���W���m��Q�}����	���wX����Jn��_��O:Z���p��^�.�V�u\R�vm.	���N�a��F��n�{k	����{�j���]g����7�w����r�E�*��|A��`7k���9fK�*��[Zsn�s�.���E�=)�z�T�"cl|�����X�����u�j2L`8���C��'�xP-i��!&�i�K�����]L�3wcH��p�9�.��>�l���������?m ��N�4�$:@���#J�w�xx�y2zN�S���5E�1�?���m�)6���M������r�Z�~�_�5��y'=^��e�����@�FqF�]R�A4��Q�H���Q^��!�9wM�9��F��t��}��G�����yE`�l��o{� �NkD5��F�Z���X��������^=_�B���KR�G�I���,g=)lM�S��l�f�e���h�[����St*�m����I�'��Gjf`����yXL�`>��ZU���t_��j��7e>W����H��!4�_B*/�<4/z�@� ���W�J���*��������J:k5��3����Q�vP/�Ov�}���$����f|���������B b�(���4{d?����p}��x,tPt*���}I�{�i}���2����Lr�83D���T34\Z1���W��U��Hb������������u;�r�u��F�c^�>�(�����tp��Z:�L���r[�-|Yg,[��0�\;�^a]G��n~�������|����%>�n��
k�d�}�
���zXH��N4�
`D���XO`��x�y����D7Uf�L����[�Q�y��
O��!S���'�d�Y9�P�#������7w��8c���3���_�y1+w5��T��=�\=n= R���+���t��M����	m��<�N[F���Y�j�0Z���yim��|�;��t?�����F�������4]�e�'�!�%	awW|T��r���y�N�K?����`4D�Lw�|��|���{��puFe���Y����`��2r|��P1�������T��yM����W�j��g���������]���'����%&~�Zt�%{���=+����-G���$����{���������m���~T6�R_��_r,.F�\���*F���=L7��������bR,�2%n�[.4m����M�p���>���q�Y4O�]�
^��K�0z���?�����v6�/�"�����5O^�O�u8�>@�W����{�������uA�����&H
j����}i2����Ta�<���f3���2�i���G��u�oE]�`�j������L�H-�S�'2�S����-������?��� e���$���h�����9�������������g�v�2SJ&�����u�
���%o�����t}m|�1t���S�cea���9=�/���1x�_�;���=��:�)�9�O�S[D�4�"���)h�s6�<�P���6�q�����|O�G)a���
����71�Bp������}&�����n���T��
oc�=�i;�$~��
��&��uZ�7P����?�.�8����:	&��������������v��N���s[��|���1��������;W�N6�����������H\M�o�S�GE�Q�6���O�xu���3>n�n'����`~�
���&8�E�������>�0�p������$��Zni�Q�H~�MV���y>Q569���B��A��i�1��o�WhZn��@y[���6��]-@��0���l{�kb����������&�-����p3�:�G����� idR��M�S�����L�r��^=_��WL��?���v-��}-V�	��Q�����%�{�^>JC�B�5?O��O�+�
p�f��<��hs+.���v�3��:�������P`�n3����xP��g��X�R�@�y�����c������C.�2n]V���"�>��Y����)�YRt��[K�xb��_.��3�4�S�i���2*X?�]C���i�cF��������mMHW��,�[Q���	�[���Nh�B��9�0�����x����C��
;W
B�]�-�S�2E�xi�A���cz�����w�xLlb@�K6IC,�g��>%��"���%F�Q�;?��j����z���������|D�*��>e')�#��K�-��Z�z�
����+�@5�uv��1���Q(���%���|J=�eH�F��Hcx��{������UMe�OeR=v��8�~��)����K��F��A�4)��*n��S3)�R����vW���
b�8�yT.C%s��%lk*=u�B��x��4����
0M�.�CM��#~��6�`�|*�H��x��e���`�{��
�U���$����O�����h*p��qhq�d�� I�
6A�%�8��D��-K`f9,j���������#�$���$5u�XQ7������ZX�U���#ri3�����s���������
o�����Fl(����x`����.�UD������'|�6���\f�,K���T��3������:6_9�G�@�,�{U��A�/�": ���C���������m�;�w����WF�>&SF���:Be�,	e��@�P1[�7�����mZC~Q8�m��nOn3����N��&6�1�PWw��_�?�M����a��_��l4b��Wiv�V���V���?�xK������n�C������/�k}�������	�x�������vE����i'�N�t%���-@�~��xX4��huv�DQ�,�����+�S�f���U�����)�6{
��9z�l�Cf��G�@x�AS�XK��
c/��)e�����p��#r��|I�����Zr�@��q!����#�'�mS�0&E�jD�2��oY�8J�9��28��B��������Lm��Z�d(����<��[
���MG���z,���������$��y0��U�X�>c���)�����s��u��4�
_@a[Q;�����:���������;��F��z7�`*�}I�b����F@WN =�BD*�������s����2����m���9�c��3���i����^gi���0������3'xT�?�����7��s_H�VT}��4�Tx�Q�2�+@�_��`���[���V�C��r����3�Q����rn#���?i%�����E+���=����N�q��
{�F=K�j�W���_�M�L�|9T�j���r���cM�oi(Rw���Xu��_�4$�����9d���.CXZ����$0����l�X���/�� n��i
��q��A&�q�yR��v��������u|�bWtw�w$� �PWLm�_b�X�U�F��S�SO+}
/�CZ�l,w,k\���iho����l�W��0)�<��@���c�FeA<C�@j�����9��N'��0�RCc���Jx-��� ���,X�[��c�Z?��w������M����4:�G6Kn��y��lg�E�6e3�>�U �.t(���(��&X|��$w��A'�J3X��I�v�<�
J�W�B^�5`H�`��_��0��T���&�&{��D$���L�gy.�Jph�<��:D��K�q�7��3C ����V�y=�I=<=���E������F�7����O��0����=���D��,��V�zy����;���������oo��������b��}��\x0�9H��&_]�[�����m/����z��_@���k���G���44���S���+�����2�0@x9�����hUA3^��5E%����J#�����'sVzauwN��b�(
�t�<GUZ��O��1�6�
�I|�^q�-h\�EX���]P�e��y�)��+����o��<�[�QE��R.���#��%�2O'_P����B��Uz���q�����SN�������$�Y�)83�i�S
�G����s�6��t��F��`�|������+���g��t*K��	�|�j��#����I�6��'r�Ig�ai9fO�Pw:
1�g�l	��i�Eo�m�Z�*>���cV��++[�$*��`���/�M>]d��s=��%���wd�
�^e���X>�>8�����-������w�vd0��v��Qm������������e@�'�����m���e�0>g6StL*��������5<�|�)��1\��W!�����P#	c\��2�������$�DG��F��|���%�VT wY��C���b�3%�i���`�C�5vO����(�=��RH$B�@8�����B���GnC��V����E�n�����	��F+�v�m��7��*�PR���=$����#	)&|�2-���L������X�����M~�.+g�b��F�"���`����L����/�p�b�?��X0O��^1`I���,�:�T$�4����N�s�L����D�������<�jFZ��%�n�P-�K{XY�#��Yx� ��oI��;�!����%�]�(��]���w������s|��^7�7����8��\nF9rC2�GK��~N����O�����	�)�H�^����"�$��� ���������n�?H�@h��7mh[�!�ffi:��L��\bC7�=���c{P�F�����C������@V�f�.����D��D�|������SA}��$�Z�����G��D����=��e�$���Chh�] ��x��OJ'�"�5���������� ���lO��$w$����"?�r�����y��i�a��?���%���I��6J��k����3�(L��5��������h��*4�!'�b=�u�N"�t�OO�/��(� ��9����b~V��W&{���f���P]��Z������7'�M�C�W��:^0�-�}	�r�ae@{���>"N)-��b�xzt�b��� �Zp�V�%�
�Fz���>5���J	����$T#� �O����-[������G�*e
��yI���O��%�F�.l��������AY;G!v �����"{V�������Ja$0�^�t��g	��;�p�@���V�S�y�-�]����9Gg;s(��"h�;aC���W�9P���H`��h�f5���wKr��%�k29��*o.]Z1�������7�������I�J��6�ad��&�e�+�51�'"[�_iJy�C_��~��T�$p���Qt�z�Y����YjR�Lc�[sN��S��"�j�������������E:e=�#����C�4'B������*	�z�W\k�
����zZe�������4K~����N�h"��?�y6RK������������Xk��)j�l`zB���i���|�������&-��u��o�#�r�7�:�D��ejb�������*�OS��p��)H�e��
Ip��\��h���u���.�1�}������K��5*�XE�wKC��H�o�l|�!�R��-]��^9k�^L��vz��i�$[��k�+�����Hl����T#��yG,��^j�e�L-9��~7�d�(���W�[�4a��E��g�!�-������k����N-�h7%
�]�9��*���-p�/V�vqT#��@�M�e�^�&�R=�di��p"��~�eG�g���0;����Q�@��N�`�B|{N�eK@���������8~b��c��8p��=������2;�/E�A�����V��!�T@z�>8�D�09�����#��IY.�KxsP�%��1J�[�x%+*��9w"����'�Qi;%�u~������@40��v�r�f�/�����I��p�v��Y�V�-.�-u;�(�������d���������g��@�p����� ��O1l��G��}?l@���)��4\t�i7l|�EK`��Y.�d�O�xMbTJA>�B2�����	��N�=h
f������?�+?�{���!�a�&��y���b/DX��/�R�%]�y�Y�AT�������Gy���:\��������!�U��v���1p��]��I,���4��dK����vM���7�������q�A�2�a����SFc^�
��h�e��
C���r���s��u����l ����t_��
#���m��'������)�������
���a����#�t����B�[0�����tX���c�6 ��Rn���$��[4���4�J���VW~]���}W�[��z����A�I��Z��Oh��N������j�������-�R
���s�V7����7����~r�f����������zP�BWP
�J�d����l��.��=��8���g���A���'
7J���@�3E�[������)��
eP/b8�
~Y����sT����T[�0��<���T[z#	.X�T��������������[���
�Fz�$�WO{��i��"�]��?��Cf�m�
].�(8��,1�$(�}��RV!�����y�U�,�0`�����=Y��gmq���~�Si6)�6#�J�7��$V�=��!O��<F=�;�����!SZd	q��>�Z&^zA�l��&vu?fW65������I���l0�����rK�`�Y��;Fk�PB?I��av���]_��EH-�5�o�}�2��s
�B���XW-���/X��X���O��[��-���~���[
�C�8���9����]�n��Kt�/D���g�k�e]y��InA:R�4���F���C�XV�(��8�����w"s}U���j�����P�W@(9"��]�w���h���	}��I�������t��S��!���o�f����������#��61�W�	J����.,�F�#�s���������z_1�����,.���vZW$�:���
���wP}�
����1#����SS�/���k�%�* �7Vm��o����y�����0���P�����N����h�~���M��'�y��Z1���o�c~�$��{bZ���;�mJ�7~�E��$�
��Y^��X2[�c��~����:��W��%��R�z��������+�&q�L_�_9�bU��r�&��_��H��7���(.9��`�:O[_�I|]�V��������CJ�D��eU����k	�0�[��d+����2���c��2'�"E&M0O9k�(��)N���hMB����^/�F�93���?��#���>�����4�q���&���;�k XE�B����4����V��oz�w�+�X�����|�	?3�5���8�G���g��0�T��2C �CP����N��/ l'����9�\����'�S��"��TC=�<J}z>���u`������)AV��*�`4�l���!��fc�#�L
�����h�����]��!�X(:�U��T�\>��0�����7��b26�f�j
���R��T#/U��P���]~�3��3�#���*Lv
ka,0o+�����w_6��t�)�]�0*����:�.���n��C>������
2�d�?��+}�lB�����||K�)���!����A8-R��5��;#K3���M�E�
��x*�C i�����+HDATQ��m�D�Q�BS)~�&�}�}d���c��h�b��H��^��W#�ktmS����N'D#�4K�F9���K[�&�NV����t����c�����i�P�����G�Z��\��zh�� �X�����[p�3����;���d�aJ��	��=��}9<�YW������]'!R[[�V���%%�-c-���-~��x��=r����)�h9�����D����f�����B���>���p�e5���'*��e����4aZ"�UV�����p��5����Jn��Q��[S�LE�
�J#��,Xq��3�����t�t�
K
�g���:Ws���x�l��g;���
>A6k$���I�z�($nK�O��V���Llba�W-7�.���Q�����l�G���CRv����2XT�����Q6~pD�>&��|XA���k1��_����P�e�>������k�T#���NW|*���$�K�f���snR������Q�5e�!��S��������f��N��uk���q��bd����"�wz�!���J�g��Oq��8������������&�n�I��	���M�w����H�u������m&
����
���[3��3���"\G��Sl�P�S�g~�����#UI��dgBl3[�t]y�^!o�Z��t�KB�PUi\`���A�%v�E���S|Y���-U@d7V�w�V{<w���L��u�m�h�T�#��D!��R��s��`?j�����%��V{��8=&u�N����.��l���|u��A>:}�Yb%q>��!)������d5���)������x^D�5����W�[O��M,MD,Hw�v�V�'�/'�4�����%2��z�z�6�+B�VDC}��q�V�hU��/50��kp�9����}��^9'���=&Z�f��t�����^2������_���$���T-dG����iunt�����������K�h"1`2���	7$
�7(�!��b+��#2�"b&i�&�F�N�	�z������y���Ph��;J�,�|�������nI" ��-��sM�xl��$�B
�f���6�H��|�M�p�C>���}9n?�AS��2I�F[��r������l��,�O~p'K��^�����-�{TNJ�6���pJe/�%S�A��'��R�E.�0$����N4K��P����b������'\Wv�%=���CK�,`z����{=��~S����,�g�u�p��C#��w5JiRNe?���l.�^��T3`�$!��5���e�M��M4��b�	7�d��z}5.��7�$��i8��F�X4�SU��aq7hl� �H?�A���UD�V�6��\�D�A�fT��;�R�v�r����uA�A�t��a�2����Y�u���j���Y�q������i��A:P����"��O���w����]���Y�����A���v����W�4/��/E:����Dq)o-/W� 4�Y9x�����������>5��c�B���}�|�E�T5�O;TQ������5��	�>��w0j&}Oc:Gs�v{�W��=d�Tjf����I�(;����LL����f�9'�{c3R��k����g��V�U)�������"����D�������X�x��QrQ�G�b��x���>��|��]O�4~&~4-���tkv�aH����wW����_��6���x�p�l���*�e8��#m]�|AV��������-�a<��i�,=�)PB�*���w:�X�)g�$&�<�SZJ���d|F�1I��@t�=��.���dbV���w����XF�����^��)2�����oyh��r�Q��{��&'~z[�+��E�d���1���Xa�	D7�A�+7ej�)���t��q���l5��"�g�~�D�=An^`)@m���V}(�3��������������^z��a����ig�!-���P.��+�����`*H��Y	>�^��i@^��Dc�����3wg������q��$]�8�������o��Q��\��.��!VU���3�2�����3DUG����Ul����Bd�m��A`����(��P����E������.��m�W��4,|()����s��g�Q�1}�B>b���a����23i��&��}��Yi�YU�w�Y�"*J�\�6S/�c��6�vc���h_��z�(ye���o@j��H��`/�#����tL�\���|����b��l����,�|-��6�������bf���������5���!`�h����e&L�V��/�	����7��K���N),6����~yX�|9]����3���l�d��=�h�g���������}�*��������Q�5h�i�����g���-@�0��/�A|���C;�
���5�hD�u�||��P>���Fn�/%q��?���Z	�����"-�yOyZ������
�����l�D�����o1�U?_������+o9�|L�a1�05���]1h0�f��LZOu��E�������������Y�_N���?"�H�`������0E�~0%��:%|��T<��l=��y�B��N�+,a;����{q����czh5�����*��vD���X�- HGz>����t�,"��j���N��E��I5�b�44b����f{Qmt�#';-�x�i+����<�{�!��
'���-���~?�>��M�ysDf���F�?(�~������k/���&C.��c��`�������������� �:�
<�N�p7]zr������~���s�/���b�A��]7�A�����_p���S��%.��b���a�)	�-�`YA�Y]�D�<��$�$%�$�u���c��<�������G>_8@$��&j^%�$������Y�{�����W_�2�\9������+�x��#TP!@��J�G��Y�t�E*D�^q�d+��I�D�"�M��87#������@�&`,^���[��R���<���
J`��v>����uf�KG8vD*X�65�i��(J�\�s�:d![�u������z�������Sz4J�G�R�E1+|1���j�=��i���H��\-�htw�w_���@a��V����N5�%P!��Wk��m"���.4�v�g�f^g}m���A+f�Z1�������	�Nr�6/�#K�j���h��7��C���@�]������,��a��n`tN�o�3��<2�DQU�$,m��J
�F��'�\O@i����^��Z|�;�s�������Lu#]2m����6w.4�aN!�����5|�j}���<�����B�|3�)/���b6��8j=E+{*F�-�'��p�$H��?1Cw��9f
~�wn^v���:*��@w�w3��CyzH�M��hA��_f��q�&n��4��}\�D)6����Y�hR�|���7��m��dr�q�p�������0d�TrCN��+f4�	@�(�_���o�p��
�Y�}�PbB������fu��2�����mj#��E!T��2��>���4�������x��������\:-3���[������Zn�� 4zTn]�M�r����'�*"piu��
�N���Q������&Y{���]��%�J,34��T<��������B+C�w��^���xc���N�iKN-�-U/�U�b��}�&���	��)��Z�k� pJc=��e���R�H��S��-�XE.J����ZS�H�3L{s_���Z��
��'�P�}E���-���<�
W���?������
����&���}b���K��M�t&���7?��e/�XY�]}��Z���^�N���D���F��[	���kuyV���\���B��dynm#�!�l�3���vS���18�����w�,{1�:������ �������T@��c�Mnb�T����m��`^%\v��jT�B�����%�A������J�q��l���`�~�����!�� ��7�4�a��J���C%�K9(b�8g�?AZ5�hF�f�B����
~e;���G�<������.����e���g����?��`�u�`uY)n923��~��[�4�z��^|�*��6pPd����������������V\M�����
��Q�����E)F��(C9.n����� �\��$~m4hS���H�v����5<]�0����J�k��0U����)o?T�U2
��C�Z��:�H`���"]f�0��h	�rX��4�vP�Xg���z|�����sat���~7
�X�#i]g��V��A1������`�\I�6�
�h���w��5����'�n���B:W��Y�K�K�L�;���W�;n������u#3Dl��`#�6���oH)���9D�?�t��C
��S���4���	V�qE<%�������]��������Au�@6CY����h?�{�_ �Q�/�.G�����4���U[~0��'_p�;H h9�Tb�����������bi<<?��o��k�e0�`����n�];Z�������(O������Mi1�7Z�h3X���b�o@��OP�����Q�	atM~2W}�T�1��B �����m��!{���3�;���y�Xj�^gC�KK�os=��E\������U��af��R�����"ZL*�� �k��E�S[�f�:��%4�
9����UJ^4������-� �1��m`��}�lVM4 Q@�A�F�[�SL��hO�����{5Tp���y,��U�o=�Uy����I��[�{M6}�	������kW��'�E��k|��2���\��^�$��?qE���~;�����yi��E���I+��j�N3�t�zn|Zm�����]"��K����Y����N�,�&o�(B�I�n����+�'6A,����\�Z�l���L4r�
�=�k��J>���V��e�
�3��y��Y��H��M�$��j�������(�J��>��=m�WLeMF��	����}��c����Ju��_�K��k�QQ����_��#����Ie_���S;3}��S��c���������NV��U��Q�<��10�S��)ib�Xm����`�	nL�$�[��G�"�^�/k����;;�#5c$�� �m)�����4B�D�`,��z����8�+��������Y�y|$��*6Z��&���n#�D���oU����
@�>�+�g�������zIE�����X�7t/n��H�S;�#oT'���a��l�C;��k�������~����+����a����m���f��]1�3e�y���/���9'�����p���c��s�����|/)�5�\�9�p�D8U��b���q�r���	`�K_^�D[R$$.I��OQ�Fc�!��4�#oF�S�������5�����5��QKs<lj��MV����<�`z��$��w�����4MC�0�pv�R����EB�����.����)�E�uK�?"Y���j��b�����|���8pJw^�!��4�M�J��HUb�������yh�#��u�,r��?�������u��z�T�b�����nC��d�r�����&�F	�m��+���[�D���D
=��wRqk��i��}�a��c�i��!�����*��|�WV�M�R7u��>N�x'R��!?�	"��	�A�QF��2	u�3��9�EN�0i�/��3�����_����ak�S��,ba���g#�&Uj9�D�]n�����E���+4���K��X ���;5�bU+L
7.:&����Yz��Z�k~��KH�p�!:mS����Y��x�t�
���������6f�����3E�
*�J��97_����#����I'*�4Pn�������3��l�|)�)��=��_�T���-�|����%���k�S,�w�����c�~��t�g��C�Dro�!�<%�1�fv������x��0�fj���
Y3O������ ������h��@`2�i��������	�����W�g��vMI��.����e�0��BP�L�-AYGm]FU�B����eYy_+4R]VIVa���~O�
W����4nq���������#���`�U�����
Y?�aH��n|}����'u�0���A��>�8�S��:Y ���������y�=�:��Ld���%P���fk��"������r��]@�.�2	��/�d[��Q����Gzw�!���@��������Ij;����&�������
5A��S�\p���j�!���dA����h��c�&5>�I�3��B�8%��lx���I��/u�}��Ku��!���JWKt�>��\pu|�a�S
��Hy� S�NF_���W~|��zM��[{�:q�i�Zt�����m�&�&���58Q9��
�g�,����@��cV)v��9����o����%�~����yf�l�]_�C�W�������8G5������s�f�����~��-��&1���]1z_l�FO{�B�z�'��%]���M���-HM��7&L��;���T�<�:��C��7�:��J�Gd�����F-q�)#�>fb��4Z~�'@o��``Uu��L����p�F�cu�{n-����I]���G4�3����}���v�9�`NS���Z���ZK��"t������RR���RU�|SX�}�]��;^Q��.�
6x�����]����v�}4�x}.�%
���O?p��>�c�T��������$��9>����!�0,VKL�oH�W>��X��x~Ti��FZ�f�&��?�6g ��,��Z�J�l����D�1�&��������3�F�����C�)������A#��DG<�I�:B��)I�/����j���d������A�&\i������hn�����L[W�<���@��$���z��Y�MX�[�H�_7j�����Q��*eN,���T��r^&QwE���+�\=����eA�@���yM���V���~h�,�GS�%�-
�L��`�r�����K����^M �v��V�n<9�HgM��(���8�u�Y]�vR�$E/'�BB�#IUhe��d�2C��
�t�P�7Wf����t�/�}���X����iH���}/:ogP ��H��M�<T��Q��IK�8����@��b�V<R�"�c��~'_Yn�
Sr~��^$��#�w��A��D���6c����W�i�m�D8�j�/�>�8�p���1��Q���ck��}Y�c���]��z3������V���w&X�2�&M��-Q(���Kk��cF�{�[v,f'�_�7�[0?�&���+{h#"5��3���'��XG��L?�����R�p�'��vi��|n����F��\[QON����JD�W�W{���\i�%���T|��"�$\4�~@/��|�I\�a���#���k��E5��n����,.�D�3q�G�HL7��r#����M9�Oql���&�bK [i��U�^ �U����b��������Uh._��5^O/Le������/����C]c�����i��RbiL�{$S��m�������:�c�:*�,d���k�/|��\Yu�m�#�d��H.��Ioke�3{� T���[+�;�_����/���� ��s,e����]�����^�ge.��q�����������6����(_��4"��
�;�h�X��fu�<�#*�!..$eEXc�s�
g��8-���e�����-=U����k(�)��y�:X�`�����|���D2L�
�>�)�\00*�&cBL��-����Oc����u(�����G0�G����D*g<��'��Dn3X�P������!P	���#��H����cK��V����{�]��"n]����H4X��2c�*[�����rNJ�����@d��$�����
��%�9K���gw��b���v�J���Mu��u��������`�]b�����`�v���1�lT+���L<E����z&(���~'t��E���\�v����.�%)�2��1r�+fr��B_�t������V�h�������b���*���|�4_@J*�]����s�V���9�Rk�Zo�Iq#�'�ud��u+0G4;�3�jy4|t=vYu�Ay����r�����)6�4�t��r��n���7A�t��2b��
'i&�,�{���ag�/ ����^u�uj;��6"�����_��������T�ti��r����8x'9
�g���,U�F����9����jPW���{�9VI h[M+��
:,@GMx�	����5PH]�R]=�%M���v{\�}�8���-_&���,�����](�5�_D���/M��>��u~z�k�������@�X�7W����O���>�y���uz51�J�D*D�:.U���n��Gyi��d�����PB6��J`n0���P���)<���������%���o��
S�����3�`;�-�N:l��y��c�2�&L��l�J@z����\�Q��7��S�ov�)G(<~M���%
���R�����)�z�F�_����������\>���L7��U���W{L10t������,t��K_���c���{X����R�WEu���O�����!������N�Q�dRJpH)�R���3�GZ�Y�R�dB{�_��`�������$�s�'K�Z���e����dsE����������8&����������W���I\���\Vd(#`>�1�����b��[|wh�����hY��dh������e���+w�`�2��������Y4������.|�WY������S�$h"���e��>$�q<*0�
C�!69���
8��l8�:��nL��C����Pjl��FA-au��o��)����,��J�b��'�����c��nLH/�U��n���f��,B�y���d�`��s�1�b ��S!���u�@��������?���yk27@���4��a9.�����C��=�����x@��u�]�"]��/F;A��6�� �0�G���t��p��#�U�4u}��^E(jX+����D=^�c�1<E�i��;E��FR'�>I&�������K��9_7��'�����T����x�9�x�v����s���@&���|`CX�j�U�\:��o��u������sA�E��*�����1��95py��&��i
��*h�d��j��-W������1NV~)&���*)i0{��;{�zB�:*%xC�w�p����Tv����m�R�3���&�HA_q@#��	�c2�����n}�Q!�
2;�#�v����
p�9�b�s���2H���U�XZ5�#`���q��[X,lb��%�.mZ�f�
�]���R%�*�Qh79�������h0*�P]��x-�PW
�|��u�oW��Zo/��;�����F[}���ij�W����sT����Ttok4}0�����M_�<Oq���x����� �z9�J�>���=/��{s��3�<Z�i�~^�)�����\x&EE&C��D%T���������e�O"�e�m�ie��3�9k�]T�I��[����zo�0��|E�������*��z���LAE�1���k��<_����q��T�APpqof�f��t��Z!���8
��_t{�j�+��Z� ����f
��w�/YqA<+p@�bvh%F����@PFS��=vX�R��)�l�D�|`�D���Uta���!C����R_,2��H�#��W������������,(.r@��E��OY�8��	�}�[��k�R�(���H:N
�o�]V�-��-��R���$Y��j�U������� O��3�f�d�]C���XI����un|9<�/��t��
�C,�%���P��t�4�.'v��Iu�qn*C�	������L����Z��];���']#�j�`���}�;p�[3��^	�=�����j":�I6�%.���R��JB�$+M#���e{��'�+���5=&�#m������=Xp#P.���������>��|�mF��	3D��w�-q�
�&�%[��*�`g���0�+w��B3
=�?+����C-t���$�������ZB
��i������+a��4��1G����!�%��q[R���,��C:����,Kq�-�j�D*�q�@���MKR�l#q�����y���_��J��b,�G��������=@�hBK�C��<�a_�\2*r�=^	��G��y�8I���5�

��X�HTl}��X����{�.YR�P�C�%�J\*{J�F��2N���&C���W����Vc[d�;L;��d���$����$v\D����g5?�B]g�g��(���8�,n���H��]��������,��!w:����25t��mP���EU����t����?��QuG�7�V�(z�]�v .b�x�	D�����
�D�q,���V�#�����{���D���'�1��P�Z\^��"�����D����|���
p���F������Zbn�L}�V�JJ�c�+�����`6�~��� �}
Tt(���A����A8����9���W'B�
B��A:��\|q�G�����!pPY�WT��LT4�FR��m{�����k|r��)>N�QS)5�	�������m�#��0����^������<���x������Kf�D�n)K87n��<�?�C��@Z��1�.<��(��T��j<5y����Q:B�����,�cj+�ZM�_E�o��F+��\{N��SW�����I�o��\�Ui� ~}i�"�@�C����*�!�$��c�T������{�z=|�Fg5Fvg������v9��t	|G��M�/D��$�:F��@�����:���`������&��d{�. ����`�8�?�-K;83t�^(���v[R��4�������������|M�V�5��s6�4{F����:�o���<�'!�����mc�A�v�iW��_��N~���~�g���2�3#-��B�a1=��p��|2���6��~����l��j���z	��:r��
�����NsW�y���O��l��c�)&u����a>���	m
G@;��h?%l�K���Ut��]�l��zY�%+@Yi��wY���|�2kB��4����![�zM6��(f�%����0�����A�U�'QkI@��s���
���v���:b�6EFr(5uT���d�F�m�R=�&�U!x���[�y[?�ef��yE/����$��[.�'{Y������@c3xva~��"#Yz%y�d{�>���+�����}�W���X�w��=XNa^D�U�8�N�]��}��������N`����&��;(���e��4^��Q�F��������"� ^�%�jTW��r���(#����f5�����HS`N�PN���
��x���1l���6:����������<Q�1���}������,����f��eF��E�vr����-��_#D�E;��x����p�K���+@9EYV;��Tj>'�S��j�]kE���D�����`�;�����`OX�t��h���F,��e�����=����6���������p5a�>�w'�)���-�'p�R�~���J!�Z��y�����=�H������P�G�����|��<�z�&l����0��P���<���)Jw�DS��37������H�+��v	�e�G�����-����@�:���G(N���C���V��U��������@� o��_�jS��Rt$��(��"����p������J�����������E~�:������+}�(��hE���9&d<�K��Xa��X�'c{�/�k
�0���qv�N�S��gq�S~��g�)�%�_���0��[��y��i%��������o���zI�x/�R�F��].�<N0l{++Q.�
!��bN��� ?F�<>L�N��>�@`��5��x�d�0V�_3n/�q&�\�{�f��j@�n��4I�;��\
��B ����m��K����f����?�z��I���B�=G���[dO��;�h}E3���Q��Y�?��N�bH��U@�������!�'����~c������B�0KN�(���
�a
�s��n�|�����e��[�f'A
"B������U���Cy?�v�-���eF9L�q�C~8��.�J�~.�"�PVUxU@_K1.)YQ@|�J)�$��|�u7�b���zr<�I��R��Ix�^�m&�~�I�[-
��N2UP��C�y��2�����K.~��/�
��XE`�����$\�(������4����24�����S��k�dW����!�O#�z07�G>������HQ(�����"-<������Y���j����yb��s��c���]�X��-�v�2�����=���p�[Sy�^��r�)Y���N����nLfx���M��~����p����\��T��?������Oh�a�#'R�����R�a�Zl{�c�����g��t<fv`�]:�ELL�������1�TK��6/�c�C�i���������'py(ld��5H�g
h%����e���{���@Q�5Ke�9�Y�'�ct:/�a��_��A�?����X�� ��;������R��P������k�=��F�P�l�X�{������yk��)��	�|��s��#S6s������)������������%8�?���u"2vS��XH������f��R�nu�$�f���6�YB�w�
�������=�4��(h|m9�,{C��":��R��h-��3����a0:Ib*T��rHY�U5���c$9�����3�]����v�H�v��#]�a���?��B^� ��,S��I��@�����N���t�t��*���E7B�Z'�l&1��h����������!�r�m�W{QO�Q��3E��
�{q��H8���	�Zb�m�d;����#+�x76�����$�B����BO)	RL���8�z�H�����I��{�������������>�{t����h�I5��_5��Y�M�������W�'=�fH#��/������bn&��o20��%B�q'�����C�b����0c=�(q�����N�����>0�_��^��<l+������#����D������$��a���fj@9���5K8�������1��(w k�R�����#����U��#����0�EQ����������%�Tr�&yU��I�9��*~[.}
hk�H����q.��������]+���7��%��L��I��k��y��T�qX��CI^��}��l`f�&�}��L��c�W)�,7���A��9��f�j��94�W=���KKBj�P��2rs���o�R��P���j��)��"��w�C��)q�;0���a�^X���Q�]��QC��,�(�������94�t��3mG_�N mF��?��@_>�*��������Vv������PB)�][���!}�f.}"��(?��������}�1����g�����������`���&��v��Gol�#��^�f�Q�.��E��$?��1v����\�)�b�y�����>a�2�����q����+�u;0��j��C�`B�
�����K2����2aFxZ�a'V����@�z��1��S����C3�	_��|�W���
���#�r9�0��4��y�2��.
i�d���!Q�A9���t���H	��6��P�(���e���_<Qs����%� �k <
��-���+�K�����x����h���`xI��/Cz�V��S����mX�F?N� �����E:�A�p�w2��b4��m�/�[�����J2O�dpz����u{V�0u�����>������jg�������
���4p��`����>|U�T�{�51�����
�����H����t�CB����:�g47�}<�V�D��w��Q���Y�;��!4S�cK���#z:����w�3S�d���l����P��O�3�����T��!8[�{�}9�c9��~";���F�1	�
������z���e��K$�+2��07t�H������%��W�����hX3��S���Oo���wb��<#�'�����hB��{��P��HY�4U����x)Ufo�5V�C�G������o�R����_Ugj�s8��[�q��*XR��D9bx����b"�\��D��f;_;�8�����C�n���Q ���J�v����x��,�<�&/��2
����D��n�Z���6]�Q���T�W�K�I����8���yA��w��1���F��'�
	g�
U�.���<�w���j^����f���U����@�|Y����z\��*�/��Z��98���4W��������_#����~�����H�������P4���m���Fb����m����V	T�k��Bw��h>H������'U�E�.�^��TqS�VF���=��<�|�k����$iZSg"�]tClpsb���-���A�;��C�������
����l�G���(��o�58U���l�{�8�zJ���a>	�	#Y�}���j��x����	;��D��.4b������ptf����[���}�K��a�q������k���}�L�D��7�j8@��|��-���F�'4]�������1g�r}�SsT�s�*-)�g%C"�4y���:��1X�LO�fM���`R}8{�4�3~Xs*I����(�r�(��vZ��c��P�������5��V�0���K������������b������d��<����������0���sS&�?��sI��I���1\��IA��J��X��2���$����-���q�>�j��!$
���j�m�e��������q$�
��U�9��*VN���`��	�Zja����.����iO���������bR(�;P'�Y�L��	����(\:��+��-Y,nI��~����L15q�t����$~�gM��������y��I� t���y�m���$�?����;D1��������DZ�J*95�)��ho���]��*��d������AA����"��0�^[ycD�#FFm9�������&[0}YPa�?��_�B'�[���T����TF������sR��1v@��2|�����{�{E�f_.�^L�&���;��n���^��/���{�e��V_.��0�������W���%�9UF�x�������A,�__��E,N�S���
W@��|k��/Y��&3�{ll�3hDm�">y���}�tv�,��T�S���w�o�����-�����w>���A�Y;�/%u�X�J����7��X�_#=�;�k[[DwhCW��V��
����Ou��m	��"'����<��~��C��7R����t@��Pu$n�@5�T��4`OGG�w�-W;���%���t�_gC��`Jd.���d��_;k�CH��Bp�l��h]c���^66IM�*i������j9I7.�n�<��iz|�����/<�M�Cc|b���D��#��6|�� Q��������Ifkq�G-��k�s�D,S_
��������CP�m� �
5T������w~�����!uG��1�a6b��`�@9�$��2����Kf�|�����Z5�)�rZ����Z��<��K�5����t���*B(1�3�2)"@�C�-��bu����O ��"%G�T/�m�����>�����'y��g;��hIY~�22]��XO����<����F����4p�'b}���M]<qoJ�6(��f:�����6x(i@B�-�"9��Gw���D-�u������Y��b/?+��v�sWA���������}Uc	F�/��#����)�_rJ��A"�Z6�3������e�i���{�������t�}�*KI��f+*5r��q��ur���8�x{���1Kx�wK>0M�nP���^���'����<<�:5���S��7W�q�qE�*�pz,�=�h{x�N��S��t.�?��9Hs�G�p5E�b���j��Dr��"`&���X����Y��V��-V�m����0��TDoa������<��s�����^�#k�p�Y<I�r��z\��Vr�?���t��0/-�~T��L�K�J:<	�T��gq2j����S���\d�,�e| ]��]�m=�����7Q�C�H�
��'*m�t^���h���A"�L#5!�~���*����CR~S�����@���5
��b�B����urZ��u���+.��+f��*���������2�����?��#����a����:��xl@�j��F%��D8�V�NEo6�/Tch:A���3+���8�(5F"��g%/�V����hx��>�8���v��'�^;Hy�t�S���,�)9�����G��y�Z������"����YY0c���4H�I�*�E���%�y�� �(^�����4��	vV�p��0�8�4��d�%�����(�t!������S�����v��OQMXV��	��'��77y�|���������}�R������?��7�c*W`�q��8B�eK[ET3GH'���Ms���5UO�
���]/����>��6��P�c�/��|�����Di��K�<Y*{�go-���t1iy�,#$��)��R tV����SQ�����/`8����I�[}���"I>?���T��Q�(�������ug���Z���BU�G>��?5�����������6���a_D�����nGar�`�R��%�����c�.�0�r�
2uf�!/��/�Y����������������y����*z|a�������������v���;���"��{
.g�m����	TN�����|V�|#b��W�kK����_c&����0��7Y�d�m�n�+�pE��v0	n2n�WY���8�f�U
;�`\�p��9� ��,R�S������t/�h��)n����,�kb�H�i, T��d���|�&C_��i1���	�|��?�����Q��_��f��>���"&���On��lE���q�
�o�?X���I%��M�jR�N�/.o�Z��h�c���Ci����� �|n��MZ��b�����isZ0Q�LH��-�������Jb�r����Mzx7GB%���{&dw"���3�6�&���NX��2�f#���Tu�z1�}�8����X�t���G�L�v�n�wD����(��Y��Gf�&9�����$�X�j�A������`�	&?T�5�z��{]���W���#������tK�y#Q���5�o�J8����6�w$vX�D@���A=Ms�S�x-o	�����9G�[�P���J��3X
�	
?�0C���;'��n�u���������u�\����T���l1�M��G��m�f��Wr���-��3�p't�<��q�Z��>?d�F�C =U����I�l��*�O��b�u�����	����"(����0L�T��S��I��n����%U��]m�J�Q��N*�B�xM�����Q�6L�x$5�L@Y��s�H���@M�v���o�/x�3+MFZ����<6SF��<�p[B��#�u�j)�P$������r0M�k�y��
���KTvbC8�����26��N?��fW�R8Wy��T,���?���s(��D���v��Ca��\<����dS[5���P���En7�s���4�VA�.��B�M���O�����Asl���b��r����Mq��� /�}#gi�.��j��
�r�������� n�^���I���
�l�,��D���d<7�h���Dd���d���\uL�YyZlx�_��]Z[��Zb�����)��z=����\��($�L7�8<�Ck�j������d��
��v�:���YG<��E~�l7_����6��BA{�&MZ��1[
l��Q"mI�O�����6�����y��%���x��|f�9�t��]0;��?�Q8�'��rB�S(s�XO����3��A���&r�������~p���E�\���C�)[�#\�	������}s+���e�*	����u��Yl,�����A%��^�I�P�C�c��&�R?d����>v"R4���]tQ�^��C����6�OP�`W���K����c,
1
�%%���`f��m(H�&���v�s��s�K��m�Fn�������������;���MR���Q��^|�2���^�M�A��Q �ssnImK��#������DW�XY�c-!E�������-M���	Nb����n4��w����Y$�8;L�o�61~��>��i�g���K���2k��n�d�2�����u������[�Q�l������}W��^C���"�n�c�
4�lZ�����.�a��n��D��h���^%��wi�V���A*�glW����
�H��V"�l��`�i6{OS)�V=�� ���!y�����������g��J���L#��{�<�|�mGB�!j�L���T[�M�����3(\���|�t�.e]���F�i��N|�r��SA���Z
��aw�\(	���d�Hj8,H<�)���')�D�$
��;!���Q��g����,f=IJ�I�`C�MD�y��A�m!�b�f)gO%4�X�����V"4Q��4�j�����5��78iL�W�Z����*�������l5~�`������c��F�?��Y��Y�W��������k��
���BB���:Q����,���0������%�~'���g�5w<>�Z9\^�xdZ��|�C�����d�3������a?�G+.�{:y�����=Bk��
��+���v�����0��m����6��F���X��
?e�s��J�{�����{t����"��~�qElh�D��s��_��rX��3�<���Y����s��f�l5���Q"��$��5�L�\���9'pZ������6����|vC�9�M�yj$�,��#�S?���hP����z�������K�~�iW�A�R)=���	�1[��c����n��g
�E��;��Zq�y�Z!9F���oB ��6����X�G��G��q[s��s��=�{"����wl56q^�bU�����?]@q�E?�;�p4�^a�����b��$����6?�L?�xN~J�Ho���w��E��pu����0�/���d��,&�\f���:�r�n�)��4�r�d{������[c�S<��'��o��������RT���30��=��Ra���(����f�k��6n�LQVH?�+'�����d�|^z�f�QK�;��&�m������X���I>?���,��>0��F�1���[�T���R���Gu���5��af_��|R�7��xwslxi��"u}�����eA&.��>�HN����=b�F��Jd��2X���2w�?�y�>7�����mC�������L�aA@wo���BO9�����G���:���hUd�����~C�F���N���*�V�x��`��h
�P-���x+���Nm����N�J�mqNe1�bz+��2&>ER�D������_�C�63
G���7�^��-A�B�N�Q)u	5�Ev�D�ZrF�aL�9�^��9E�u���3�M�q��Nm1G�|g�A���g�W���f7�<I@���N��|�d�e�����UAT��%;�/Q��d���|��p`p4�V�a��Zd]�zD��+������	Q��u��Ta���u��6g��|)#�a���g��D��R�q}b�-���
��2������$�����J��+�p5^e[$&{�@��rSD���["E'm�(��Y��X�4�[���(��.��n�5�*�h)�R���<�
c&���cu
�}���:iv�0��0�%f����h��(x��{.-6l���L��	����M+���]1��u�}�����RD��^0�D%�P�v����C?��=��7yp�������^PE�V���,R�W�`�K��LN�:U����J��t�p�����,�)�����AljW��'R�������k
j�<�����_�,�X2|�������|�����=�<c~6�a�l�R����!,���t��A��Yoz�R�B�!�������RK6.��B�I����N�0��H�=r�W!���K�}��"��7�w"�8vx�&��)!�w����)On��u�����'P�%1e�,+��/�V�jR�Z��?7^�_����1o?���P'gYa)�1G/������L$	����
�
e���"S��{�Z��D{\9(q40pG���HtD��)����8����"�aP��X1����y�Ha��(o�x���O47���������	�O$.�b�K=�]��!5�x��+8o(vv52�u�X��4p?�-M2�?]/w�Ak]��0�uh���f�����uO�����g�T���F[7�q>�	-����	�����a>�-K,sM����-4>e�I����N�����CY�^6��V��%��..���9�:-I���U�f���u��r~!E��	���!�Ds�J���,gA���,�UB�.����4����uS�@��x��p�7��[-&6���YW��h��DQ�P�3=}c1K�eO�j��v�b1��M�����z��h�Drw��RrDF=1��V��I;X����d�P�>�@2��A�E��p��������fu�8�^�{��G�<��6�Px���<�W���9���T
��x��Y�6���, >$��1�P��KO%`�u���9r2N���z��3�4L����LY��>�����Gq�^�B�]\�����T��j��.���+�.��m��R��V�M_��=#<9�u��V�#��������c�+��'�m�!.�q�)9F�����'K�MO���/����6�N�;;��E�*�Xo�rj��������B�_L�F��u3?l��}/fE�'f�L���@��v������CXcA6�:k{���dG\[���<RKn����!<�!w���1xt�X3�Z�������d����H�x��!��a��������&�B��L�r�(�|�rlkK���LQV������!�1�l��Bd�8����6]	��y��cV6���$��]l��0�?��E����3���%��F^y[*�_#�XJ�7)�Owu)��!�C�m��=QC�T�g����Ow}K
N���P7_��|(��:�����S��G'�������RZ/�
"	@�_U���uN��bw��e_�����:��BE=���$W��W�[����o"Y��%�.rV��>���9S�����J�^"��<�	��V��c9��+�ge;}_Q�9��@���6%
����Q����������2�LR����j1C��Oa����:� V���nBB~ai����{8%���!*rU�[T������Bh����	f�B�N}��F�Y%s�Y>=�V��X����I0����	,K8o���'"��wE��~^�W4d�
4�z�//�pT���I�Z���[z�����0��A\H2){?����V����bkLpf�����
��=��
Qv�=-���D�"A���w�3d�����V7K��r�����8�{����da&:�OL�6t�!"��y��l@���
6I��q���$���m��h.�W���/,I����%�
����� ��d�	zU@2��y��I�2��p��zp8��@��SB���iw�cW��(�h�����#@����;��Z\����[E����4Eoi������6�s�A�Q�Z&�,�/���s�nR1If���
�q~^�����8��]��d��_c���"�:v�ms����
�����Q�E��f$2X(�\m�Z*�C[7Ps�	���0���7��f���(;�_"�M�\F�X&�8�����P?{��&�K���*��#�������Z�����6��C�a�Ur� �f�*1^����-~�������k"�q ���L�r��S�Gv��omBe����X�"�Mg��~��+�Cc��y����y^�7d1�y"�%5�+�)�8�D�.C���Qg��B�k�������8������g.��?���@�*C��!�9L}6C������g��^���W�J�5s9��8"Q�-��5L����	?U��q�Z�����f� �q���b�i�D;�8�n(�H;�2�t������#u�������S	hn�!�"X�)A�%���;��|W�	�i�5����b�G���Y�.X!��}mY��i�����q�BA_R���w���9����G+�$m�:
��IT>��9��>�|����O�z
�1=a��
�C�E����j.+���ib�t�(�@����c�-���p�~l�y�-����
r%oz
��q���PEz�|��d)
������r��{{��(���HR�VSl��O�M:�a�O���v�R'�,��A]�^L��?��+6��|��U��_�)q��=�#�E�z����k�GU��_oP�ph��~��N�8Bug
[���|��	����������Kg���fGd
����E�d�47���
�������
���)�O��	{e�?�b�V�h�������O��T����K^�F���+O6�j#(����Vd���������17���o����r�<V�p�o��\\�Jt��������8$.d,�2���7��C�+�QO3��hl+4;dD�|��B�2�^����hZ?���Q�	Yi	�7x�Z�0'N<��9p����l*�����u��u�����""�Q0�����������W�q�����En^�\m����0�\�����+Z&����lS;^��}�C����u�+�un3F]��������c�n;�3{s/�F<��^�,,NF`��R*Q�s`�{3��~c���q��P�}v���~/0h�����Z�k'mY�K�t�M����0���h!�����(t���b�w2�o]�=��x����!]
htRS������C�	��=�t�%%���"�^���I:�O"������W���M^,'�qVm�L�#��$�������4�z����owgw+�+
����4�ESY���B�����8GK7�r�{��k� n������`��_J�����!���>`�D�*���J������?c����7XDd'�#�a�T�O��K���������������7���E���)�&2u���V����)���ug20D��P�b����6��r��w����F�s����;�|�y	� ����3s!��^���9��C� ��{y�x��{$N�'���3���>����f��@	}�GV-���W\h�rE��xv��o���RhF����oL�*,D�l�H��2�D�{�;	�%���~�?F����^qP�yo�+^�;�-�A��S��g�>=��<�pV-��	�<�0���.�����v����c��z��G�eCG�!4Q��������$�4���!���OE�_�W���Z )��t
���J(�:��kb�;B�R��R�[���]`L�"����z����{������ �B���[.bA�Jv��p�l����N.�E����[���~��Cu#�YO&��3�����9��6Y}����)q����dH��/<{7�K=O���uG����
���Ev�[P�B�O#�D�[���5k��F�m�|��M�Y��v!���QRA�������T��������
�B�3��~����f�:��xX3�=��_"��S|����tWa*�5zj�e��-��+���A-@#th��$�j�I���1����BV�������o^���#�r	?n����9���\�'4�]V�3���w�>��3�IU���wm������"g��h@���:r�{-��5
,�M�M{��*p��*\^�])�7���rsY����1d�������T���n�����S5�LoJ���%|SbQ;��x�Mg(����Uj+X��	K
<:��Z����{�YB=d�pw��������8�_q��A��izY�"��c ��z��W���*^����oF�S����#	��l3�E���d-��[W�]�Z�&_�k�Ea��U���4�������=�u�,@���Y�in� ���)�?8e%��q��]/�;w_��5���r\e�������,w]��o�&q"~z������Cc�hp�bYR].�i��
p%#�S�����$��Xq��%W�Y�9�)H�\.w[m����%zI�B���O�%����ld���B7s��O��i�����@�{ g_�
G������PH�8�@�l?�
�y��T������bt	/7��e��z��&�����)s��)x����7XdB#W�����5��+���=(�u��ly�8��	��X�N��
�>	�J���%g�n�4,I�h��zSZ��;�+#Wz#��
��"D�$\y�h���s]��o_�v0���#���\������l�c�G����~�=R�3R����h�J[���[�"�\��,�/��S;S��jE�}��i{�eH�WCx���C�������A
����i�qE��f�`������>�u����OA6j'Sw���2T@����Fz��
v�/F����&�o�wc�����+�6�{e�J��+s�BRD��zse�����rG~(�a��Q�������V�:'����C�8������\��n��U�}mA
iM��_��!z}�������pR�E ��3)&�������v���*#zU���(2SU�����nKT�j�?��^}jL�6��[���d.=}*s�6H�F�;4%K\	���	�X\*K�j�3�"���!�=��/2��G�\K�0�t
������C��/��Q�L�,��u9r>`Z*�/��k~:�;#g�4��$W2��a�-)��])��L�v�����q0$:L�����PT�
�����
�Z&w��TV��YC$�x��wn~9����At[ET75��`qH�F	g1��[8u�]z:w�i��A��'#�������QIz���6P>7�G����c�[5_�xX=�����v�5��!�>9�A%���Fr	���QE�����E��ON$�'�c$�%�3y\G�O��N�\�vp�
���F(�o\*0>9�m��e��������w�j�\QA�9��z���r��_Q�F?�b�k�"t���j$�t�b��C���\�������(�� o�lT���g���{��R�W"�?����Xl>B�vn1�z���2�c>�_�G���7w�u=iT?�hKcr�<-�b��	���Y���DHV>\����~y�`7Xn�F��~"z�G��Q�;��"�R�q��y~����X=k����V�a	qW����(�=z
��|U3
1
D	��ds�	��GAX�U��7�Z���2��������r�(FW�����rK�
Bo�AjW�7o%<���i�u���9��"a9`D�cFo���\]�0�����@����d�q
������m�[���)2���v�O&���a��G�������+���6�H���
i)���R?
����R6���4rw����;Q:�a$`���C^�L@_	�*�W{�E�'��|@����|Q����6�*��V;���W/����
�y�:p:x$��,�SK6z���$�!e/�l�n����'S�I��kY������
_���F��
M�=W����|�#���x?�j=��	����j���2�P�q(1��d�O������=-i����x�&i������a!��CC��U8|�e8�HT���/���y���1����D&���	h2��q(zq$R7v\���|�T��|���UX�6����_�[M[��������������E.�WT�/����9jk�������Er����l>���EM)���Q�����m�������EQ���*���,j���N�c����	�=P���;0��/s�������x��Kr�xed0�M�{W�R�mksP�liZ����9��������d�&�W���������HW4IA������LN��9��/m��w>1��u:
W*���t�?�$}I�9�
�_�
{t)!C��~��&J'���'U�mM���$
�kWN(�\���K��)z@��K���,������NZ��2q�	9�V7����+)78f"�h�)�
�Q{���7�d�������_�$RH���b��L1O�785��qB��#N�Yd��3o������<cO5��������/�R�6�����P��%L�:����~YyO�[<�-�����'�����l/>b����E��Z��V���ms`�5D�1]�d|����x���V.�m�k)r"������������Y��`7�0�m���f�Z���_���XK|�����H��m��		\7&z�C��+���|���s9�64�\#:�����T
�����
��	$"e�B��m�Q|��E1�n.�z��E
V��[���t��������6�����x��q/���8�^�~�����&&�SR:[�B��G���w��H^*0s�����=�����94EJ����W�x��Z���}�(;��A�>�oHrW��u�������5X�u���x��0�K����+H��?�5H���62U���v�u��}�m�
U��������k�G(e�F����*�o���v�>�}R��+�/��&I�P��l�evf;�K5$~M��������f?��~ �q�~�U�(*���I�@��l���5�1S��Kgq�������N��j��3���D�D����w��C�c�!m���er��7�61�d��������3��6�U��7��!a
F	>L�Z}��jB7��=��Im��iQ���.u���/5�7��$��|�%e,zqM~�6����_f$��Fd�2���Y�0=��p�}��/g���r�?u�?��B��X���|22f������~���:�o"�:��PHg��T�*Fg��M#�����=������.��]AC�Je�Qk�z_�iT�������759>,���B(o`[��#b���>�����Y��P�9�p���)�t��}��mpk�
6�%����)�&�4{R6��5��R��g�t-������k\u�!r���I�_!@GD.F�K���bN��`��
���W��F(7�{��oG��-)jCVJ+������)��3����#���E�����/|����o�&����Z/�q��xl�z����G||7�?��c=.�}�5X��#�U��[e�6�������nV���.H���i�H!Q�9hf�|�2�)�B�3��PF�A1���S���=��*�z�$�A�;c�84f�!���s���Da������3��)e/�b
������>L��;����!XMi.�B
p:������>c�r�	�7������)s���L��0FN�M'!������So
0�o�F�m���`������ (����a�^k�R�C��!�p�+L���m���Q�!uH
���}i�X�zU��`����, 
����Z(}"��k�]�*�������rC�)�d~T�I	�G�<A�Y�������:�;����y���Wo��XP�
��$��	��YA��
�T����M"��I9A�j���/�����7���������x+
�yV@�@3�*3'��Y'��UD1193����@�H�(�W�LHTC��c@\�Y�����z7���V���c�M ?��_�M�z��Z�Y����0	uwq�oHlP3:���$�s��������ch�����9	�*+����HMJ�O�
��!����)O�*<��G��m9�*Y���qX��	g���,�h��?�b<�8Y;��?��\�f��=�#�fl�0�ih����������~�������3w��~<���A�k+�I��r>b��M�+�P�w�B�(����{�e�����b�=��
�P������c�=^V�C�W���No��t��z3Y�aL�/BXB
` ����A
�$VW�aJI��u0Bs3�����2����,��k����YQ���2����G{B��%��4l� �|e��cjY
�����U���'�*��O!IW������U��������K����>-�0�nL:�����?o�C/,&#�]SJ%�� �#,��}Xi%M`?����������`���
�"�4�@�H�����W�����2����c9����}x�'`�@G��i��q`����`���/��B��Q�P����~�r�Nq�F����w��	��
��:+WS�J����+������r%'k���X)P��B,�-��z#E�������Kt��3����������!?$G��.ep/��
����9�,A���f5�<%��J����
C�$����
l����P�>A�����A#�N6���1h���b���
X�d����X���0<�9���CjJ���v�tab(�lP�E�Bo��6��� ""����h��H:��g��Y������,6���K�.zA^��������1K�a�h�\$�b��
�K1-
B��=��B
S�����,�D���+�E�lP��8��F>�O
�!�������&�R:�}nR��L"
��F�����'�������X����ak�����������F���J�������(�
U�n�:�$kp"��[En$����+�0\Qr:�P�pn�FeXv6��3��<�FDP���`��J��i?
����@;��\�����3R�$w#����=a'mC?��0�1��An8���a�b8�"���yM�I8�i�a�\��G�7������"	�w�����(�j�
c<kJ#������9`��=���y���%��Z���bUBa�03���n���
�o�!^M�6$NS`��64<W�9�m9j�����"��(���f�1�m�ut�v�E����F�X��g�����p�Kz�
�f!���P���E����*V��S^�4��3��3��@���7O]�cu
d�e�S��q�������]A1���
f��w�-k����S�z�B���|Z��Sb���L���}Y��,t �:��h����\df<��v��T���D�8D�f��8$N9Ur�#N�S���)�D�:���(����0|0�2�/������1jxG���V�0c��G�[��t�����A�aO�~J|�`GL�c.�v�{]�F�u��Z��;j���������/���UjI�{�~W������
��R����Vt��������Kd���X�Lm��F�G�o�8��?����A)Tpw�*����~&�H#��h6V�hj�hWVF]��u1���V�YC<Xfv�*FB���i��!��;�G�wc������j�C'=��
�N�RkzSVSf��/��e��&O�k��u\s�����}���X}�"P7����J���'{<-Z�8e���|�������RT#�J
V�����A'��r�f�����F���k�#�y��R({@]��	1��~����Iz��l��v��U�.1�������Cf\Y{�=��p�\���:e�~����w������!�2)�j��(D�Z/hh��h��#Ud�IA��;L��S�hZ��z(���=G�w+�5k��4�m��OV�i �1��g����v?����)�<2��z��PChd�����UN+EjB�k��Eh��6{e�y�=�0r�,~���}Pwr�#>�����qB�5'`g�x}3z��:
]�C���E��~b�
WU���~�;
Z�
�Q���fvP���U�m�S����q�D��#������^X�VI�j�(�_�u��~����X���A���p��V�(zaK4X��k5����a��ly�����������9}#�m�f!�{�Qu��|��}4�����g��]^������x3���^�S�J�W�[������y��j}	�="7�S�`�g�\Y��Y�+/i�	��e���y��U����H�TEpr�ZRLC�������1����zt��>��gGh
J�!kg��8��
|$�����p7��4����|���~f�_�?�'�*]��\7�y�j�gc-�!�jqyH��K:�P��%@�
q��^*\o���:bY�5�y���<�
�5)����j8�yT���6���i���f7��	�z{����g4"l��y/�2�=�1U�t�i&e5�������a���o/����=g[��a��A����D&�����g��I�A�zF�fzG�����g�2s���x�����U��):�7��N"����h���/9D@���('	6r�I'D�k�� ��]���L������O%n��O-o��4�]�"I7L��r>��#��]��iq@��]�!�"�C�����=4�Y�J����W*�0S�;������T��u�2�N��n.`��I
�����9�H8Qq��K3�
�D�@L���%,�����o!45�Ch�<����~�wu��A�7��v��0,��b�f:�Z��b(���J�����P�T	�@���W@��_|2eRAD�%����7�-f�q�h
�
���A���g�+k�-m��(���.����|e
-@5���7fT��P9�p
0@/��UJ��2D����F�T}��0�����4
�FZ��S&Y��U���P���T��x�UT�T]Id��z+�m)�:��S!|-!Y��j�������VS�L
7��%!k��b��@�(7:��N�P"�l"�.�C�n���;�Cq������X���s}}����8/�9��J��`>Fgv{-�^�0�HgRt��QBj#��)���+.Il����&��Hi�R���,RD�����~/Fx�����XpBC�Xo�s�Wl�o��=�b�w�I6��2e���Z[x�0�a�j{����#��U��}<��o�2���������aV�J��yy����*�<]���4(��������g��d�$��,��>V�9����z��*�����up>�}�6_��
�e�Rv�������#����A}v�D~��E�~�������]
��������PLS;��GY�x����������,�5��qf8���z�fBG�w��{�Q+6z�����l���t��h�{����7��V`�cwj��#8D	��r�Jg���%
�!i�b����ZS�F6o�(ga6�w�|�\�_� d~���OK�����WT�'=�??>��lo�L��G��7��n#4����4e�D�-KJ0(��<Jt�	���,_��a��x� )o&�Yrj��b����Y����:�9'���fk��f�"���i�\�%p����`�M�)K�o[?j�lm���o-g���'�R�J����"�(�l��8�!?d|c���������b
��[�+�����R���=��w����TK�.������N�4������bR"���:i�iT�Sy�Xw%_�c��M�����2��N�Yq$��L��
�@)���]�����`p�*�u ���"Ds�����[��nq��z��0�9���y���IM�T����Dsh��Qk�4�d��@Z��sua�2��Y�,4?��S�m[1�3<.>U)W��;�	���y��kB������Mm�b��
8��CLD+�;.���v��y}���r�3���!�0"m�?TyK���0��q�"�?vx
��c�>��4H����vC
�G���/�j��(����V�.����
��o:_/r�H��2�y��FK�
2��d�9����V1n~d?v�%Q�����:��a�V���U���\��Xm�!<��6S�C@��?l����l���j��a�,
��T5���b��|p��G-����{cd�EK�����Fc&f�c����p�Ik/�	�Y�V���?�_9�15�w�����E|�wk�W�j�@���o�2�@���#��!�H� ��Iq���C	��c�t/���]�=����Q[���o3�t���(�v��Kb�c�q�������8eR�e���B������N2�Q������c���>qvj��B�y_�98a��0���R����H���[���B?����
�@�
����By���s�L{�k�I������t����	��>c���{r���2�z�^����Z�Y�����N��:I4�-R�16�-���`Y��f}���4�cC�cv���X	M��u*0�~5k���E�����11������S�VFI����d���k��X��o,��#x_\�����+�\�0PN�<~�U������ ��(=Wg���Q��P{`:*������'4��XS��(��p�@����[�	b��>Nq�P����
Li�d���B�}�X}���.��(�������_���b��C����<���/�YFr����YG�p vq�n< �������
����*���J�Z�����&Z��1����;(�rkD~�;�IN�������uM}��`h�,Y>A��6qxz�x)����v*��t���}J�(V�]����9���B��*�$3��R�]�n������x�x��}\He�e )Bi���'.�NKF��{�h��cO+��b��	�sA��������_�B���������#!��V�������^t��9�������B�d]3�DO���'o[����p�^��T�{�Q
<n���{�mfa�S"�~�g
��V�2O3����G��rV�(�El�_1G�7{���V�e��F ��MndN�IW_N�sb�����xk\������yF��
H/����n�6i	�$��*RZ�-�Cq�I�f����l�'���9�s�A"��'�j��`]T���dPs�Uh�S��U�p��T�������"��Q�W�k9J���4U^�������BO�gi��Q�!J����,N��v\U)�����8��o���?�P\%��Kj
�� uL�xl���3���A1
��|�?�z�/��7������*�0~X����ZN!�/����`��z�C��va�ub�A��D@M��zl4������O6^In^
�R���W5���`C<X����\7E������V�.���>��x��dP���W�Tt�}W�C�2Au��^�P�/Ma��5����mg���Q�FSbCjL�z�H�}G���HK�g�}�u�K�Q�.x����q���*ju���N(�K�!����2q�IT���N�m�����&L�U����D�JA@P�_�9jw��������LT�	��"�8��/	(�Vy���)�
9;�;A
�P�C#C@]��.���lt��w��mS8��@��&��(&�l9� �g0��� s����]`���_p��
�g���I|%��&�N��4z^NV������u�!}��i�v�'��w�R����qyl7���z��1�Y�E0)r�������,v�5�'- ��`�^@ ��2�����{�+p�FAQ�����qE����T=go�,��o,�P����� ��V��:V���{��w�b���jT~��1�����#�
��R�+�i8.�!����{��J�n����+����#_i
	��C���iAPXcO�����'A������a�>]�u��)��RF���|��������E��G����j<���x��������x��_��{G���������O�4LPPG��9X)��t�}����nq:�HRM4lI~��x7M��;�GQj&�h����S�������g��l$����Aw�,�m����/^�7_�r�Am�,�T�����
]�|O��o��i���[Vf-��}BogS�x~h(�����$�����
�$E��}��(��fu�h�2��. uh2�����W�TzX�2P�1/�E�t�s�6�l��#>�i�A�����l9?�
yj�� 9K���'���I��M}z��>�h\T5���g�;)�
�����a7�������[�)G7}�COy�$#�gx�fSC�i#��mb|�T���K���8@a�/\Qz<6���o��]���O���{V���0����3V��	�<�ZWBUn���$����C}@��0���J��s�l�!���HD
A+f���\3���g��f��b� ,d��m|h2(i(�v�{����l�\^)���E�����?ey6�=���@m_�Q��}\�j��x�M-?W3�Ri3\#�����u�+��r��Hd�)��f,8@�?����N�X;'L���Q��b����v.����dK�gX�
��{=)h��'>�����XYKh����us��W��x*s�	HV�A������a�������Jsx^i��64�PG�Cl~�+�M#���pN{�.Y��1$j5�D��~<�.�s7���^�s`�0��*�Q��I�$�����f`�Q$���h�o91<��#V���\��@xI�~3�KZJ�>����(����h�x$�
6>����#W&/^�`�o(�2aM���03��nDI"�s�s�K@
�0��������QV)gV:��H�$8���F��xY#=`��3�e9�s���@"��a&�Xa��6YVnepz/b��	0��4��|�)<��t�TH��81���ef9Z�a�m�Wv��8z�q"S;���TSac���| 6/"��`����c	$k�kqCQ���g�o�� 1����/�g3r�nnP��u���� W���KG<�W�$ZP�Vj'�a�j�.��;o��L���#�.�[���t�� .���"�xi��vbz���$���/A?%S"<
�hUY!\��zc]��3�u����O��z9��Wq��O�@����J���|7���q�����rT:���]�
�����?|��z|R�K�^}�g�	G0_N @8��.�os]z��X����]Q���P��W�)�U���k�E{��cqC:4�Z ���������J�0��G\������fMC�7Z�+�a�}

�����T0u�����*-�*�Y�[M�9���?Cu�P�V����${Z(���8�����'z����9�+��y1�c�@\�g�xA��p�$`�_�����������R8CO��$�������n,�.��a������)����h:�d�L���@�{2�ZS���1i��d�����)��@��_�Bht���E��&���y�|����s�>4���<;~"R�����qx���]�&�����mwR����]���D<�}��
�1liD��l�Q��G�@����&�u�~B��(���dj�[��7��2vD�t�&�;�9
��]�1XK~��5�]���/�;����UP��T!��7���D���j����f�=��������|PT���.�o��=�$�Z0�9��RU��-+ff�������?A62Qbz�T�BY��MxBl�m�M�w5dN���:*���k�-��j�M�]Q�\����b�������,,������T��\�;l�W���2$U��Z���O:��+�Ke�����h::��7��D��z'���k���'��s���E�e��������N����u���~B���#�Z-
��N����q��D��R��X�����)/��4���w5�?H2p�����1w]�&�J0�R��t����Ngj��U}
&f	M��I���-��������2�
�?G�7��@�������i�<-J��4����m�j��*�U��h#�9f\O�����mU
���������:���a�E�0y����zI��N����+d�&�4�q������9��o�/�$0�Y���c���Y��&*�W����I�����������\���&�A@���>���^����H���b1�1T'l�?5J+%<���l([���\#�ny��4z��YN�0w$b��7�3>vG3N���fg_;�~)��=�2�$��tf�W�m�s�,���,���)/�:_�
��*��=��E�����uM������v�3��[5}�5\:����@tb��������GQX���D��\V*��jf�_?�����?0�W�EK	��J�������;�����1�����L:��:��
�{��Br���]��;����8��@��ij�K��7v�_������U,!����������D�#���4,:���T+���-��v9~�V~![���F!��� ��(�������n��|�DTl���Sg�l�E���[5�5;��y}����9D������/i3����9����B� �^pr%y���Y�{H��~��t��Kr�Ey-�1GU���	"��t��������9��}���
3@1���e�K_����C0���1����S�~�z�r@��cJJr6�
9sDx���z{��1��s��oER#�n��K'����1u�������4�\��z�j
`��o,��
��F��R�5���I������vy g�q��B:������T[��e�4��K�����n�I�f��������$G��|�G�[�z~Q������2��ya�����k�!h��kk�R*��y�����}��w���"e��tw9�u��]�d��[=�Go��]��*�,�k[&�d����,�>�-�=�#���<Am8�LoF����_&':E����[��O��(���q�Q��l��$��/���C�!7k�kw� �AwE�@�|�=�����I������BH����2��3B/�w�;K<2�a��L6.v������k����:@1����S��G?~*"J�E���1a����������~��Ae���*�h�fzg^��3�[r0[Qu��[��Y���g�!9}��V"��A��)��^9Y_>R�~�;��r��Z��B��Kw.�D��e�M������HUeq+�BQ�9
��Q]U��Hn�]�7�[Da�&k
����8]�;��������0+5
ZW�'h�O���oCYZ'�:#W(>(=��NO�'���(����-�.��I�Q����������S����92��~��X��m=��'(z�E�u���
����q�-x�r�K7�����:IO��RS*��h��J��w��@�VL���I����yw�
%>�'/���1��3�YD�r�{w��rr���9S���XGb"3E��$����N**��!�����U+.�;p,����+c���]4R��{��~O&���K�;�����_Kg���s5!`�o��� 
2�O�:�A%�h	y��j����=h���/O�����0�9�Hor�����1�����;Y���?��H�c�����@��t�=&)X��>�������0�l�b�����eP���d����t�
���]�o�`��x���O>rjY�j�S��}���5&�g����a<_>Dj��$��}H���az@��Q6�<��O7�2P�S�h�8Mg$*��wh!�Kw�,�(~n�]P;�a�#��@���V������$��k������a��bWX�(t�� l,0�
5�t�����L�����V/��/�:C6���g�3[
�o�F*~lim��t��jB�Q�+�>�q��"a���L�>���B�{r��O����N���:s���gn7��X��� ��|��	.r���\�e6��r_;���m��M/i��E-��Z/��\�3j��j?��r;X���A�fx��Rv��T�Q�
4�����~��N�I�,d^v�����'��x��}8��$�����W��������8������Tg�a��B4����]�.�K�%V���96��x��n5�[�YEv;��1������hu���Xe>�y���A�L�H�����U=�������������tbX��6���6��xd0�8.Q�QZd�D�XIW��/���o\��&��[���;x�nE/.��Q��2��
O;���_���������[#V������re���lu!�%z	x���^��@S��@���=a����M���v�Jj���+��q�M�����)�`�����T)���|��k��SR��H�\Q�h��U@i��d�km���l$$�O�������W��i�g�	�F{��8uI��Ah�������_�(#��-�q��\L����*.]�������,u�=M�l��1;�G��Vu@s1yO^�-r���=���q�Y��}A��i����������)d����8���8��O�U<:�?�4�>������C	���#c�u�QT��)�]�&{�_���������#�;4=\�a�,���=
���h�����m�XL���;3�7G:�0}��H�qo�e�c��_�(r�vq�fx=�f�=&� ����3��n0v�E0�}����S_�������DR��N�u�xr6�_Ce��!�+��B5���/�{���
���s|P}�o��Qf���~��6�e�fTb�]����.���Mo�2�0^q���,��c`��!c��l�a�N,[��8��V;��A��%��$h�F�v�-nR#(��c�����431��2�!��t}f����Z��1�e���
��'��a���&��w��/��Yy����F7$zupU��5��S^�g��hodm��n�	��p �����;M�����g�@_��i�#��,I���r�����$�j����e�ZK ���X���tL#M�3\�	��
��z���4�3�	�����Vt;���D�������>2�OnB��������_eQ���������<eq�1�1]	�"�x�c�_����=�2��6��h`�a�2�+��B��	�-���>���M1����]s�e���f������D%BJEbn(/�P�.Z� �b����i4�4F��������vE �����x���<��`�~K��_Z`!�.s�l�i�������J*k	=2��=���Z���m|����NM;��B�WZ��9�~��Q��E�F8����gQ��2����k����`o����a��,�N���Bg������i/3����dg��
����JH_���6X��o��:�M&����������mZ����"�U*B+k �KW�����{>HSz�����Ln\?���e�\�g�H����aj�W���0
�LC��b��	�_�/xi�N�;� �	��5���Bi�(�����e�0�:�2��W��O��u��M!�fw���[w:\#��l�M=���'^�9�8]���j���r�{k	
\+O>oJ!��'P<hY�8</k��]\����J����r�y���T�H|��[kd8�����47,h���x�
�)�R�)IQ_�!�oW�����<�4X�����������SE��
Qj3R���g�41��L������u?�b�����G^��f�q������E����5;h�}��F_.������0���jH�	G��g�1����A���Q_������/���
��z��%�-����V:i��n�&������tXL"f�;�5WP8�#<���(o�����g�w��y�T��E[��0r�[��D�MO�m�[�bj������;�5+`����>�����G�O����->��N�%�:�R���8�E�!�ae������jK�*�Tz`$,�L�Z�o���'h|E�����c�
,����Z6���7"��p�%J�����
VC���(9a�Q�\�SY�2��[���JHX_7>���+���,HKY|���\��U���<k��8 ��F�/��)P�����k����,��v��i���/�`�|6<����{T�(��d���j�]C�;�3
9��<�2:�b��]�Do�C{�w�u^��tj�z5���i���^���U�ll�h������!��$��|2�z����4F�bFfm�'PGw�V�<��7�����B�o%����U�������1������=oS�2G^�����n��x#���tC�T���m]
����:Sv�����U�1JQ��|o��b��a]���>�QL��>�l^�F���
]wa�>=��_��
B��V���#:�D����#����PNp$ck�]k����]���H�DC�4�}������`�8����t�Yn����H�}�4�4�3��6�^��1��WG�0��k��z�[���
qNW�����x�]��%���X����%���e"@L����7e1�Q����/<,��0��,uO�a@4 ����U��ur�\���_
����X��W���K01�:��m|Y�R�2�oK��E7�@�y�l����6����8�H�AY��[l�������@���*��p�>���0�t���`��f=���7I�j�j[��h3�Gn)�/f�5_a"���Z��CF~�t�����(�����v�M�u�S%�X��)����mt/���^7��t����E�-���D�� �N6�|������(��Z�!~�?n���e S����p�}���`����\in
��9�v"m|���z.Aq|pH_[��zY>�S����@2�x`bp�r�0��
:����=��U�I	V�*�U�n�������|Z�/�����������grn�����D�\�}!��!��}l���Y�K�/�7�����'_�:JF/��c+����Ke����H��V`,�h���2N�/|�
Z�����p*��,�M{��p/^�t��z,�M+�Q+��l�)�M��\��V�o<5?Nq��S�u<�D��_\<��8��I�����Iapiy����������?�N����d��*s`������V���U�����?w��^���������E'V�)����;�Rbd���+U
���=[�_J��*��~��������Q��j+_����E�l�*-dp�Z\zC�����c�'
��4a��I�r>�Pe����F����Tp�A�D%Pe>���r�P:c���K�e��R���J��&#H��<��i��������Z�wj�����7 ���$;�1S_�u/V��Q�\�\��@q$�����V=���SS��5�ZX4����H�	<�����]�T�������;|�hI���Q���u��)���n��es�q������O�]Fg��!��k�� pO��l���$��������rs�Q�iV�p�M7�z��(u�"�.D����Ds��N�������@]�8/h��O����]O�P�4#���G��t����`E���k�v��}�0���q�kj��x�G�UC^��P��d%��Q�V�����/!������������Tr���X��L�&^������m�r�`
�e	�A����}6�
��;�H����]���[n>S
�R�`|���D�m�u	���P�S���|#�&��Q����!,���\�.�C��oU!A���v^1�.�;O��My�/\��8�*7��o��S^�L���Ej��Y������=�}�'f.�w����%�*{+7����D���t��D��_��zam����u(�^�+Q�rUu����dz�+��e2c�U���@�D��wP��~���Y����'ocas��k�����F�'�E�J����X��=��;��@9k-+����`�?*J�|""yx"I��N�T%����M��S'_��_�6�2.7/�J�������r�U���P�t[�YL���N��f�c��_��:��T":���� ��/nv��-A�y'NlX�	�I���%Mg43�������g��y���FO��J)�g�i��2`�z��X����*l�����#A�5=
�����������
P�^���.~U��/1������t��e_D�~s�5]�����Ga^��%�9*�Xw"�8�dT�~�'e��T�t�����Q�C@
4���\�����[���/s&�,5\eD:�>��!{����aW:�����o���}_����,���5����o���+LL�O���,�<�A$
�bH8��*�:�
����zN����ySN�����E���}��a:���������������������n�nR������`=8N�,a�*�a]�8z����8��9EG�bt�n=�ZU�3k-%�;r�t _%�y����L�3���/����2��uS��!lc�W��7*J2��m�����8,3v���a�`�#��PR�o5~�yE������x���Y�(F��B?C~�r��z�$I0�u�q��"
�m��+I�Y�q0q6Ve�+�nD�s�!���j��Bxn�gz�*��(Q7���A#�|���I��Z��%�U��cH�����C"��[(L7���:^�k��oli6W��V�c�;suh��P��\
E�_%��e
�iA���GIn'��F�m����yk���l�I\��"RTn`���}bo6��bIkn�����#��)��l�m��6b[��~X�i�h��|�TK�����b��D"bh�����?��f�sd�S-�=�cd�f]k�x�M��l�T��HmB������_�dY��������RR-k�5�����~���.>.S��5v�A�bT�c��b&�����CL�����=��</�j5m�wV<��Ps�X�1�����=�i���(��{T����)��6���p���@-��������z�n5��i��MU^����M�}�-�^�xl�n�kCqF2Y�U�)�P>8�:�W�N�8���r:�>*�C�e� ���?m�B
��c�,"l�U���������8;��b�@�;3����$��QP�����@B��@�6��TK'�F��M'�U�pHb���(�'�>�(���0�lq��e���^�������.9zP<���V$i�5�tp�|e5)�]���KvQ^���\O��kQ?�D?�q
������|�^)Ev���U2�1��3�z}@+8;8�6�d\����f*�
��b�����$��D�4������B#w<������l��	`�|N�
4;_����a��PT���iu�-5M��rr���N��k��)=d1#�`k���=��Z�����c	�!�������jY{�P�d�pS��X,���:coe�4f�3�D����_��9�,�S�IV>9l�7^�{�- �k�����(�wv<K.�w��l�����Q��\��X�\(�w�r*�"7F���O���+��0�1��;���;��S	]
���4e�~B&-uA�T��7h��Bo�/{��e��
j)��_*����r���H�a�.�9N?��/p�|�'6�)u��5�	\jK������[�	j?�/��E�s����gY�=\'?��%����3Y���1)#Xf����E����9Bh��or?��Hyr����(��F�� �n-�K�����Q������-���P��;��~��C��=���
��*b��!������e�����#�pSg&��g"G��-{�@^U;g���u���K�SWZ��e��@���x&]�O�Hq-�D��\���*����J2��8�Ue��g���Wo���t~��&��b�|	����e��q��A���9�wo��N��#�t� �f��a�V��Y�b�W���IqH.0$�DT��vw�u�����R���i������E���CO��x���4!>����b �^6r�Z�7tB��g�����q�UbK*e����]���iY��_��%�;-������Vl�_yk������Q����}Uk�~m��X{A���r�8U���
�sl���Z�!g��x�U��#�%Z����,�2����k�h�{��~��s����$T\��������D^�s�� �lH ����#��Qt��%���_���lY���re����YX���:��EE����R�"�:�2�#��E7��9e�9�Q0v�W�|�������;�_8��p��iheSHf�W���>��[	z��3I�A�o��q�b����
��\�q�2Q��gr�|�����
��d����h�U7.�T��geae+$�������p����Ur��UG���^?����.[�(O�&��?��d�/P5q����fF����~�#����nJG5�q^3��K/�	�c:�m�:U��d��?A����VF+�xV�3F����^�1_1�\(��,A�����&k�c�<�\&E��)�"��d��\~h6��c�)�OO���A��0`��'�'-��GY�=�=Wmg;��u����9��atl�7����������-�f��;�"}o#�)p	��]�<D���4�E��6'�}��O	��������J)������*�-����[�4e&�PP�]]����{�&����D��|����y��*�u�������#Q��0����`*|�	bU�Y�poZ����u����z�&�)�x@z�F�)��{Z����Id��
3��h�$�8Z([4 ���mq��U�1�
��k@��E
������OO#	NYvsJ-�Uqb�����zpzR��
m�0i����&w��#B)<�C+4�&$�~��k���r������V��q[�aa��w��e�q��v��(�����
�|���~D�������{�����g���h�s��5��_�E����:�`�����[�w�u���C�����I5������pM"hE�,Z�ME�e�&X���� ���bk$���4.�����u���8�2
��^R�W���\r�^���0o��5�Q<B�(OKg�w���������������Y����
H�f����i��������C��U&�
e��:GvZ/}������g��!�4�H�do
_����&�<�l�C�b�;�I>�A������E��7sW_e�g���h
R��*
v�z!r�6v��%����	2\�D�LA��1��z�C*o�Cu!L#���6tI��>/�U���W�vD�6(�(����%���%��}���	��DH�g�0���;�����&w6lc�{�f	^y��Q�1�S�`��n��H_�'k����j������6MN�rk�M����� �0b^�3E]�z�������::������w�c����>����)�J����Z��T�([����k�1D�d�3J>_nY!��J$���������B�� �H����e;�e���D��+�!q���l��1y�QMh���|c����W}��/#w�' ~!}�`WT���w���pe>;��l�g���]��*�N*���q9��(A�a����<��=���1��Uy�O6X��SC��N9O��&����6�D�*���6�#qF�\�]�eO}�;��b��1�^��B�;0�m<��?��`�����;V%/ �}���B�|�CN-�K!}O,�)P|���+�����;/$�{e�$��n���{��@�^�z�,/��P	�eAf���)y�K���
���;H�$�l��B|�Y��������T�3WJn:x���o�;��P��X��R9�S���;�Q,�K�e��]�i{3�B�T�!��P�<��
t)�����2P���)$U"��2_��b����m���d�%���m���64����Y�8@/�����C��-������0p��=fXb�x�t��=���&+���������J�r@��>���������^'��&l�^������AH�7��j��e�t����@�q�q�G��e�+>!�$�w�u���R����r����I���R���{p�`<�>�s�~3��.���U�\9�M]@�P���e��a�wo�_n[��C%��7k���i�<1���5ly�r/Y��h��&,ln
�?�J>�p/������%��@e�,��q]EG7G3�4ua�������n>��2T�����Y��A�i��@[[S�Lo�yQ1��=�4������-�}[D�/-�:�J�j5r���,�y�������&�+�Ur�������&o�|g�����jw�$h�������&�\:`m*6h����������i���_�����(���4s"���`��H����nn����9��0�����qN\V����@���`���r���ka�#`����t�=��Vbp�C�[���C�vB�4[5��0�c�I;[���8�)��}��=crJVS�$<��\F��t�Lpz��.�6�rQ�}�i����Q��|���]w\	n���}�5����RK��.}�Ss1�����!��E�{$�<��X�g��[WR��qz�:s03q��R����F�9��5���T�����W)��=m�>�l�'���u@�/��������<��MDcW�K�
����w��m��c2� ��>d���i���LN��M�j�\�Q�	�}�a'S�$�=�W5��g�[ENOu�����)E��PJ�
�Q1�w�+}�=��S�l��XMii��7���9���B8)�&+|�������58����&�S��fAx�O�#������\�]���?p5&\k�C��p+Y�!!1��8M�����2J.��~�|�S���Md�3|����{��\�+u��o$���r'^��?9c�����!��+":}����qy�������c�3*��E���_.Z<��|V��4P���^p����T�:����{�q��s�R�(%Tgb���<���H��N���e������w<�U�>��%5wj�����#�����cl���r���`��@=��<�V���������'��/P��rz��\+pt����C�����YQ�D�x��� �J�vP��	������}=��������i�1�
�k�q�)\@�����GIg�e!�����^,��N�W�q$;��
�b�!S�5��\R
[�
G'��u��
h|4���%�f�=�K��orp��(��"z����>p��i��Jp�&����������?�~C��
0S(#��o������	m3P�����Pl��b�7��R>�M�H��AJ"p��&�L��(�Ai�1��@#$�����\��v���S�{H��\�B�"����1��J3��@;���pS��vCQO��cZV�����P���I�e�Z��|�����A�QP��H�y���"���Xw��;>��W�[g�3F����V$��6lm����[Y[�-!(A�O��L��f���^z��}XO"���;)����R�;}�;����"�m8��}jL�����HF���0�����~7���<sR�s	���P��T�O�U5���o�B��������
�S�_�3���=���k��BF��r]c�����C<�E��%�7�z/5�j�f[���;�T(���c$�TY��5�����5�����4���G���v9���%}����W������G�

w%tk ����n���=�v����-����&�e�XUB>��?Jc��R�k�[����=�[�q���i��CE�=�{��b{�.�h�- 1
1ND�
.��][,�Q?�<#�d���&���V����Xq�:)���W>�n��>d���K�������8��$��=�|��=WA��2�
�}K�.����A���5{���W� �����m��As�yP7^O	���3~nY@!rk�BofXc3�C�����0�b�N�K]'.�eX�p���;T\�4��"LY�Jo��Q���,t����"���������z�^�?,"�����1�f��[�c#�~��]�S[�
���i�����!6��G����<����U0W��	X�>�M�m�L� d]��U���D����t�u�2V�]S���|	�8�'�"���(����O������N�2�^o�uM����|_�;}���IZ���
}��z[!�)��h��E���-�h��#�1��|yc9�u�A�ga���-�3L��%h�Z�Lz�����M��P����N��hA{f�3��}����'��K/������r�����s��m��H��
��(���u�X�s�����2�u�H�=���.�&��>ElN����E�t������R����{��Z���xA� C���L��?�{�/y��=N�8<��7��a�|��z��^�|g����4U�z�n��1c>�7�T��J"<�/�f��G����,O�Xn����8�{ckt������iI@|g'LX��"!v�Y8f���%�G<�����2���w�K���&�D�`�T�_�v����f9�H{f��	W���7'�	�rR��}.�����S�U��
��_�bT3�Ol�X)�m����3������{��	D�|���[�Tn���TgNU�%���%NxQ�*
�&:���6��M������z�1�P0s��
�j����ea�Z��e�h�tm�EbD�����~�3�nT\�o�qA/��{�������&���}���F����>�)�����"xc����{��&)�J��8��K��:���������5"'�ZH~p)�*�l�Y�������7`B��SE���_w����U������Q;�/�����ix�M�m���Y!�,� �K3�Q��vuo�eX���)�+��:��x�����5�!��������b`c�����W��S����u_���
*��?Y�������
u��oM��7�T��7�j����9�r���/�cVIP(��@�,N�F������}����\Z��?��>���J2m\>$a�2�E���0�����3.?+D�v������$���e_��F]m�P���UB��q��L���AQ9��#�������$�n���[�o	e����W�C��X~C����?�>�pP3\RH�;40��5��k���_����S~,��X��E�#���#P�)I�t�=Ve���
D#�,M�/�C?@���$�@�=���T0y:?jm��P��p9v`������u��*��d]`=�A�������M����@g�>l�C��n�3|���X��5�m����cA�]�1Z�Bid:x'	G���^�����{��g�_�������`��*Cp���"7�_��!���@���7��!��eG���
������%9��^y� �.r�}������p��6>���Q��i�+O�N��+�aGC7�g#��;���n������3�}����]�����C����W6.I�%����=b���Ao]�X�
ZC�#�������G�Su�ll�\�U�B�������Y�1|��*'Y$�iM/�NK�|���P��e�l�@s@���z���G,��������;f�t�w-"�A���zO]a�l�8U�;B��kK��}������Y�Z��
�e��n��UV�SfD�?�~��l��C��D,�~��K��mo$���o�B!�Fg1Qbr��m&�W+I�$%��,�����jp�/z�G.����@�����a�RJx�Q#���l]z7�j��&x�������,X���t�H�������8�)w)J{������E'�4�&�6��B��T� ,b5J$�_��K<����cd\\�Wae8�A�@YF�
����72���7��~'l��:�t������G��� �.�>��u�����E
�b����R3�F�a�����;R�U��>*[��P�
"�n��<�d�D
���I
���b]���gV=���c�����!g��H���[w]��x}�������p*L������H����������(�mQ�Ry�&K!Ob��a����G	�
��&(���{��$��/f��J:,�_�X���UMY�5�-���������)�?�8��TR�SL�c}� =��������_�e�/40x��Z���S�-e3�M
���1e�:����c1qI�=_N�0�������[����.���z�S�����B��L��r)��z���k�����i�Q���Z���Up5��w,XO�VS��v?C� !#}�Itc
��j�A�������q��8 "���c3��Rr������~~�p
5��]����5�.�TI�i�D�R�����sa�)�2G�o��3���w��|vL�x��{B�6�s�f,�`�4�-��^�4p#��tk�������}�9T�k���������#��&K��?��o�e����^~��t�����;����Z���=�����;��{��%r����8�fF��������GgLy>��1�����t���S'�z��%/��a�s�7CotX�VB)�>�'��&����^:�t��kp��/��7Y-����?>���P���1� S�-v���-��b��� 2��������z�TX	������_�e�:%C��N��x�N��^��Yv3��Y����J���F�y�y���5�dX������]���W����\)xJ<Sb,
/�&�z����'�J��s	������`�Z��6���@�9+���^���v�
�����$G{���g��X��J$I�W����+'W������}	������G�!��X���:�����bAi��Fe��}�KM,�3�hX"�F���2y�'R��k!Z&#`q-AD������"Y��(�8mX�w�:��N�������jq���
�C��J��P��G-������u��f���f�8%���+��?��a0����4��/��������GC���
�^qc:k"<8�!�)h���~������|B2������c�$��K����,�[����z$'���o���M�]�>����CN2�6��G�5�.���c������[�w�j<�����C��+jx�_I��S�5�^LcPH��s
2�hJ�1�oB�
����������$+��u�@�'Pp����^����d��	��'h�r8 YG��@�Q-��
�|�8����v	ugl� �v�&Jr=J\k]Wb��+�FQ�}��Ml�cB��]��
�S�Ik����#�����WC�(���^�������;0c	��$�[�����YQ��~��Yu[���n$����.�#��U_�AN%R��4F@���f�r(�vH�dD�k���
�Hs/ZwD����"�<
����J<VY~��ija���@3f�X8-�In����\��Y�Y����
���f�|�����/V�@��?�@��Nb��.:$_|�����������p��{H�VEt���=55���h�������@6�]D�e��W>H..���gt�"2s��B��~�|'p��4:�)���������al|���2k6 xM�	T:��6�hO��.'������gr�+7�}Ai��}�k>�����.�OC�N�����Ra~�p����NG���#?�^f���v���Vm>�{`
��6�r\��zH��� �bgY�`���|_�$�����v�>�n_V�����uYT�����C��=G-<��������1T�����)H��G��E���.d�P��{V����ddb�0�e_�����f�u�+�e��U	f�0`��`u���r�L���P8c=����w22�A�=F
GA�����\zI��x�oovD=�.�#]*�'v~�k,�v`��Ap�{wg2���G2ZV3��Ojo�L�4)������|?��R����'� �g�(<.���wJfze!9�������*n�Z�.�:dAl����	6��}=x���#�WT�a����.��iP
���U2R�;J)CW�_�����7�N���%��XD�+��3�&���TY��cu�
q�t��tK$1A�q��m�?�
O�jC���i�B�7'�Q�$i�Q�l���i)M(�������[U~�N����E�)-!D8����=�v�1C$��h�������A�}�!C�:��J�C�����C��}��*G�y����3�����&���H��W=�&J�	U����b��]4Sm����%V��+ObA�[w�����v�tm�n��i��bh�.;�X �����L��9�WA�#T��`�Nc�������"��������OC�d�����ZVj�Fy���-��T��:$��$@a��9����Rj���������F���I�B%����E���rLi*��w��
�0^�"�Z�I}f���HxG��B�
������c$�l�����	���bF����~������x�����Y�!|)�4�������*����9q\K1cS�n?/�����j��8��vly��E��y���!��	�QP���k+���+}�7�-�{�������3/�m�`�Nt�����MZa�H�~�@�Se��Y�p�#�	��k\N9%��:���
���6��`�5K3��V�����2�BBl?.;p�8ah�0�����+���� A<hx��E�����j�������,�U�b���������(�-�o����������P^�,�m�'��8~�A���*��S���5�
5O��g�{4�!�c?�l~]��.oXcD(nEW'��t
���q
�5A���B�:y�vj#�w�D��y��ef&�53{�j�1[�<�Q�
�oo����7p���'9Y�(�y���p3VK�^�6��^�H�Ii~1e�m@��+<����,��H��
;82j��V�!@�V?Q�&��K[n��#�T�AN�����%q�g��3�0���{���;l��vxQ���0vp��M���������|�_��|[�;o��{����� JBx't7��"`�a	�Zu���y�id%����������������3���q��Ik�u�G��������G���|�j+7�egG�Q�L-k��2S�	]��*h���Z�9M�4�(��{�d��FV��g]?��J
��P�}(��EU��i�����u������������$E�U�|-�s��z����m.C�;a(������K�2e�@I���O�sH�e������o��3��z�;�N��}��-�=�b�08O��r�c��%�F\�cyu���=�~�u;����O�.q�/������|�~oL^����������E��1���9��~����W��a��M
�`"���{&��[&Y^����``�G�2���
7J��|`{X:	�qC-��_n��Jk��W
���!p����g�����ReJo��� ~�:5���z^7\uEA�
7�'��Y���O����B}`?!X�*4�j�Z�GK����L���+�S�x�M��L�%��p��($�����������W��IxT�@�Ox�|����w����P.��n���;00��1}��0�����"-���1	x�ZNfA�+���d;���.�������=��3���1L(+���}��X���qT18741�(%�T��:��WH����j���pYc��<
�a)_p�b��>`t�z��N(G������u��f)C2y�hw������C�R��r$���u����c�3������!��p��y"���K����>aj�@3������f�d�.��~�?��S�PW��k�L{\�]~DU	�;��%�:5���Y�;�*�������Q���q6 ���6XA��9�H���-%��&8L%K
-��X��4X��.v~e_K}�9]���Q���=v���l�$*A	e��������n�?����aa��.m�!`GXY�l$�����l��s!W}pI�k����$�.t�q{��������3��BP{����������$2���P��h���B�B���������T����tC5Nz�5��]X����K_��0�����V���KZY���(N�K�d����;��*��}�f'������4*�����C_A�{�\�
K3�sw�z����$�z���f�)Oqp^�NV��ym,��+�������{�����)=�u�`�WPt��~�����_}U�@I	�Y�bM�����$$�h}#
"H<�*S�/CP��������F�G&-��)v��f�%T]^s����4I|]������8M���`�	��������J����qU{A[�/8!��y��Vs~a^��o�4�d�Zn��������C���\�Y���w���?������N��};�_I=�{�A(�TG�mu���F(�S���]i��Ra����qQnx����d�`h�2�;�����uS&KK#�$.���� ��^H}V�bn��
�u j9U�B����J�z�WO	���C���.������H��9:�p�������J;OC����R��S��Q_F=��T#�j��U1l��"H�EP"*�+ <GM~�F9C���;�2hR��t���sp���wpr,��3��FB��d>��C�h�o;9C��I��F�E�U������XE���A����R�tJ ���/1!I��e�L��5
�[�`^�����TC��;�h�����Q�B��\���}�
0��`�]���3�#h�}�^�j�8�!��������j��{��4�5� \'t��0J*�'��9��3N����\�3����V������(|������d�`�H��>���r���w�x����#��-�n�(��N~<��l�cC N2��$��^�g��X/
�7�G|�)�42Z��"����d�A9�	f���M���"��6S�4yN/7�����N�8�����|ND";�K��nd��`~:�m+f���8����;��w�;�
0�4��"��e�(��o���T�T��z�\�a�['uXL�����mSE�Z2�e)�R3)
k�&����_RVn;�x�h�8�����!u
��	�T�c�p���R �X_��|tC�ee����c����7�I����9�u�|��A������u������p�$0%c��(��w�����o-��s�����1�Tg�N)��:���93d*����[q�:��6\,��>����2X�a<D���N�I���`�`��	������?$����j���~3���Z"u�-A���r�����U<I^�n�	l-*�!�FVM�hu��.�I��4��?����`-R���@h�����3��>Z�|}�`P����T�/P�����P~<�3A��!�
����s/#�R	����8j]�~#w�����&d�5�j�n���C/n��y��b�@^j��'�c��.���By������/����JIW���HRY���w�������4��{y�������%\0�#�Sf�F����u\��t��z��c�#��W�)���#��{
iK�Pw|�3R}��[�����\���)����'��7�h�r��bue���D/1���Y�~��y���v��}�U��0�G8������2=���y����Wx��Y�����������
Hw]�H��4��M���:�n?��
��N���f������Mb��-=�epM7t������������B�h�X���}{EcN�1���h�1Ll�d�3�,����u=��c�;Jd>�N���R���u��n��M�������t88� {��FP���q���b��]��(C(i�T�����,d�t��2�����L{(C�b0���a���q�#��H����4-����J���e�DjP��`���s�0�����[���Q��PM��}V�=��?��������Y������+-Z��Cm��g�e��UuY�����0�g���w��a�j	@�2
��<�A��L|f�" }L���gX{��Dm���<3GB@�jJVn����l�ss(OmRD�|�7�'��M\/�31�ZJ8�6|/���n��o����NZ2��k���4��
�'~1�k���b d	���6���+���UXx�%&:w������X�{���MW�;���f��^1�X#Uj ���&�E��y����zf���hH\.�$�m&��'4\�_Q�a����NI��A��}�[��@��KoG�d(�)K!��g
�k�s��A��F5�����0��[�)����vnp[���I���K���?��W{Q�'k�J~���(����3������B��P�|o�V��m�_8E�����2�:����t�|��}��P����0=A�k�+�l�nG$�{`�a���NaC%|�G��@IHO7����8�F�OG���C���eEe_�{��c�Z�B��P�n�-�
��EJ�Acav".WL�K����]�J���8�w��$����d�nB���[>&pO����U
��[�7l���D������X%��J�H�d��x|p,�N���z&�8j��_Zx�����TjLc|5Z���y���K
}���Q$:�$�#��j�m�C�}���#�,Y��~����3X�Y�-GQ$W���.�����b��=~��Mc���z^��Nd!&��L@,��S%?�>�o�����m�&���0��_��.WN�~�Y�������s����]�l��g&�9f��,
�T���C�tX��%���V[#��
I���x#�������=q��1K�j2�a��p�x$�V
�����|C�{7�7EQ2C
�P��f{92>�d�,�$,7�j��DTb�q�,�a�y��-%�O����	^@o�R���P�pIEj��������*K���Ed�"%������no��AY�}���G6��*��
h}�����B2a
��UW-����J�N%=�f�~g ![H[�A�c~��������	��l��z�4\����dy�sQ�i�A��>
X{&`�JZ�o��,���H��P��E���a����t�)�������������[s�;[��2qA��O����r�yX"5��l��!zGF�ba'�1;�a�'f�����uL����%�GK}�l���y/
$�#�_�]x�h_\J���1N	`�
5`����1�#������
M=��x.����s���������|�>|�r:�l ;-Q��}��4BkH��qi�X�������z�q~�8$PY]���y��m�����e���+����� e��`T��7��/�\~�\5�}��C�b�
�_�G����V��s���0���9Z��
���hn��!�����PRi�o�g)��O�
����#uy%����](6=��Cr]���nJ�)y2Cs��~�N���y���a�ot��
a���@���Kh��������9���B��D�?��_��+�gY)�y����[������@I ��[~����s��g��*P:�{1z�������M�h���:����g�����lS��!���q�^�l���6EF��];���{��<���	������P>��N{n��s��!���E�\����3��?���j9R��+y���_�.��@ ���I�J�Wt�����k!E^���y�57zb3�q���4O7yc2�����H�"��V�|iK�u�
e��>J�u��k�AIQ�NJm�h��Q��e��.Ce}�/hK����Fsn9��h�x6H 3.����w�9��q�;"��w�����`nT��|����.��J��3V.��H��
�hg�6���46������1�_?���V|+���(�4���pxqD�P'����
�����v7����y$D8����
6(����!���M����Unw6��-�j_2Q�������c�����<���_�d��a�i�����
������_� cUU��R�����T����*O���]����7	��9T�\�X��y���	M���!'F-a���`p~W��VQ��[����w�r�5��v�����\��v�(��Lq�E)�����l���	�cF���	��O����^|��Q��o���
������d��g�kez�)����4�2�@��X��v1OZ��tb$�*��eX�>�O�����/���y6����w�a`�v$ta	+-5����5��v(��F6'��N���o��j�m�vA���<p[���?U��$oN��xd<���pf~{|�e]�#����"�������8z�i�pNT��r�n�@p;���Tt!������v����Y�����o��c���$��������7��=������L��|$�"��=2�������os��A�����������Q��f�����Zf���1X�~��*9���b�eBp)W��C���	n�d����}�`��t���6#>�/~��F�k���_�������P{�E�L�re���^V�^5:Y7s�5��|�0���3�^�~�e���r�N$�����>r'po��[3�������b	
�&�L���B�]{��q8o:��b ��
�����e��<�
�F�#����C���8?��
*v�L�ui�K�g����lo�������(�.0�	���.&��z��{�D�HQs�d���p]����J��uJ��%d����������UM�v�3������1!�6#������|p��BO��&����6�C���.pU�9�S�g\��/AW���DL����O�;��zg�������<  H���S�����:p2�����,(P"
"�f����7t�.�+a����`(	�������8"5���M�f]�MD�O]`���=�Q-)�D�$`�JG�tN�/4����E%b�������F��u������7&+��@Jv�Q�����"�n�Gfl
����?���d��h�g�y�F�@P ��.�ki����O�_��T�}�Yk6�[����������x�0a��
�f)��'H�����|o���Q�'��Nx8��P��A>����+�^����15��KZw{��?��{b}@A=0TK��}����qV5u�a"�f)�����������C9YY�n��h�|����E��������3��"���5c�m&+�Y!��l|������h��~OQ�I��Y2~�W�8����u�������(���q�3�Z�i4�B%i�P���91a��9i������7;W��1_��\ei�v��_���&?�w�=���],&S��S�\��2��gGaE)E��e3�N���������e��Ho�*zA��\���m�+��xI\k��<z#����T�������1 ��]���b
�
�qY�g+��,�I=P�?��By�a�E�����~=&��q�t��9����5�zy�F��
����V����z#����7s�%A���;<fLJ��B;��E�oO8�I���]8Y�
�j>D&%�����8����xOE�r�93���OF[R�v���������Ya�\�K��3��b�7�	JU�u�����u�>rG�����df}!��w(����ng��AN���yO�_��H��3��>������5:������W�D�\�#���lyr�Ib��AZ���&�ck_�-�z�1���2	�d�Y��PT����_}L�^�X���������y�zCo�1����95]�?����=s���)��(h��9�4S��D���G&
�*K_����������`'�S�bh�T���k
Od���3t��2����Q�J���1�"nm�b��zJG�5��n�������M�9���foJd%L#L����W����qv
�������H�a������C$7��9�u}��Ce����N���h��zR�zES�q�O�L<�?����V��+��|7�/q�.v��=��[�����\
��(O�q���.+�>Q=@�� ���g���
���=�����s�c8���2~H�N��.�	��n�$9��z,d|[��#��r��Qj�V���Jn�Y���Jm�� �J���n��
��%���p-�'��~`�.������
�,t�c#y��(�)�T+8V��1�C���fEY���M\�0�keHe^D&`c$�����oP^��+k�/��S{��a����67���k&&L�2R8�Y���x`r�H��#C}2���x�F���hE?m���X�f�4��Cy*����O~������a� ��z��ar�����x��7]�T��ql�]eE����[-f�S�@�g���c:��2X%1��N�6)�vL~�n�������S&wqC�Rg��� �<b�c2�����W�8���e��L���z,�*(�{w.��-���O	�;���^�)Sm�������.�WLcx�����p;r��5C
D���[Rk���G�������T3��O�S��^P;���T��������/��!��t��|+Y��q���Hv)����k����G������	�96��V�����Z��Qz������<�Y�59'�r����L�r��xEq4IQ���^�e��w�R�n7Z����~XoW���-�^�����]~����1n��!N9�-n��z��8�-2��#�-��{�e0Q���F'o��Vy�gCJ`	�����f��@�>��2��	[�������3��F������q��j�bL�����R��P�5�����������#`sP �Cs��d�f�!Y��>��=F��n���}������5��vUQ����"��l_��dU2#oMi�7���)��s�N�W�;�q�����J�\����st`z���,7:�e�y��x��p��$��#����5U�Wh6��8^;�P��9B9�����t�h��<�38M�<����7�ix��P��������O�dG�����*_���F=���>k.�-���D����Pty��m]��\P^'r��cl�|(�����!
���v���7����V������U���mQ��d'�	����
?
���!8�,����*��;\P�58�?�������\a4�8c��w�o��i(�8Z�6��(�3�k��E!_&~��B�����.��������0i������K�Oyd��]����-�l����X���&
�+���
{��_gTPD�Y;<����U�>����u���������]�C��E��K�j��`�,�����:��*�6��g8&�L�	��_�����u
�ca-J�O�G+q�c��u�4n)�����6���.@�!�R�VR/.[�EB`�q�6�8��^	S����Mh���q$�0_���r!R."����Y���������q�-(���~���.R����y����iSN���;���*Ap�t����	z�����1#<P��2��{-J
�y~�v�1J�X��
�/��]���%MP�A6�uE�L�5+�����/�{�`i�Q�V5yj������Ni����������e�������z�����e����g�9sD6n'��+!���s�p(c�� M��O��_f�o��G�0��5�����)�r�G��`�1�����o�N�=��oVd��t&���`���?2H��t�r�d-p	(����w�N%�P8�����p������=�B�"\]�D����@�!J��u���;,� @HL���]�2�g��a�k@�,/O��KC��5*��r��fA�\��F����K2KN�rn7���7V��������&i���!��Q�$l���2��wMF�eg�`u�&����~�2���dE���Z=���b"�jI+e?T��y@�����������I_��O��mn���E�t?��x��x��A��P3�]|������.��;@�s���"/b�\����w�i���=�b���6�`�1�l��������lj��Gr}(C��L�3���d�::2���8�$�+��<���h�7�5��E�(�28����qB�����kA(A���cj0���E�,��X1X��E����?�~�;�oS{����-����2d|%8��0����>��H�����r�]�����
�g�k��3[y�m�������N�k�pcS����:�8��w������Pu���/qU��%O�R�IK0�3i{��hpY��pj��	�-��������������V���R���RGn;-��`� �li������4�q�ED@���-�y�&��H����H����&�_�g7���bC�7&<��\�A�L	|u���#;pj/�[�cp��`��|�u0�m�K�@1e�X��%��4]�?��s�"k��=��dw6�T�'Q>��N�5/$��zc��2�2kX�MG��QwQO��&[�0�fQ���O=s�:�_����Vkt�����N��,�����/����jO�(R-�A^���7�����"�+B�����ql��1Z	*��m1�A`��\dC�r���t���hk�[�0�`��T�/~�����$����)��|u�n<F�^bc������c���������4?S�������[�fL��R�}�8y�d��!��AP�+M�Y{����h�-�M�55��A�E�Z���Q�t���D�MtC/�<
P���k����"���:.����i@;��Z��3���u���1]�W�E}�L*%��0d"������@_KZ �^�F��az����G��c����
OgZ��w?t-�i��cA�K3w��ZW\`%�#~5s] xf�N�$*.x�_�<	o
6��P�5��0�fH��Y���p�&U|�XK��"2��
�f�'��rd>"��X�w&4E��m��0��|��MnZ�+�j�Vw���b�<���M��P�1pk�G�	��h�~'�=��o�������jo���#�'vK�1��Hg��b���o�(�\�2����q�Ug$�E������ow��"�|4��zF�gR��@�����6Y�\:p@���G3m��`�	���|[�a	��zg,&�pmOoC0~�ZH
�-#Ux�����n����1}�%u7����Zp��>�?N�\���"���kz��d��lE^���d�Z�,���q��u�����	t0��|��H����8�����UH1&��1XN.B�!"�c�xku�����*L�rb�d7
T��>����v!�;j�H�Y�M�Vk�c�Fx
�)�,@9td�`fDM����X���HS�'�cI��|�[3�+:���e�4��6$]��P���L����r1s����@�V�ra�d't7�I�zbKD��}<� 9�E�{�V�e����3z�\�n��1��4E���f��0������O�HXAg*w~�bj��z����G@g�<���
��?pK�rFn����]�y����}��A���}tHu4���]����z��Y�	��� �4h���_$�Q���S�woIi��	������������f����HRq���d%����2�4���_1���m�m
�����R��&4Wpe��&���[����}x|}3�5�_�?jLP�����S)�P�no�9G�H}�\�[	����*�iKoH�
��v�u �7y���Adfr��������
6�+�u|}�8��D�����q1r�'����kSN����(	�w�
��%������ <��1`B��f��<����("N�m�������_�9�Tk�O�K,j�������M�yr�A�k$���V��K����������-����~�E`_�t�����m��D"z}���-�vG��
!o���_�:�_4�ck ����=����c��o�0{��4_�0����j���6���>�����?N2s}��S�Cy��3�S�{��7����3J�-�����AI@�����<��,������5�E��	��5H!q*8�y���P���rJ�d��l��/���(��2����R������3�������i�>TE��Hr�������
�z��l��i����������I�ETS��}&�7��R���v�%}�x.�/`9=g��?�o{���g�z�� ,�"�AV-o���f=���ZY`�a����������������3o�<�|�������W��H�sp2�dlUD��v���W��2���&�����7T-�*�BU�Au�,!������U�*]z��:U���������zQ���j��;_�6�3���*SE��(D�+Y�:�%������@z�������o�B�U7��� �����P�C��O6{�Kv-�F�����R��Sk���
�15$���m�9�8CO��;�C�s�UV�M������[�M�1D#?�����8Az��������Q�Th�)��g��.�],�C`D��8~�0��f ���o��7�a���6��'[e#$�O"7�U�V�����!������4�\���2��4�F����M�n���%��_�j��K�IYx�c��y���p�Z�zp0�����oh��G�_��YlE�60��YK�
u��C �GF<_N�6M2��ko��q��NX6�
6%p��It/c=-5���$��L��4��m�i�t������q���x�	�8�jY�+���SHo9�#-?~�����A�fyc��i�m�����-��v����[��x�,$��'����%O3���\��O
�q~}�!J]En�%kBT.��>N@��{�:��
g���pq�����Ka���������x��Qz�����Un��Z|���	8��\�����-�����9�t�i��Ut�)�)v�tF�2D�R�?��������LKM�@$�$�-d%��e��������4N����?.�\�����cNW�G��CO������������?�>1d���lO�C�.��KPlw;Q���"^�.�E��f��XMn��{�t��Q��a�3
c�<[b��F�e����;��V���/��s'h�aL����L��-��[���m���N]���+�g*��B���������^c���[|�>�4�5�����v.����!�<�~F��f���sCt�@�i�@uf�����]u��R��!lj��[�<�/���*,���U���������_��B�28�,������^=�=��bA���U0�����[��ZryH���W�E�|}A��C�bO+���o��X���I�Pc-l����`X����G��6�yv�qv
����'<��^l�%����������<�$NQ��q����O��pe�3N3����'����^?��d�Q����38�"�pW~��/�C:
�@E�[*'���]�;�,��:��_�<���mi)0�x��w����K
��;B��I��[�����0�|��j��)� �X��f�����bQP'��+@Q
��A�2Ic�X�*WR7���IQ���F���?�q1M�i.���|����_����/���w���\2���6r�TQ��G���������.o����~,��fR��������������ma���TL�3$�L�F�(���C�]��P�*e	1g^ jP��A�^�]��8��-�K��c�N	�5��a������9`����|y�~Y�X���	i��D���+MkEf���nS��`\"��L����:����_��$;���/>f?���j��������aZ�-���
��nW��S���i��M|�Zg��]8;1���"�t+
�,	�w��t��I�?c�A��rpKsK��L�/��0�M��,��Hr�b)�B�Q�Es��K���Fvo������Y��{�z���7t�%�P 4��k�8?[�\�����P%iR/��1'�(��#���C."H�,l�Y��].NO���\&m����-N�$0D5y�vn���h�q�!�K����*t�����l�<�mU;,�3�%o;���O����Z���z=�>%���3�Y��"��2&g���D�����YU��g@k������uq��(rg���9v1��aA9��52-Q�X#]J��[��t$��#M(�m�M]��"�s\��c�U��42���I4\�J5�?�%���>�n!����2�����B�M!��/k��	��
��i:!>v����q^�%�9�����v�(�u8dTo���'Ck���c�8��x|���k���|��������l�\_���+�8��S.�r�$�%�S���U�L������-�X����'�/�C!�^o��x�K��i�R��?��o�1Y�tH��������%�a��II�cL�s���=U.L���~,
��a�|���nxf��~�S�Z�NF���d�)?m��>-Qy$eo�G`~Y��^����8���
���J��@'�b�e*	�<��lzB��9�����+�� �]��{a
j�T����Z�e�������$VP�k	iC���S�r�-qg2�^���4�u�������;�����?�koi���dO�}������P�H�=��5>�p2C� V���b���\�3�����I�v%����CP7���R�|�6LUH������O����o(��Jk�M�L.Y���X�=���
�"*/��2�>��E���u�.unnMB�����4��Xc�OG������6�7`�����{=|�G�''f��a!X���������^#E�2{
��1�.Y6`*n����P��)�Ng�T�1�SM�������������sEt�R|s�#�m�W�m�/y{���S�+�����^��j0a%�	 n�x������S:+m��u����IM��hq�WM
��/�6.����CQ��zF�i�+�@���r��y�<H����MQ"��/���zF���)�9���(���E�V������������}�=���������/8��`��q9_���=
����x��dE����>�N���0��4]���������Y��'���A��z���/R)a@�/|}���H�NF���-���d�E`��V�M�y��N�I���g���������[��]T��*D9|�l"��3��FH
eXG�'�g��p�r�����L��tz�	�����@���!-�Fg��T[�7xM!���!|�	<9�me&n��g�O����!�V?���
�E�e��G{�q]�K�B�:K�_
P}z���iY�]�M|C��s�e�D�c���"n��To"xa��G�<Q{$��g���F����;gw�h���Wr�����X�Jx$�|�^��~�B�;sA 8\U���]�H��I�F����[����p%�QE���e��%��5�i�� h �R�T'1��0�eJ�Fu�[T���QO�4�)�'G-d����"�IsAR���:_�
����q�s�-���A���H+�hf����!	��J�wP�GtA�r��Zw+�H����[,_y�~�D�������zwhK�7�?�������@����.������>t�I�v+��c�����������bj�����<c�~7GY�������
N��j�o���\`C){��v��A+L�5g�2��E��	X�q������1*E��,B�z����J��A��
O@�k�DPQ���7�3O��_����E�Zf��i.�\�*V�;(�Wg|#���au��������)��J��`�a�I��}3�t�e��G<L���|x���Fo��� "����.'������Qb,��������GLF?#�H�|C��i�P�%~:R��J�8�1��M�DFMU�)l/,@���g�f��S�����km�A��;���;� 2�������X��a���d�w��A
bH����zD��m3������*`R��G�(C�5`��E�#:�I�G�E�������hw��v���������y��$���m���2F�Oi�p�c?���A|{��C1����7�l��>�W�q��@��M����n���a���.����H�'l�5���8>��g����!}'���K�	P~@d����k/��X�6	���f��,3�^$rh�P�c>��!DS�G��Lk���&�2��\��g4���!�-�%>���O�Nh'�P�$*".��A����S�BF����Y�\������+��nl������9�Oz������6�2�ZO!�E�1�����y���I����W�Av����il~�^���Y��m������L���u�l�)r-H�C����/��yl���q�;2�����4��*��4���������)+���=�!��~��n) ��F�������P
%=(Q��h)� B;}�^8���c�nK����5�r�K��-=�?��8�f�8 ����z�SlpQYA	��cU����,���5��GaU���	�.�Y(���KyZ]����kTzx����.I"�jn$e����F�@�W�����������%��;������	#����=�A�T����Te�O�y\��u6�����$FS�;���C��W���A
r	X
�:�I����<�$���.�	�;7�.��������x��H�9����`q&�$�*<��<���ZW�}���n]��ts�0��\���F�$����G)T�HZ��Q�/�ja�L�a]BQN����R^?6)��'��5]U�
~������X�
��$^�`�%���33��T���l��Yj��6�O2� w��I����f��L�	�� !�[��)R%�����y~\��C0+��I�?;:U(�un�'u�!C������	qU< ����8�OO����[��;�������p"@�;6^���0e8�I�i
���MTv~@�T
�,��S��������V�`��������#���Y#w`#��j'�i�V�50�=������s;k�%J�;�h��K�0����Q�����Bj-��_�y�.\nD��;k��f%]�������x��0������/+��S�):���D9������<;����F�p�������zQ�a����@7����H� �������m�P���d��jJ��*����E&��
��x���o�A/
�7c���W��p���zW$������s��clP�Sl���]>�$O3��]����xt'����
�L�������l���	?�hAc��[����;B����j��j�^��?��(�{�$#bnS���i;�~�<
�y�DbGb.|�����n����-z���}IJ���
����s2�6P�S���2y���e~�����Q��3�KWwcWPhb��t��j��d�r���(I;7���C�V�G1��XF�����������3��)�a1���}�+����[�j_�����}����D�t�9�}��uc�v\[Z�u��`������xE��h[;����L��L��2���V7��N���Bn��c�f�g�3�V>��P�4?e�at ^Go������9��8������+7�������U��O���~�V�(|�����@@E���E������
v��Mae�kn���[C��@��TN)f���l�6�f���=a���b�����4�� �b�r
pB��~D�p2��������'x>B�9�������}����^����4�����:�6KM�N�V������@���`y���7"���*�'F��X-���w�}}Q#���PK|�
eb�&�8n��m��K�F -� W�����4f�t�;I�T�X�V"aK�����]��9w��1���AFl���93��l��������fU�������:!O�Z��B��L�,j�&��u�8]qw����>������rc_��E��m�8�5�H�5|�f����%2��!M��t%`��D�u�/����p���1���e`����0?ZDc0�{�F�'�G����A���A��+�����:s���De����8����48�*���&��90������[�H@?���x����'!�;d�W��7���OY��ir��2�j��of t6[?0��*W:Tk&��������AO�������D��s6�C�Mq���������S���T���/9���Tv/�&U-$���U��a���f�?:rl8�N%�@x9Cu�?X^
���I�
�N���]�F����d�qk�A��e\�����\���X�?�J�h�����a4_�d5�i��*��W�'�%
���Y������(vV*d��w�>0X�h��
�x�A=l�|�RL�ewT��l����>�(�������]�e��3����/�k]1?�OC������rc�b��0��{��6G����KsB�s~����!n�y����0��qB��}Y
�|�g�^���|������@��������Q������kP�v"+;R�Y��E�������or�A�7)����7LmLe�
o/\�MH����"�Z�Z^�//���\�+Q_t_"��$Z��VL�/E�-c0�r	ZjV��)I��o������B�����VA����� ��E�/9��:�75h��Tns�';����!`�N4ZQN,i�Oh�-��W��y?'4���m�HY�k#@�"6�&�������?i���OG��p�J��1�_Q�����'2�����0UF�X�a`�}��{�/���}�H]rW�
G����6�����S�������YK�a�C�3t:��rWX���h4�Y
��|Rc���Y��9u��F�NXC��Gp?�+�������v/�0�.��*��i=24��~h����9��TD�z����l�A����b�~-j�E}fQzd*8����x:�se�
;���������&�m5:o%����0Y��r�HT�]��mv�*��S5�|,I��aH��K0o��f��s��I���8A�����e@�U����K� ���s�/9=
v�t	��S��3L'v������������:�h��nMaK@�*�lln��!8G��n�o��tu���R�jg��|�~r&J6�n�9	�DB1B�{\����h��f�?��Q��o��X1<_I
�=�����T�"q-N�������	�(��g�T�G��D�3���Ev	<�kJ1�i��&�.!"A:B��� ]��^
}f@o6r
�(k;w��L�p9�?g��ln����
�Al��`�x%��u������9��.E���#FD�o�u�9�;����+�)-d-5����
CW2���z1��s�t�a��2�p��U���t���I�c��mo��������N�H����&��l���9(�Wk#�W�2�q�m
\��}l�-2�9��Z���Q�`b����{��g�|%Vt�m+��-��F��b>���U��h����Dk/r1n�D����g'�}��9�����C�-~\��
]�"�����o���,�&-(d������
B�0����Z�HO��t'�)���!�c�����D��8ZQ(W�}-V��u��"��0�1����V3p�;��~S��eD#r���T�����9��alnb�3bE�.�($.�Bu'\�5��no�������w#���3[A<������%	���1L��(M%�`���bg�~cH��4;��
�����m��e����.�F��W�_b�l��j��5��r��C9��������t��z%G�/���;��<��/Y#��.D�Q[�����P��JZ����9���dF��>���t��nn�����A�W=�eOG	�U���z��AH,�
}��:�^x�����������Z��
M���-�v�f���bQ�H*�2Yq���#��Jk�y���rXC+��GZU�DH6����_&����h�'R�c���E�Te����_B�Df�f����gDq~��a�
w�������
�zN�*�����$��r�g��`!8����To����[�d��i=t,��"�uK����[���k��}�w��v�(x��68��O������Y�*���3���u��H���
�����4&{�����d�����6��g�|T�xukQL��������[~r�^`��W[����j!��6����$6���z����}x��T����I��Z|0��t�W.�iV���VB|9+2�����[�c�4
���Ezg�������f�V���Hd����CU>������@�����)q�mW>E��|��<&�(�s����$�=�Pi��@5�d+`��*�����*�$E7�7b��O�`+]��\�?b|������2��kH�V��%9/�6 p������,|o����6oy��n����^R�a���L�R�8}5\L�+!,��]���Z��kaR-jG�����������i0���@�9j<�#���`�!�����R�T{�C�{� �}\�kJLk���sAP]��0�:���M�� SPP�OTo\��7���������ilL�c��8�M�5
���BK�����K�^-N�g\�3�����q1J�h����������MNh��8�j��h1t���T��t	JP��<^�)���J�ax���Pz���$�k��jS���mu����)R�Z����=3D��6��������D�+��b��>}�|�Rt]����9*��5nMtpg���]���Y�����DjN|��s�
��f���r��y�W��8����S]��*����1)A�I����K��g�g�G�Q����iG?���{m�SFeGc�����	��/��^�jo��
��#vg�g��W�P����5����uI;�v�
��J����~d����l6�Or������J<~�&U��.@��>{���w�_e
X��6l^U_{k��}���_6������N�`H���Fsn��_(��k"+|���=������6Z�Tve��*��4�"�T���x@�4��PI�O�����j��U4=�7��f�+K����M_(��c��"Y��R@�G<H5#!eQ;9���g�U�d|�4k���*�`�b��><�L���>��4��3[M#�.�6�}os�*�b���?���1S�q�u����(j& ?<x��9f&���IGA���r.��$
w�>q���;z���-��LF�@�
^����h4��=H����M�����A�o�^��k������<����B:|�k���HZ#\�]�%�H�;��e��ns�?��[B.����9�)Cmw����Ex���h0��T�h��5�P�/^�����Z�Y��|G�w`��~0�a���N5�]i����$�R�f0WA��"j���z�0!��`t�t���F�K�f}�Cv�
�{U.������`8��Z������kXc�710���7d�E�
���
mA�g��1���K�r�K�}E
�D�'�d��0
�l�J��U��"_�����S��+���?�G�c��0����5E��_��Y��j�.��7�b��g��#|�r��>�x�i��<�����u��'�+��.�%�A���&�G78�D,����i#S}��}y*�|��(G�:�h��7�%�9{_)�QY5�/�g$����F��������O���Vz���aT���C:<���w�!A���\O�����a�Z�A#�+����u��j�d�s�E��A��+���y����d��9��Z����x������1M�`|������)������zR��t�a�r��:��hD�\�������}��r�P�S��z[���La�.���C�h��E.�i�6�WX�@�?(��DH~���4��P���~�JTn,��@��=t�^�\�w�!V�]K��nB�:��gmnDq|A2Q��?�Lo	�J��y/zM������RQ	tV��������u���Al��@T��V&��zy'� �0<QB��,�c���X����"3����vv����O���Q�of���$��i����SJ���]4HQ`�x
"�U`^���mz�:�t�����J�Vk�'e��h
��^QR�J�h�F��Vh��?��9��x$R}�j�@)��Y!=l�
�U�JLq�
��|����1���O�����Ng_���d�����9K�^�������;B�@�e��J?�vZ����H?���@��:f�b:j�M��2I�o�57��_����nG��-��v	����S�6bG�^��
6 �zcQ����X��b�6&Fz�������b�!|���H�-F5���n����f��������ed^�����{�d�m���fU�J����U(�S�|�����\0�����p�ZO|y��Vr]<o,1�Me�,�G����������fjQ�:B�+���-�i.8A����gm!A��<yuA�]V��}�EZ1�t5��;(����7f$���]�h��%���7�k��Qv�_ �XD�B���v�P��������]\E`<��"�y�?9/
���(�<������z�2�����%��#�p����I��X�"U|'�����p�qB���B�����|�r����s^��,���*�p���8�����6����$N�T�E�eg�|�t/J���R�;�$��5K!�8%�T?0��K�������g|E!LP�g�T��y���(;0�c��mV%�U�&�By�/��v�]��Dy2�1��	
��
������������	I���G����\?
�e�f���Qy���i���� ����/������vtE�B�����N����T�8. ��[K|��:��:��V�}7H#%�+|��H������h���*e6d�'QF�oU?1�:#p*������[�Y�(v0UN*�|D�+y�Z���y�1��#��B��]����0$��*����)��+��(�{�gQ?0�]OF�O���.���n��^[,t1���o�&h����3f�x}k��������2��0���v\��`�,G�|��rb5!G�n�vx�*f"k��X����o}=���>�*n�W[ R����t
_�ne��I��~��(�9��������]W�n�(Tok����`�{��5|�|<Y5�7�Iu�/��Q�9��%�Hv<�z"y�uqc�|�e ��~����y/�.c��OT
�+/��a�Jv����v/@Q�h:���Is>��d���uCG
��zJ��u����?�������{"��y#�P[����bO+��i��0�(K���8?����w,$�"��|P�n?��S��E�� w���g�"��T������5�^��y����������d��c����L�K��ABt?@v7���#�bO�ZjB����m�&#�g����==��th&�v��j�p�?����_�hFiP6�u�ZI�������3b�O��,P_��@a	.@�5�!�W� ��^��xx8����NV����83M�;:	~zui'kM�`������2�Pd�eN����S�-����!L$B����vjO�M:g<����q6f]��b�t~,%��l��~�1l�Q����p��]��>���5Yniy�����0e�?���_�a��=>�5���� _'�i��������Ob���B���:�6��&�&L/?�����4X��+`��>CO��5�x�����u���n�F��0�[�J�>�uEw)���s���s�-���
LD��zg��`���2���jEN���l�M���3�F�>��
$)w)��s����2�JG	n���(�v����p�:��J��#��y�������MGgpW@P�rdA�I|�	���}�L�������	P���:��"��)�6��CM�A��I��]'HW��U�x@v*��.����1`�9�OaP�
]�
�M1�T�U����g����
�?��e�sG�XY`Y�)yU�93��=�?��M�$��
P�A��Z�=�����Lph��Ai6�� M�'cu���[��H
J^����=�b��S�F������Mi�/�+����ysg��
�q���$�J��T��Y������'OL�F5I_�!"�9���#Y�-����
j��u��8{�^!�s��f���������G�q
�X�t��WA-t"��>�)�������?zN��;�mL1��?���\��0)�m���[�0��j����/�4�Br���*$�������%g�v�,�]���P)_Oz^u��A��u�d��O"/% 7��b����e
�������������.E��wt���������+!"�#q���>rf�u��kx}0L��Z�1!�D������	L�6�.��F%;�6���8�
����LU5����B�86N^��*k	�����b����v���L��I�t��^�d5Z'-"'c�S���Gz������7�?��&a���w�^$���B�l��q�����b�N�.����<��r %���C|RO#���+������6�}���S=��u��s�����nwo3hXF�������, D����hw���=V�����{:�<���S
��H'�����B@���"F��6J����_���n��	WJ�K�;����E�Rr�#��4k�w����L�7[p�������,��y�=���[�@���gm�����q�]o������1<2Z1�i����jx�H�'��K���=N�2�9��X�E�����<�3��V%U?���q�R	\RK2+
p:Rjl`i�x���[�y���S��<�>�i��0�����l�
���\A�&N@DE�N2c���S����S~&2����,�P�k����S!�T��\������{-������];c6_@h��`�� ���*���f�<-�L��'�~��_-�7'{����2aI�0n����t�����&�9t5lg�e��X�P$n���K�F&\	�K�e�M_�V&h��l�!�j6��y�"3RW�b�1��7�6�(������c��Y���{����R����l9�E]��4���[��i�Xf���9���o��RW�8k���#T�76��y>?��<f�u��y�SKV@�"v�L�C]�~���>������Z2Y��3�������nAR��~[�<�h��N������P���L�Js�p��%�\D��n*JYT�z���H�PP�����������l�D�>�O�H>��Z���
�����C��l����������cZjl��Z�������	d���K�h�}>�P�����->����D�8�l��"@t����tb?Q>@���(�����Ho��,j�h7A����fwP�Sg����<�MX<��/	s�S�����L���".�����A�{J���5n��06��YU�q�$g����x L=x�{���-5������=���OZ��S}�&{M�g���H���dC)A�d�F�"P9��`�"��Y��328��{$Uw�����q"���x"1�����M���
&����S��������u�}@��_r�_�z���.C������:�j0Co��w�K\��(.�W�h���^�k�b8U��0�]r��=�q6�j�L+(�qa�i�Skk�W�M&���>�V���w�j���@&&Cp��F|��`�E��G~k)�c���=���R��K�I��![�C<N�=$�"��-�612��@���7.�3�$
�d$���Y����|�	C��W�D������>�b{U�|#���~wJ ]C
LS�]?��RXir�����5H�������d4��B�=@���:�{�{$nbte�m�nm�9�����{��C
%��f��e2����]�}[b�Pgi�GI�G���"0@���d-%jo���;�r��h��%��ptC�$��i'r��>E�]���F�J�B�{�L�������&E���8ufNu�-<�}m�C+aU���sI�S��Ku!���������������W�	"Df�o�W���/�����dc3KJ'a����9^�ql��]����%"������.���QK��@Q7�z���u}C�56�>�3���az"G�������q��QEM-��u��q*����Y�Y�	&�|#O�� ~
 �k�����/�5��7������1���H�X�!���HGr�~A2�.�:�/32T��Ut8G�]����������c8d��Nk���K�g2�m�+���(�P���Fw���zi��������EXX��~�q%)
��Q3*V�|��p�.����5?�C}n/E0F�`���������6��K|�{�,u��B!����N|����G1!Z:�����>PH;�Q�r��Fs3Q.}F*��6��g����3���80*�-�[NY4�-��P�s�nn�����2���P
�&��g2��G�"2/X��A��o
��\��1��}�:����x����@3�VA\��"9��@�Q0�[^������LBS&J��#���u����&^>��OpM~]Q�����5�y�!��pR ��k/������{5A�����<�(���42 ���qL�B|��������v^�^��ih��z~R0�2y�����'O����D`��$��
�h��1�
Gz���vfb��=�������T�FC�gX��i��-�3��`M����������7�>����i�(*��8����
�I�3�rq�Yr��r��J�]5��� -?(>���J#�����b�VqK�\�Y3�U,k"�i���Y����#���b����5�6=�%R	p�8�>��LMO�2���\A������\6T7iHX�T�� 3��M���G��	A�N�`�w�1�)M�J���,��)p�-_�2x������^�k�����0�2���Dy�tTW}�[����mZh�MC#|�||�c!�"�C���q��T�0�Tu��Qe4�TdA76���l�10����E��
��93e���T�B��c ��S�x�"�K���A6�x����!�������Kc��]EQ�x���"��rf�:=�����!a�L�@��\�'��H�vy�r��R�(/����a����T�pQD����s�����������M�����k>�8��J0���>SFs��%���,��f�*%���{�.'	"��9��v��u��P[$}���>#�)b��:�^���:���|����O��B���hH���}~R
��#�@n5�Z���wE=��Yd(^K�����]p�df���}�,������a��|@�j!4h���(�ZQ)�"��c����7�A���ti��@�5����T�N�$�E��y��k'i�v~0\!��%E��b/In2�
W}�����`�����a��_�n.s$�-\��7Ux�3�]^�d�Wz)�q?�2�9����fd�a+�|g#��LZ��a+�cz^��*T
�?��p���YW��S@�U'���tabUJ�t����
�"6Q�F�=
Q�/��Yr�!�(�oC������r�xl�X8�D����ao��N�fL����[bq+�`�'����3�����;�����9^?3\�Eh�73�~�JP+�8�I��_-f%�M���4	
FQ �S^��`w��E_����B���p`����!��v�BI����]I
�0;��X^�����N�vG�K�3�^r�4f�	�K�KO���>#�N/`���^WY��B�\J0\N:6_��\���*w��a��I�J���C����[Ax�����
�uH�F��@\@���r�����!�E��)u�z�g(�;���bZ|����",�2U�_&�;B�b�cU}���W��=�~�*L3�
i���]$;y�|��������O��M�`�M1��T��XX6��qw����@�������t �D��M�F�y�h��G����@ Y��&"�I����	��Z�+�DJ�������!�4z�j��G�@�Gl��cz�j����%��BE|�����q��1�O�V�:�n/�S�M2���V�~�d,���T�����>����{�&q���	��9i���F����*�t���*3�;B���Z���><�����k�(���~���EMp��tU��s�>�ce���	n)���o�.�H�o
�������=��+�-�����D��0�����G�vT����?h��4��kI�����*��>�>����+�Ym���S�Q:h��7.��������N���|i��i,���>�SK@9$�A�d�0[��}�k����&e���~c�%�/>��0��A^+k��G3���P�-��)�����#Q*UG`uX���q���S6�=<0�����+�[�nQm+��{n�����O��wmm���H}�?(Gtu<�B1���4&����0O����9:L�	�P�m����u������Y	�E�T���b�W�&c��c�3�
*_��Gk�<e�@��9���T����T����#�"7*�{^7��n��@��Xn��e��:�(�b��CMD�C���,�m����,	���-BZ~5*UJ�> ���:c�~���7*�����k(����z��%<@lq)n�h���"z��{���E�}����,=V
��=�	���b���_�/"�_��T(��,���H��Z1��>-m�vg�5���W�#G�������~�����*Jd�K}K��~�?���nP�_�g)���Q���t�)q��Cakx�Y�v���:�7�\:�+��TU Z��48�3���g�:+w<�S�����H������c�TY����45�e��d�]:�Q��^i����e���9����|.�B�P|��t{gLUq"x�6�jp�iN����(���:���'��m�/���i���{^��%����I&�<#�R��5���;������vnJ���p�<NO8z}U��D���v�� ���6�0� U��"�b���������bn��>����6�����
�����I�ui�`��<��,kN����].����B�w��8����W��w�^�w���k�VZdEJM>��:�H���c[���b�f������n�Ta{KvL�T[��J�}`mf>�Q|�7�JjS�Z}#[��d�R��lYK1[|z)�Lf!VTG���Y�w��q6�	N�j�L�Xu�X*�sa�t�j�V�\;�*���e���)^7�*�s��X��:�A;�o�n�p�k�������I��`c.�f��V^~��[Z�����D��?oO%W@�c&�w#�8�����W�t<�;��x���Y-q����L�7pY4������q�h���t����xoVt5���h��\�a(�F�_�]�(w5"Mf�����Mu�M�$�p��*�'c����c�fr����G,��U������V�D
\b:���3�����I��;i8M��Ow��h����~R0��m �������M��D���%�7���x��U8��
��nH����v�� ��M$$���%��E��E��nb��p�5�,@Skvm]\p��,�W�('=��2��_���w(�j����J+s�K��\�le8����O1��B@����#�~8���_ l���xF��$N�e�x�Vhh�L9�O�C�Rg>����&Mf� �r\d/i���&�\~���
�u>[��5�B%��S����H�t�K`G��L��V�l���a��%}�	)$��J_��Q?��#���xI���&�8�~���S��'u%}4S�������x�|��;�f����ue�Q���������G��uE��y9]��h��
��vmj����l�""��
�����=�:P�����K�`����~`���n����+�st6����������f��_7���+$$++>��LO~��,w���(��0Y��
���vM�xv�	Y�9��*S�x|n�u�>���s�".������@�&�=�7�q��0�����p��p�@�������P4�7�������q�H�|�]��n�
���)�;%�j�����L��2ey�]�
�4Q2������6�l\����"���y���r�$���v��6��]�I=����$���alnr���Cwc�;��Z�-������Z���������z���\-���,���]��o�g/���h0�[=�$ZNJ�w�(�.��CE0�R�;H]��5�da��H�#����ZV�PQb	U������_�P�
����(�X`�m�z^5z�k��f���(j�X�&�:n�l�{�"*��*9j���B#�V�]�x�G���)���"��;�����^{��9�������!��x�F�����+�Q��9�3!v����j�u�
�d���������H��n��L�3��q�������'n��0��3��#>��Ws4(Iz�������qnI�2M�f^�/��kSM�R�6�n�
Z>�_�1�{4�Qm��!�w�E���W���Y�����G9�������p4h#(�y��QX5�BB���bg�������p�#���������x�ae��%q��z0g�2��^��
w�9������A����R5��5�M������� ;U����_K}���I��?O���n)+��H��J�	�eofx|�i�
��#W+�{g��j�����!s��c��s�<(	����T���;�%�����w�Zm���xKoj�L��T�C����Fo���P�����j�FP@{-a�z�I?#�"n3�Be�8��w�C^d���i�vc�a�Z��(3>�y��gd��F�k���F�������b�s�N��������F�:8^-1�-�@�k�t-G'k������g'nik/^����rw�B���lF��(�[r��/~�z�|h�wo�A��i�>���B��d��R��A��}�������z\��I��9D��37Am��� ���*����������'��|����j0�7;�"�=�r��������
��s�l����U���X�b��w���mM������3��X�5V2f33E�=�\_e����_�;��I���[�X_���f.��L)<�H2��o��G���L����:[��i���/a�P��h���N����6�)I���l�����N����L~j���>��I$�� ^#$�8_;�"���vHY��3���M<���s�	�������P��L�R����nzC&��i���3�_i5�C��� J��Z8�������w�ch�\���~G=��w���^iR�	T�!���H��7��}�u(��;Cp�Y�8����JC�0G�<Q��zh������!S�
gy�/4�u����m)v�.L��A���@w�qn���4�>A�����2R�[	�Ah�32/[����3z,�M�90��'MW����2����(��0���
��{4,)���(�s?�Um��	$T������7f����Q�l!y�l"��w�\������v x}4���,��`?n7������x�`��%�H��!�-���;m	����F�D|���SDJ���:�����bF�[6������p?X����\*���G��2��$A8��j9yQ�n��zZ���f�D`���T��C���F7�]%��Y�4W�^r�5����.�zn
����b��^��}u�yn��,��W�~;�z��V�i��<�Y�f�K��J�����I��|X���?a�+o�W�hHz�!-�*ZX�`C����S���az�[�Q�gC���}?�E4��0��D��BcHdD�.zI��������Aea{59�h�I�-���N~:��?��S���N�V�����0i�2�a��
Z�/6�����)f���ds��'�a�[�
������z_��?�Z�h6�m�.M���^�^{rR����_~�V.�R�W�g���=�4�*A��d����(��,"N����~nX�x�Y�����U�����������l����>���"O=�4K�B����	��*&_��P��*(���T��j9M�^~��`��<#���2W[|V�eD��5������	m�r��o�c�EJ�\�Es��������D��u�����)����_����G���{Y{.,-�������%u=b-�ry^��Z@;�y�����}������+j��_j�����������6��?��7�R8��f����3�'������+,}��p����wc�n���&x;�RF�]�Q���c����9�q��,/�v��!��
OK���:����"L��q�f3���|o~�j=� ������/- �mr_Y �G����k��r��A *�l;O3)�����.�]+�u�����z@E�I$Ar��|��im57H���!�����V�q��0���1�{@X�������*;;�|�J/��:C�B��|���b�r3'fj���q��F�G�	�B��#*�VU���Z]��3�:�7<�i7�\v����~2���M8"i.��R�R}Q��T���d,�f/��,Z�C��O��#�=+<vs���;���&��T-�Y\t�������������N�\}�4��6�Y)%�%�C��,�"�x������;�.��/Q5B���]?4�2�G��
�X��#o��fZyw�c��T2��4urg;	��$B<v��E7��eP�|�
]��0���uA�?������U�����<@���f���v&IM����|��1^:������!��W_b"E�Rn��k�bI'�w�^)����z��RTK7,����P�������L�0@��q^����/@Of���Ng�K+A���ve�o������c��9`���Q��%(cL\
�?�����%���������Jjj��{_��l��Q��,�	z:�^>d9�R���/�������2�y~$XM�����I�\����K}�H�Qg"��R
���������B7�n�n�{�N�����e~��k���"e���|�'m����2y��b{�[k @�`=��[��N�*p���!;�I���eg)�|�	*]MW"y�%b���t������z9���h�J��s[������9����{h<9,UC"�����+�H�v�9>@��G�BcQ��b�
n�E��P�Rh��1����}�����S��#V��;����eE�
K��5���a��-V������3��r�|����w�Mj��>a��
�C{
��S��������O�x�}�f��8��8��W����{���?P��Q�y�sG�jV��~
�S��9���<n�|V`��2X7��]M��~z�9[p�s����(���,H&h!Q�q�N���L7
��A��]C���QA���i/|H\X{����2�7Y��m�o�J�EN���Z�#
�'F����bA�iSs21���L�b&tB������4e�)[7��pC7��u�Y'�;���������:��{�[���
3�u
����#���Z(GY��>=g�����N4�o�Y��?b0�h��o�5�.$�+M.	�,�q����^ M����.��sh�9���\��j���y�c��p������#'��H�b�*n"TU� ����/O��X9�&��s��D
��r+������FEF�
��)��C�J���!�iRX��d�����Q�b�M��B�
U����O2x��9�D>u�=�^�#v�x�L��Q��|>�������l��y%��~��'f�+��"�&��^U�V��|�t����284Bf��'j��
H_�l\�K�W��>��&~U��.z��9���{�_����J�i�eyy�3�������~�������	bG�;��9Z�a[q2{�s�x~b7�o�d��^��-����/��3�(�b����QH���j���EQV7��9.���z�����c�9n��4\O�C�*���G����Q�Z�\1�8cs:�K�J�@
"_8��A������������|M!�'���:�1?�o���cO�P�2~�9��j3d�D��>?���m�u�~��s4Y'3
��c�(�l��$��y�rq)O
`V�k�N&��>�d*�S����n @!��R�t[���!3:�"poR�x��p�qM��H��
��2X�E���;��{��C�P�����m�����#�d�����nK��D.���Y���&Z%/}h��Q:�
��7�h:0����
%�5�G��WQ�1���r�������V�����T-R��Z������E������$�x�J�!=	
$�H
�a�*���&�;�5�N9�L���k���[��e�1tu1W�n�LK�N�;�#9Q��b�w��o���i������"5PZ)9Qn�}1[Kx��d-���N�}������R��� I)
�@�&\���y�s
V�c�P��!�~���sA/��h1���������8�*���/�����q�6�F���'d{���(��B�����X����5��D��t+��QU���_�i�K�t}A��:K����^��t6M��^sM�ntZ)so�Wg��U�}��N��N�h���������B�B���|�f#�>l��������~"����*����
���OM.�_�7
b�>U�Y��R�=�X����.T���%;��&�,�0�x��T5�g���K���U�7-����Y[2��'K���s��(	l�OZ*lu-D>�����������XI=s�P����g�s�[�&�&�_���<B����c�G�%	?�H0x����9��[�T�dY$����{������XB8�������/�����t*�
�-$Y\�a�d�,���'�#�	�8��A���V�pR6�<i~����<���D�BX�8���/.��I��d�l[I7��pag&[<�_&�Dd$X�U��H�����&��h��K���i���y��o�W�r0��
��
�'EBcv��lw6Wh�P�)�a�&��4<����9	4x�K)6�2����l�|�La>���<��"�7 (�`��'��	���2�xK��������n3�es�#x��#�B�4�Vh�-��nEQ/�� �x����Y~Rbo�q@���9s������e����G�K�U^������b�rp"b�x��vM�o88w
���e0��=X�_��bPE���9kh6B�O���6L/�N����,�&P|7{;�����,���*4�b���F��q�n,`B���D�M+�sYg'w��.c���A�*
K�ge���7HDX��HaH�����@�P��sc)��$�X����\y�TN�Ya��q|�m��]f�������?g_:^5 yz��+���*�u�$��X<:E�|u����<c�z�$�Z3
�$����D�a~�`j�����:O��$�R��B���=j���I��K/�
�������F/YR�>��c����%T����k����M8 !��
X9���$���$���3X�C��\-q����F����;�[�O)��%��v'�4����t���]^����D/j�'R�����|+)���H��S�	Yq����w���koA�+a;������J(��6�b7}������}Xb��u�2S}S����($�M�"%��M|~K��:�������	_2����5$�$�@52���������\j='�ie��	\�+�@%'��R�4Yw��nZ	v��M�������h�$v6������������rwO��;�W�<tP���/��C����~p����U<�Z�
y��d?���]m�M(	����f�=��S���-y�Y�������+�kV��Sx��V_8��<�a���?U(z�b��u�[@X�"���"��Z�+j����GZ���^]o~����Y��a|�j�r���p�^rY��w:U!*,A���j����i�
����~o��Q�--s7�V�9�1l��3v>�B��n�[��x%�P���oU���8�X�D6NnW�B�	]<�i�:�x�����y�7I�X��
�����c3���E�jHW
Y�D���j��-9�� m�Q��6�^������b[h��Y94L����8����0������1�tm����$=�i�g��RP�%���I�?�~b���I�5�>��`rx��dr�E��M����!���c�<p�%�[pjL��&�B���?�d���L�����^� ���2��18KM	�X'��O�y���D��_���@�1��3�S9]���1�*$��ji�#��238�����bx�4Q�����p���g���/�b����diy/�q)�6����	:�d����}B=���f�������x�@���y{YQ��$����,-n5��$q����<�����5��lx_3�?�(�V�Q*{������������w�,A�����P�ddlB�Fm��J��co{���j����}��(x�[�2�����q������s����nJ�l�{������H!�����_�)d���h���[����� ���[�y+����EQ}�����Q�F���X\$�  ��@��$K���$�Yh7���T*�����<ido�zt��9�b�9�]��!
y����
b�!*��K��D����g%�0���
��.��-5(����"��A��@!������1	���Xi����O��	����#T����lt��<���h�M5�}���U6$�@���{5/���s���L�Z-9a�����%��Y5����'_Q����;0�9�=m%:
fH��Z��9���X�����%ov��+]y|�*q�6�3-
>��z��H[�u1���f=���g��� �����i�@��;Y���\=�g�Rg*f���r���
�������ZX$�o�Y6+m���BC��
����4b1�������F��dPT����+kg#��$�M�ol�3E���(T�c�Cv�:%����r����<q���R�m,��<������:����N
����Y���LX*�4�$���[���C@`����8�@k��c�3��(@Y����j��>E0�~l:�|���n�q0��g���.,=���T�f���h2lz���-x��9�rC�H	����]�"�*�30x��n�x&F_T�=�x����Z����2M��s��S�%]P��.�����V/`}t���A&c5k�;����4��9��=3I�B�K�W�k?��-�<�j=���C���e����y�T�����Q�;��T���}9�'��A�:I��_��Ir�(������TS���i$����)��
+:��S���e��D9��,F�{��+[$;`��hd�!�����N�����]��[sqF��dmS�b	�
"�m~8�
�a�=JOIG�T�tc@�E��y�:� �U��^	�����J��hZP�=�#�E�� �S�u��&��	��ekW[V��z�Uv�g�.Y��V�1�����T����3.�"�0u��6�<L��BU�Y�����(�I�Id������X�!���j�H*�"u�����v���;����.�]b%�����_��R/���D����7�qt�[�U� ;j ���3�)-�{+�1dE?>	��G������(���b�#����+���E���qT��mP��T������uL�w���X������[9h� o2&v	�{�����_��'
'�)O{ ?z/�<�t|������o�1�C"�����:�'�����%mF��,�����8�Q�:q��7�:�iR��0�
��="W�p�K���#�[��8?j���o��R��b�x0e��1l�
����4����9a[7I���8��a��d(�F���,z�'b�`vN.�aZ;mE/Y��Kg
-���-���v�(�u"7���v(�"����Sy�����#J�%������}0��'�L�"G�e������2W7�?W��M��R+FS�<$^��+}��M�
M����w
u1��n�����O?��p���#��+�0����F��5�"��)���dl�H��)N?�P�$��5���C�3$�N.O���$��j�������0&�i������.�[�����w��*��	a�hF�/:��*3�Z�~H>k�����^�y��4"/�s\�:��L�vQ��n]�����H�fx�R�k��bp�9v,�����u������k
�u ���t����:�q�O������`,�a���g~0:#Q>�Oa��'�Yg���b.0����c6�;�V$��]f~�<�a\�B�/�������b]e{�Zx���T1���A�Vu�.�}~�a���a�Q�H�LM��	����[i����+�����P�e��=��>��pY[����bX����P����Qy(�F�����Q��**�C���91���l�E�}k�m|����q������A��?��\qZ�\�V��'.�I�(�r;�s�}�'�Gj����o���-(�o!���7��G�>_���lQ*
�8���L!����,T�!���W�}j�-�`������w����c������<���pa�leG���UB��n���G�"-T!}4Q�=�5�	>�n$�yS-���{�y+�D���i�[5d�9#A��Xv�lA��142���q�o���AH�����;~RK��F$���5��Du����0�m\'��*�=�$���xghR�gnb�9�/�J���?PR�8��:R������u6����*J���4�;�N��f�t�E,������,��'H��I�b����G�H2xP����]�m����i���q�������+�O��3���`��(�N��?j��h��'R�����%=�H��*����j��I,�7r�U��cU�%Q=��f���l��1]�M��jt$���������+����(*fZiN|���' ��)�Il���\�+��S����B�bhrw[�(���^�LH�`���y� �����5�li7��L�zN������7U����<!�^�E����D�F��o��c�~�V<��&�e�{6������*���#L#���cf{x���#���|�X
$k��5C������o��
�7Pe-����P���j�]�; %�hzj��>�3�������g��C��m�HI�����'9�h��]��I���\nc-��c�{5UQ6-�f���O	�"e,x��
�|Zf�=xwZV��`|����&�P�����,���=��Sx���!�qP�k���T�Qs
eu�u�!wF,�7&�w�`��{����,�"������m��b��	�S7E��t���68���P����oX�]�8�`�}�
*b�zn_�@� ���END�6\/
��h�qL��X�-\��}O|����~z@��-�af�J��~p?�3_��H��5����x9�!���v����T���h��v�.>1��Qs�����S��5�R�'�<��n]�NQ��;{s��*"#��&]pw��-�M
Zw@7]2B��o�?�}S�i��������	R-�U�OE�ry
��Oc�C9�0�L�Ff�1*N���l��2Is��'����{�o84�@��&)�f���F3��y����-����f0�����\+
9�Wo�&�FHQ6>�{>�fU)�p���t��L�(r�u�/�s(��7�;�8=o4|�4�����:S�M�P��+qh�v�XS���*'0��#����SJ�7U�����E8����S5�?4 �A ���Kw�sa�X���~�^yJ������6����b�-��4`#M0o�mm}���"D ������+D�������x�W�ycJ�x�����r������g���z���]�.�m�0�%�wKj������G�����fx�N`�����������$��3�Kl�)���-���>���6kG�e<�{@�r��u1�N�	�M�u�:8b9	��1��SOu�g�[��&�)����g���Al {���z���B0��k�k���OP��~��D����<���S�!G��>�gp#��+,Lmo�),@����y27	/Y��Uz�9��J�h�dR�,����f?V���M~��m��]��n���h��]�!������|��^kZ���L��Y�C����Q��q�+z�T+���r3��@�L���[:Y`���kH���
������HW\�����v����C�L�B�#���k^��&�Za�6��M�z�W���f8������@���<�i�,���*��Dk=���/��+O�k���i[����
�i�:kz	��0���X���Jo����:n��$n	��
��j-�����3��;5(��|����yAO<����?��]f���Vh�����*3�z���n����_��X�7]��7�![����t��B`���R���b������&I���������MLzOW��7�tCWqcc(�4����W2�UG�P�~������u�������h�&\eQ�4�����������������/�^��ua�#^R�����I�y:���C����:
\�Q$�R�k�(k��c��N�����o�u�18��>���U�7�d��te�����>~�R��E�]�-.2?|�f�IW�E��p��� �k�3z2!��r��+KE�~�Rmd�O��� |�TJ@w3�	�=���]E�w�_h���3���aT��Hu%����6�i\����v�[$�+���Y0�������7�rF���C5�.��1�z�48���:���Q�=JSZF%���eY3D
�V��?c�w`�z#]�������D�w��C�~�e5���{^���x��+D��g��"�K�
}�=�Z�:Op����A�����"FI_��
�	.T����}���P��X� |u���"�7�����x7��\jJ��7�@��6?�j:�#8G[��`a�����(�
���
�i:������&������DK(>�0t����1zl�����#�T�h\4T��p{���:��P�d���Wi���?��Q\|� �>m9nh���,*�����={���*�r���B
����#��w��a������	��Stz���m.�J���Q!�W��d^u��7Z�f���)P�l�g�T�,�9	���;��F*�N���!����7N8]��:�������<D3ShB�nH �:X2��2]�YT�n^�sk�i�����������sF��m]����k^�Z�#>`��5l �������6D�tb��p����)���(�'c��%������~�����a�,#���E�@�����a�wa��I�a�����������_��@[%�7���y�=��H��*~�*��3%�M�$d�S��[��h���q/@�-�V|R�Z ��Y�[��l�W�z�$����!��h�|��G��tM[wB�:������ln:X7�F���DJo����Jv�D7�U�?�����YE�<���������n�
�;�t���WC��@��w�"��r�7&��VFe[������;%�c��(
-�QxM����K��~�h�i)������<�"O��%�h��� ��%\7s��O�
�����1��'Bt�{�/������)W�+�^Z�]����A�ZV)�@���Q4�!���^�����W6����I���Y��>c�3r~�f$$[��������*���A�M�p�tq��8H��"}�>��#���A���Wp�1��S��A�g*��)�
 0���n���lH���AfI"�&�.B�����o����pE9
���	���6b��w�|%?�d
/��vlY��]'�������[C+����
�Qx��Wi�~h��"g95y���j��������
2�3P��~��A��Q��);jnl"�U��k���w)
���s<�tQ���GJL�����E.���2�io��*C�U�
r��|>�s�]>������3������}e��q(|C�0�#&�~ncH�,%qm��iW���y����l�:������X����9��^�I�1&i9z���<�2�0�`��]�u�}I�> ��K*}�:���s�r����~���&���P����	��k�ky���~�
����mCWW:,����eY��]�����S�1u�D���:�����*��j���gV�SD����T0�����V���z��b�M
s�����G���h����j^B�M/R�A����x�AOR�8�Q�,��x������+��>���2Dd�2���I�X�Sck(4��}���N�������`d���`1
i6#���T���K������H/o"������3������
H
��AIb3�����l��3^a�Z�#�o��1�-��NN]2D�LY�U�M#+gt!��9&���?�ag"�� �VP������\���#C}Y�)�Mvl�&����vr���uZ%4��ZI �<��)��{fb��fE{������UK�cu�x��j��%+�J��'Wfm�!�y,G��L�]�/��������f�A�VF|�2�4V6{�PA�01#�3��uR���w�.���J3�����D�	
R�g^��X��n#��g��+���=�Jo�tI��4��},L�-�5_�_��`0ykW���;dH\/5tg!��`���L��x�xR�Ec:Vv%D.�N9'qN��i���?q�+�H��l�
m+����o5�U)Y����x����#r�pL+��u��X��1��a1�y����tuN��q8Td0����!Q��-E�w������4^��kW�5��h�B����L����`����O;d���_� ������r�5Lk�~�v�#
2~;5>��|����r��vs�4�b�� �?���������C����8Z$�@�Fa��qo`5�Bdz�������7o��8�
����tL�
�F��M������+�-�����x�������f-r�/E_�����|s������S��p�rY��/j*
����H*xJ�+�@���e��}��-��L,����C����Lh����7;��3�H��G�j�����Z�]�r*�n�&�7P�x5���tsN����	t�%��)���+z������dl6Cs��/F���s��?,h�o���+1x�
tQ����c�f�[������~�45��+��[W�pfm��-��%�����uf<�e�V#�	��eK����^��#E-�-��T�f���V���b��Y3������������	[y#*�"�� �=m�t��'�m���REu�4O���z����6�z���J���;#o�3������W�+�M�Y����(����y_�s�\Aa���������of�L�������k����N H�>��=bZ�=t��\+���&1x>�d���w��~E�v0����y��;����s�'"�Z��5��{����H�m�c������pF�5���OM�vuP� �OP�SpF�nqG8e��[��k�y�n����T�����.���,*�����Z����y���T��0z��*DaMw:��5��4�k���p�������9����H����s'����-�j|���������[;�w���?����s]�S��2�#�`e�������O��)I��X�$�`������4��0�m`��o�p������@���*�D�t�D�>��G�hF���~���7����p"{My�<��E��%����F�����!����**��
�:(���4�����P�����)��?h�+�i��X&4������v(�:��A���=��&��iY���_AR��W��KN��6�~o1��S�b�����'!^v����S�AR�;�6�����[~"Re.$C�{y�!�(�	G�w.��.�0|��}
����l���k�e�P����s�`���=a^�qY33�D��}�U�3�}��B|8��j�EQ'��N�����X�#�_l��||}D
c�d8������������)lS���PQG�t%S�e8[b���V��S96�!��H�X���od����Z���p#�p!��`��m�%^��/�dP;`H�'��?��F��%�/���c���|��8*���;�Tpt	��W�-���3�Vwe�/���q!��R�r��rV/�A���G��:$�7���	C�L�S�`6��KJ��vo;�"���v�-8����
7^<E���Ou�xs�|���p���9D�������?�Kr�)���0�t���6<��|����C�ZK������I!]�)�?��,���5d��Kww�����{��Y3�
��.X����&�w*�Z��&��s�e@�	a���O�nI�yv#�*��1��j���=���H���
���#��b/��Y��o�~�B��A�g����z����q������8K�N�����5*��aXSW��5�fP���E���3x
�#]�@�Y)��������M8�E$����oE���)�W�IgF���oD�n��e�/�x�P}W��C��+�9����Q���V����+_��7����8*�'��Y.x�6XVP�E���U��c���Lr�����/he����`��R��#�]�hwA]z�����vT�W�*G�`�luwh�e^uhyT3�Wp�9���v��5���������/RNy
�m��3�y���zvg�w�wuB�����n�uO���>�>e�y��`��:#��6>��e��x�.R�wxneD1�Td%�Z����y�9�g�������o2-lvu7�z�������w	�:�#�Ts��0�)��9[�~7���Z4�N�"q��E��FS*�fr|�����7�c� �����X�FP�jt]�sE��%e�c��d��m���B�������Q�j^\�?�����n������2��d� �W�s7���3��D�GB���{��2ypG�L�!^�p��k�)����_8������f�uLn�v8�Q�?���[v�����~c�zR3"���u��� K�A�1�\
�2��0wlb<8�����8�p���`����O�0T����8��IlM����D2�ZJ�w������Go������Ip#�3>�o�*��j+bSBoG�d���]��������<5�.�WsA<�i��Z�����3�p!��!*�cwYNW�%��5V�����k�Q3]*��F�j��S�{9��L�GYZ
`��U����C^<�Zz��BA�UT�}F~�Z?�S���m��Q�qy�#����+��O� ��

E�����M�0������H���Q�������n���#f��5��"*��|+i��H
a{"8�_*(60������8q�^�5�9�T������K)	 `�R�ox4��~Y)�$#g��W'	bJ��g}�>S������Qs��!�<r�I,_���h^=-7�k�FWq�u�4WsQ�n�2
�3H7�X,�s�O�"cB��k�_��'����g�vN����r��!�i5�l�{��P g�i��!��b�a����.�n|�x�	�����46��:��
1+�����p@�S�!�#c�8�����eg����d��I��x��\�����-<�2d��g��2��>J'?������_�b�Q�I%���i��8���S1�,�-�]�fz��t�����m0����'�%+�9t�v������l�HS�'�P�I�T,=^�-T��8�����R-���#�������4�Tg��9�m�z��1�g/��_`��k�M@�m����E^wr�	������r���CdF�&������'Mk��U��x���dK���o$	���e�j�J�������fL������Px�u��;xi#�`0��vJ���Gm'��<�T�P�DC����)�����c'�;�t��$�Xy����Y=08�����R�f����#���=�.r?������'`���rg�}�E����m+=9��zvX9�I*p|F���9� ��O�W����-�!WG���S%��.��MeJR����I���Q��+�:�y�?Hz*Iv��W5JO�[�k��5UA��Tw����/�wl���R��#m*Hf�K�+k���� ���r>j>`���2G j��lBf��������Y��0���9}�N�{�8)���A �De��d�����G�U��JO�({�&a7j����E�o�*H���%>�)p�����V�qq�.�fa`#[��nV]�y���Z� �]8�ZW��|����ul���D&��'�����	�+J�bT�<(&=�5��v��!����4p�j{�<�CDpb��]d/<����S�	.�\Q�������<>��'6�T��~���B<�q���`O���9��^��=���t8Ev�'����I�}U�����l�{c�����V��w�^F�`3R �`����"�)��0��r}Q6�B��m��%�N���1�0��K��\���Z��[@7����A�r�����ye� ����8�����Ey��+�����!o�j�]w��Mo��wDh��r���>}�=�������X���H��~[��2Ve�_��s�c�X#3�f���<xx����J�T����������8Tmh]f����x��x�W*7@=5z������-5p�.$��8�C�zs���S,�wL���K�9
^��d������$j��d��p�I2���6�.���|*3�
���r����=��,ve�7N�L�z�����y:Te�������f@f����~��rz?�PBSEce� ��/ ��[Y*���%9��y��Q (�#�^������Hq9���-��������B�S�q����%|b�AS�l��p���i��A�I=We�3��q���J��;(�MT�z�e�7�����d���0mB;
C���F����C��RC��������i������R��qA �_���t,:^������a��?`1I��h���F��#dl!�}-���0��>���2�79��D����.��$
�5��0�[��1%���F�������
�=�O/��\~���*����ml!/��d�\�{w����
�$xl�T���Y����f^E*�Y{5���b��5�����2��j��gY�!'�|�:�0�B������K��M2�oF�D�
�����_�Z���\&-���B	���J�A��,����#��c�3�d]),��<r�+Z4�����=���{[�c�IvJa��fP����z�0�����	��������;���d���:~��-{O�
�����=��������TM�?d��k�T�+������t6����JW,�a��0���z4��i#�����F�D��������P8(�_
�v�9,����+)��D��2�a~.�
]*,2N�\��%�����Ji��^�����el�o~�K�w�6���9�Hr����y������.+�5�2��?���=�5�����Gz0[s��"�!���t`�1��&(;���,R#f�L]�L�����>����k�)������4��(�d����`��z�F�z]���W��<�(��.�nk��<��7;{�����A*��2��Y�22~w8�0&�~]+@�O�)[�I{3�	Kn�]��''L+�>R�"��q�Mk�e�[&�=k��M����
����T� ����������{D.H�(���KDO������2��-��j���P]��v�F-n��z�RMVe� �%k�Y���;Fs����\j{@)�Smi �Jj�-������w�����zx���$��"������
�;q��	��uS��b���
��EB�!�X�e�O�+��O�]�g2�.�����i�9��s��w��?|E�N�B�2�g�f���K��[ 7��!���i�z���%��}!�H�}���v]���k+�P�q�z��-������T�0���^�\`���������e����^i6�A�g��s�w��[
��=

���gu���8<����Fv^
:������=@�y`�T}1;���#��o>G��k�8�R�bU�Y��r�9�Pm�)����^���)��@�<Ys
1*��f�(Pe/��u�\����������g��iU�Z=�gC����!��\�?y��o��x�a:���1^b6M�i�p��R//���d�����#z�pNe�u	~�?{���P�~��������{����o�3�U
��p[�Q�4�G�@���ts��Ag]!�c���c�l{8C��32*��?�k���`jE��:��
U��f3gsW��E�z��q�����O��O����@a�w����Mv�Z�����9q����SUYh�t�G�fY{�US��J��&�>
��,A�S����/kj���U:��Y6�I���a�L�qBK��t���<V
w��Nn��P���!d*�V�����[�"�n:�:9�/��������9z���v���	��=h�p]aS\Y9D$����`��6���h9y��O�p�������(�m�2���PY���>�Q�3q�'����D���_;��������^�" ���D�~�
*r��`����s��f?9�gM
%���v��_��)�s�C�@����+��h\X5eN1�;�w�����K��f��� ��Z�
Li�����	4v����U(s
�.�8��efX�]�@?r��4S��M6#���V h��*
��@&������W��-CK����`��"q��K�10`���LI�_Zq�B6�wN���v�Z/��\b�)�,��d2�d��{`6�#{%�(t'�����5�� �L�lTP'b��1��1�/��j�Q��q)�2�g��W;���Jo��]M$a�F�	e��e>��I|3�`�3��Jl1�!f�����b����jE����g�n�y!q�7n�:���E���T�O��~K4�S�,��������)��r<X8|�d��`�	����z7ttEOT@S"�~��2��)�sqG�l\�����5�x1���=�vS�e�~����ZlqE���%j�%���~�L2.�$7����uT�:.+F����e���c��I�P�����	aW�n+�����Ybe��@�-���������P�=��]��D.��?�6Lb�V =W���,��N9�6��X���y�����kc�{8
q%yB>.�����[���(�0 9/�y��
�}m�qO@'�:l
��ui~����W�(���8��[��H'�t�� ��U���|��%��p�0p�\(z#��n����!���
����Y��t�4��>�j�����dw`����v����(���}Sn?���n��BL����lG��dE�o^=�Q�_���J�J����r�41>K��;LI�Z���6�a����+�	�Z=��y���8�x)�F5��
L(Sz8����6f���u�e�V�l��������x��(�v�7�@��VK�G���-Q�e��z���&[SL�%�d���������(�~����(�'0<���W��<��C�rE�umg�Q��t�!eS�r���D�����g�����z�q4���� =�%��Q$~wJ���[�!�@�����HCG��}�t?i��� `��,V���� ���1��������j����ov�e@����Xz��{��n��P������X�2��F����Y�3{��4Qm�bu��vqGb�����@��Hn��h���b)�5�Y�I�p�b������$������g�_�V[�*�������U���@e$�~�nB���w�[l���N�x��Q�"��r���������
��H�A��3�~��F�-���0*��Y�t������{��0���������1n����q�L�t
������,�ym�;P�X�<$�c�7��k~q}�[t�/������m�.W�O-��������^�D��u�6�_K�Z��KR1f�^���oLJx����ACR���,��_Zl�����a��P���E��J�VI\'Q��~���E��<�������+cbR$SJ.����M&���FAG���k�F�}|l�{_
=CWG��uu�?m�YF����X��FDO����d��)�q�V���`E�2�X-��������#Bz�k�i GKC�\��P�Ba�����9��O:U��#��������I+�
!����|����fn"���a������0���E�Z����PZ�rh�um�����h}{��k��	����D<d	�m�R�����*�1�q`L �����Gr�-��!��l������iy�	0^FI 3o )����g�@9��
����4\�����I��M\�u��Tt����w-��qGF������"=	���Q4E�&������-g{����_$��/4|��n����^�G��k� {�qA��V��7��l��,���w}�N�5L�y
Gb</}U�[��!9]��W�]��5<�Xi����_*�Sl�f	����QQK�o����] %E��U� ������>��Z��5`-�0����i��bkt�����]����>��X��4��������4v�/RK]���2���|�"������)�d�k�m�W�4����^bc}|C�M4kd_qL����1�'p���o8��~�r,��>2�VURj8�uT��(
�,����D+����K�
$O�k,�U���������j�]�8��!�=t��0�W�!�2n���+~^����m8��A�`R>x$ar�;[����0�|�]���w)��%��PI���y���,����|��a���T����������3��t��������VFc����A)i{�8����x�z����&KSf�U��.��kjT���!����
�r�-.����(�����I�#�XZf"��y����V����5�o�=,u
 ����z�iA�+����=���{�]����<\�%��
��(�,�#H(��]i����D�jB@$5VXoW<�<K�-#��@T.C������%Ps
�aH�R����{���G����!��+�B?4f��8�B�t,��?;L�|F��}���&g�&���)�}�b��h{�$�4%��SL�"�d`S����f��!#Y��/��Z�!x�,���^����F���[����)�i�����.zL�gTAiL
���;�����
�?a^���3��P�����Ib&��g�;���3�!{]?��U��Z�FB
�X3�"��<�����T_8���\�Q�%���+x���n���$^����0Qrf@�V;�F��8�=����J�F�R���ghQ�N�V[:
T������=;���[�U�b���]��|�Z�G1��I�
��u<�??��B����)�` JM���HC�>x6�I	�0��:;o������T�_��M����u��rLr��S�b�r�D�J��+QX"r;'\� H]H�Q!H�q��;d���$U_h��ML�YB=g��L������-�pr��=�#�yK����M�R1��R����6��������Z��^G��rrG�<Lmc=p�@e
��(l�=W!��H����B_�v��7m��^5�����Ao��1~x2�A�}o��P�(���q�+'z^�[�V��y�x�������33c+_ps9W���$���#��Ob8�r��#X�(z&n�;������cg�|�8�xI���4����J��l�y���	��Z�!�B��\����]���S?���W�.+9n���N�c�wu-��?�Y�7�E2F>qA�X��3����$|o��#��(���Iym�?���.�����F�/�x �g
����ENY��h�t5��,q�[�E�V�y��H��J}���9y��P���r�[{���u�����%��*]X���9x����m!]�#+���V�i`l�7��>5�k�c��T<_�F���,�P��h����ah�v�����@tKU�G
b���"|��Y�L&Np���*z-�����v��C���C}��+E������Pr�TZm��iH�����;���0K����]W$�hBP��Z�A*���{����u�.���	�nI������+������?�����7�:�7h(�U#��]a��,��g
��V�3a��s��0��o�$������2�Cr��������9KA����yZx�?�_�)��kO&t�{7Md����U��0��ak���O,�0Gn�;�
%#�d�g��m(��������Y��=������&��~=&�7K���j5l��"jQ��_������������
�Rg��O�����y|.����m�~�(O�R�_��<�L�����wvQ�T����V
�z-zb �R1X���]��Z�0�4�Hd
��n��u����;��1x�L�Y�u��+�*-��WA����A���k�W�W}�,�Ub��7%~d��nY ?��|��������+rnM��`O�?�6&T�1���K?x�2d��p����F98�y�"X����ml���7�mK��Y�a�=�m?���������:�G7�xE!����(�M���R�nb�"�����2��^;���kV}���4&#��g���A6O$;z>�D���"x���]K���T�D0:��jd���O
5��jzV}cn.?ammR@�gs���~nL��M�_��g���������a�V�����W��n0?|�k���|�9�m���],��LJ\+��I����y����]��T}5T9C�QV|����n����R�m	�	�	��Ck�WHF��F����n�
w�.l��p!%�H�e���h�����:
r��������@D��-����+ki��V���q�
�6i �\9��IZ����s�T Qq�qp��h6�*3�<e�����XIo�+sc��FG�t����0�X��f,R ��c:0&������
8��
�*���A��y��������5�\|�3fu�Ex� �D7d�P�t��#�M������g�_���'��K�#����Z��P�0���?0`v������{	��Y�f8�m�W�t0$I{�W���T������1��q��h�����$1�kX3>��	y����~�R������#]�h�D&\�����VL�������?4������TD-<�M���[��e!�G|W��Dm�M��&P�'d��N���U����Z�KZ�\a���A���"��D�Py�����z�
HN_�|��y*����k��Zt�*�{f���������,�o\C�v���I�h���W4}B�+b�7wr������,.I���<6O���V���R��E���C{��q��[�.��
,P�Pr���i��wSi�� Z�#��+�Q ��~�o0^WA:�m5������z�=�!B>���������I �l����S
��+wiK3y^�����-5'����h���U=}�R��FG@?�[�#O�jA�|&�������2n V
S����/��'��'��b����}U)�`��N��cV`�K�� �����������y�`��v����7�bH��[B�)�6��=+e�"�R�1�?��(E�I#
NX�T���,�=&���D�����hH!��a���hd��e���4b��/6X��{��3������
��&����!�h�(rQg�/�����m�tb#�f��|Y`:�-IO��i�<�,sMb��[���`�M�g�i���4D$H�*��cd�SBKy��Hk���l�L��f?����n
]*�����T�-T"������,z�v�	>�����s�M_����\������?tL�y,�V�O���(+�mZ��&�=�0��jn�e.����A�M�=�3z��8Y�P��S�������h�d��������o� g���\��J#�w�l[���m�#��TZhY����NV���bg#ux+�5\�Ek�D/�������<�W#�^��h����������~v?y*N�\�y.�%��[(�a
��/P����u��������X�N�����[���p!�����E�>5[%�o'��W=Q�=T�EI�
�����������w�^N��x�a��������{������S�����o���PJ����{�.:�B|I�G���f�������ndEC*O%�8��3G�L7Jsz	�|} �.��QK�xC�#�����������,���lA���B����t�GM���s���_��ZL�O���V���^������\/s� -�n��^���s���Q,�D���h�Ma��;}�+����}�h���i�6�D1)X�_<'��*�c��N~�Lx7�� kqG��:sX@���}#��7y5�kd���O���W�3+��F���g�(�.�QHG�4��PjT����/��G� _4cL8�&8f�hee���kUh���Z�@\N&�BJ�n��m�W�P!�m�����������Z�8�	F��C+���r���R�I?+�=v}K����Y�Dn��!�Pe��M�g9��%�b�������~|r��^Z��t�m8NU&����~��������6��Nt�VzGfa8r�����G��������y1��@Y���;���
����&�&��K��R[��-`�a��7�.3=������fN]�;�#�J�w
�H��5%y�b(#=�J!�&M���inz�{;����F�I\���(�?8�����$am���q��b�aa
���WW�"��]���}�8�c�7"�>!�����[��Q�����&���H�@?��'��*,�D�����(-��zsG���
!F��n�������A)?� �v�����w�XK�^�%�[e�C��K&��W��M������E�X�<�G��Y�l��S���p3�������-��c��5�D�ml�G��B�Ly�Q���p�3�������l�>H�	�!�6�.��[���8�� �W�����5����6�/��e�Z���g9Z���w��d����LK�R����KpS�?>7���:d��&�	KL�0_
'�q��:Y��k~��*��*����k��?��	��^���l�W��a��4�h�\����B�8���c�z+���0<JY�WK��9F�Q���_u�g'�}��e;��Z�kS�i�I�i�n���\���J�[����-�QT��lSH�#x������
>���B*�\0�s�y�A�Dn&�
`����&��N�z����0���$��~EYv��\"�m/W�ndN��F{X���I��Qu�2"���6���CR�Uf�{'�����e�l�k�l���5f?����=� �K^�������"�-+i�|�&r)��W��th� ���g�E;Vf~@�&:,�?�EbZ��j�E6\J;��C�@m��Bw���`=��_�T����\���[��T5c@�����E���H0���;P�1�g��Xtz{����;�C)��*�D �@_>�]���+���(5��,q����9��U���k��j�a��H����!j�("]�2sU����6��pIF��@�eR\t�����b�s��a��a����G�p}5��<?���
R�B�?~2Y��[��|k�����s�{C��ydh�w�bh�0$�����l�G�7�P���
��wA>�j�)����y%�6i{�s�K._��s�����g8��I��e|��c��.��#z��'����W��c���+�	���Ke�X���+t��(1��gw���h��+ ��;�Te�z0�C���*��,R_�Y��#����d�%��c5�p3��!�� �V_\\�g���+�l@>�w�� ��_c�
km�[��uE�Z��o).�;����AR��L`���CRpp�<"�����W~�������U{2Un�������S��H��;�����@��J��)@�xx�0P�N���|������L�9�����yz�J-���n��ju=_�Oj����8Y)���cB�����B+������-�hG�H��V��#7���='��;�5a����.�iA�oW8D��S�*�)y�@�����b5�1��-S*�w�y���D�v�kA>6`��]�i�����Ld�i��Dc'S�d�G��	��MD��X�"��!F�����f�X^��g��q(#;��/_�����|�SmY����t��'D�-���=g����3�?}�������:����
D;���
@ ��r�I�:�PI���!��i��3��)FW�.��8�|��;����+'���>��<C�r��?�*���b��E�Kbc��3/�e�+�j@����$��y�;B&��]���\g���.��X:M�X�pB=���E�l�8e�k�p�P�&���_S��������"���v��������Z�����Pea2EP��v��,����%A�pI������;!�t}���3��8��G�{V&2�����=����RbF���Nr�	
�)�W���$X�v��
�k�=��x�0�_�1WY��]�6S��W
`���c�u)��j�\`����3s�,�G������9�tx�������fn����2�)|�������j�wMKw���i���u������
�����C**L��
��;��nQ��B������QTk�Cgx��;_��x
��I�����+P������t��N!>D(�y�h���k����W�����C��x�����������<jW�l�L����E�����7�[�KGw�uC��c ��mn1�M���$�/�����ffV���6�����/�k���c�r��>+s�eH��Bb�e�0E��cCu�$�E��;Yj��KW$x+��7��F���\�����C��d����B8\��_�)R E���Q���P�Q��������]�D�$�s����+[#��UcgPxew�����6���z��'���(zkX<]>�QA����!�P)����(���T?�������FM��i����q�S��-�[�^�8XAO�^���\�M�[5!�����y��'���97�!-���]�����8�-#�s�� ��u|3��SA-2�,(s���]��{�&Jv�7�B:�����L�0^����/^C%���k���<~������n�'�)��='Ee��O�5��Lx����Do����
L��M�����������dxJ����y�M���6R;Q����)
h���z��
M�]wG����T5't�e{�?�}�.�T��j�v��
"R�[@��A,���w����tg���t
��!��p�l��R���#�R���I�(�"�A.:�l�3������Bp�����4�4:�kF�w��T��������Y��8����i�TR(��o\i�+@��u�1�71�J2��1lo(�O����U�E~�.=���rmg�g�� �o��8~�(��7��Yx3`F�
E��[��U)��OgA�.fD`�1��^��f���~����02���jjO-�nT
���DNE��c�n,��?�-�M�� .�?Q�a��u{��`_�R����E3"������&?�Rq_��\.x
rRu�3�������m�=������>�SG�k<Q����dk�Y7cA���7��jrX]����h��}6	Q�Xa�A^���*T��2��''e�����='��T�.W�
�y�,�S��Z\?�U�c����J&�O_E~S�)���������l-����!`��_���/�1��(�L��L&E%����`�{�j� �ci����p��y�[�dd�=�$�p'��#��_-�����
6*I��@��s����n�]�o�Ir[�r]		����	%o�5��c���������V�6��4,Jz���9(kn���%�i�9^����5L�j��f}���6�"1�q
��)n����\��"g�������4*�L�'U���n�}�S����f����ru����"�x��v�������/IF��L���d
���	 ���:-�T�B�dhh�=�.35?��dq������#!���X��}e�2�~�xq'<�����CX�W�AX������E�rd��!�l�s��{j$��q��� m�xkGx��I�H�KT6�z��P�S�����j��h;��j�(mE%]���&G����;�n�Pr��u��>bb�iiB
w�<��C�4zJ���6iO����_���L����g�	���-U:�f~���<��e2~����0)jte�)�Q��i�2��.{���r���1�!�t������_�)�B-%%�q�@��8R�$�#��e���lSm����/	����z�)CBL�^�B���76h����,R��w�?�|?G��e:)���NK_��I�����x��R�]�L��1�$�)^m�(���� O�[�1���F��Y\��l
.kG����]��(�% �S��������$������y���Z�B��"@'��q>������Yr�x������7?6,)Y����W��gB���R3�
�
���^M����d���QIp*t1L�u��-
�BI.�@Z^AS?�a�#J�n�/�jv6�$��C�����qb:)��> 	�B��0�,����|��3��V�rJ��4�|�=�����k��������5T��;
Oc_�6K��-��8�>�7i�,��}#���4�L�;t���)��xa��J&�e(�(M��+PR�����!ie�^�,*����02�Z^E_r
���~�DpI4�b{�L�^ZY���q�����:�&�m���X6,'+�����3'6e�
�������"���j����������&T�k�CE�.����K3a�g�?u��8 ���w�s��DH��I�/>��p�w������K��='���"<�������VT���(����PA�e��P���U"��c&�t����>��>��� k���N?F���y#y��y�Ck����p�E�@{������v	�;���x4)G��1��'6��Q��'����O�(��x�-3�=G/��^���P��;
�B�lwn�v�>�H�7�g�^���d�����X����^e��rL�]���%��v�&��l����3�6��d� ���1<��>��h�8x���L����r����kM�O������E ��T��������/�)2�C�2����m�X�=�4 ��<�t�����#�� ��I�`5��B����	��X�=�If���������N �c]�M�����|s��x�3�+��p;l�����@�0L���$}\��2E}���r�/L�a�m�$��F�1���{���K�#�[�$WCs�i���$[���	�t�c������l�Z�{D5�=<&����}wI!�b ��<���4�dK_��)���������Yc�d�zL��In����s"�O�����.qK����+�\O&��\���e8�` �dmn�H���{��D�����(Z�i��r-J����.�/3�]��:w^���+���lb���=����!��F=���{����~����/�vr��kY�����i"b��>rGm$Z^����SCJ+f��_L��do�F��]��sz�����k�����zt�l��n�p��?�7}h����l�d;%��U@O��;��r�9��2��VB����
��������D������E�����?�W
J�`�#�g�m�ag[�w���G{���@�������/��v���x��������Q|.4QW,��{D5R�����DDv����7�J�������@F��mt��I�	�)�E��D���bg����=W.����#����'�B/$��xB�g3�1Qi�O��1��,����&K����w�i�����m2���=�
3���p�:���U����e�[���!�a.�G�]GJ�E
!���������c��/���v���{�6 a`?`�-2X�'Fa�O���wM���B����`;yQ�p�,��e��Z4s�1�����+��P�P�g�@��d�V���T6��<nS�?��}{�y%�y��*�
�������
��9�S�O;Y����������Qg��YA��`��O���cWLcN7%+AS�2~8�=��������g�4n<��f`7\����_�9�Y��W�2�����r�������@h?�`^�����H�;�`�pw:cR��/=��p��A��Whm��c��0�j��,� d�X�}��
�sD�����#|���v��gR_$���N����O$�CfI�)��A�B���y�T���/�X���X��y0L�YD����#w]��T��5|ZpK9���c�g��l��XT�k�Q������0+��������{�����;�F<��2b����q�_�%���I���$\�ws�u�\z�u��pz
w�2��+�����g������7{��pJs��
n�)��`p���9�hSI�a
�@z�r�L=>��B��n>�FA��O���V v�����1��)A����m�2����kp����;�a>8������#nS���
�E�{��s�s�>�(����-�
�R.���4y���r�Q�,�f��
�&BzF��kl�G�8$�4�%��9���������m����<�o��/����`���T��ST���U�/5��jUh~�#�j�����:����ioD`��H�6/U]�[��}��*��~6�^�r������_��{-���O������"�`����8}�������1 7�k�8
>��U��&�X���F�a�OX`��<�pI�`+�	���,��Z>��m�\�T7^Jb�0$�]��m��G�4��.��0������T�~�
W�
��D�q���~V-((�}������"V�(��+^�f���z���"���Z��h�:e�yn0(U��i0��7>�P���/�0��L`z�����s$��t�7u�^�5SO�{c&V�r�`�7	�/��}����.��*58�:~
`r��5���
H4�w;�s�.O��#K H�oV@i�OU�����V?0V���\�Qnr(���]�������k��V��q�3#�������.������'g��M1(��I���f_��gTjsB���:f<���J�H�DDE���w.��P��4����\"z��q�EW��{Z�DV���U�+��Z��jM�%C`�
�jY���j�x� ���oT>tCW�k9��c7�*=�d3��HR�	i�;S��������w���
�Ekw��������P
�B@��k�"���U�����d�E?d�z�qR��uZM m&�Z�s��{��D�Mw��e�R������3�������)h���������s�X������ �/U���2�� ]mXS�*���kD.����n�#��O�w���pQq�E����y|�Z"�����53�>S
�@�'��CT����9<R����
�^�DH��p;Am���>y���J�l}I��"��f^h��A��p�oW��\���b�DZ���Ya������~5R@�zl��P���_���-(��[/��e��F����MA�rfq���|���H?�^Na�	1�:?���H���*�:{��m��OM��g�Dc���I��.{����|�B{�2��A�v.�|�G.�.�IZ:~��	�?R�30��������M^'Yj�s��b����xG�I����M M����*�6�~d.>4�egt��s������>�+���/{J.�����l��
rny��N8n��
#���(��i�=��TS��{dq'Rv-�^���;��.�r����hu��z��Ow_YK�_��d�!Vj���k��J��bW�����P���
����[4�I��C���A����$��_�l���)S�������I��r�/�%��#�����Z0G����x���U�}�BF��F����F�M�����7��V��e
C�j��',`��/��G)��:����.T!��=��I��}����R�s����y6�������gD/l<����>\�n}k�]�[�.�Ww�����n�	��K�9�x�nZ���-�O���c����*K��:
f��@�OE���5vs�_�AHN��������h�B>Hqs?�3�&�S�VSk������}H���������?�*
���C�T��zAv���e�x�TKI>���.�4xe�:�)���Q�mw��n���B�����3����l��l��$��[�e���&4�� �T��er���aRC��qY]o�M�L�S�2�mJ���H?����<�����"0��.�VH1�,��H����\��&��MMH��"�S8
����*P�#�~���G�����D�V��>� ���$
��-JhV���"��1�x$�qy���-��_�9o��`P��"��vR����{92^��[��-]sN�(�6aw��2�r��=z�Oq
���{>v��_Sw���n�F���t���vj���0�<����0@�1��%'����;�zZ��`;p�� ����p9����,�E6�S�����Q4C����������~��+d\�Wa�d��Hhr�aGs`��_w��H��O:�P���"������z���]��n(+�$+8����g�n[���(.l�s�ky��:�w��PMJ6lR�������v�o�<��L���h����H����-���K��Q��/9or�,������_��'�G3A��,j��]�b!���L6���������<��6�`�9��������XyiX��I���t��~X��V~��������Da������������c��/�#�����9�N���<Z����zeKB��G�->�!9��(���#g�n�C�:w��;��M]A~�>i"��" ���>����d!���"�4�=mz]s��?�@���7o��ys��KT������;J�9�:o�`D�7�	��� �z��u�0��q��S V�����m�n���=�D��N0z�YtR���U�IK�K������L[9�M�[���ClX��8}�|R�a0"k�#�1�Ky�h�l��������Uph��9���7Jc,E>j9oGm7��M�-��8���c;;�tOjx6�a�YD4?�\�
�xo�AwA����5�a��:8oy�������-����O��J�L�r�*C�|����BK]�+|�T��
�sU����7��~�QK�!���&�G������D��E3&�TA' �Y�
m�X�D��W2��l����/g��h.��O��g��~�*Qf���C��>�X�g���TTY3������(:�(�����������C~�-	�X ���I����G�y�KG�Ih�[�����[�Q�\���>.T���q�"]�A���E��4���?��|N2m�xn�����
19e��3H`�m;d�Hz��b!��l��[��{�m{�&O+u�����Z�=V�Ea3:o������]�1l���M�;q���	9�S
�B��t����q%�����Cy�f�KjZa� ;��B���j������8ve��p~Y�����oE+:Y=���i�����O��q�����p,�������"w���c��(h���$-&���M<?o�
��y�m����o`��[��[���F����1��p_!\�Fu3U�Zm���� �������m��a*nFJ��������wo`����k0��R���n�@x�}�P6��n����@�K:���J,�c�C+�0�-$F�Z�O-j4k��.q���A+��9��s�K]"$���C
���
�e�� �n��N��02he	IW�B��O��MY���!����?H��Ad�G\�����LiLG� %z��F���D@O��&K����6��BM���R��5�p����Q�2�u�^n���[���%���f��V��j[�����W��zkk��$8��F���!���B��v������'���
��C%��p��V�g��P�U����f�&6�5���oH�����_k��#R�p����_mP��L�>���F��4��,qpT�C8���
q*_���^��[�O=GGM��>�����7]�����k�:�"<�~���V������6���%��]VS���t�5;.xz/Z?(����d��&�j
��*+��cso�X�H�2U�3\<$$�������2�5�h)��D���`}"uJ~ $T��h,*V.�6s��pW�W�|	#���%Ux���#���Gt�
Iz�D�d���4�l��\14<����_k�2���0}�F>�]{~!y��i*( �@�W���*d��]������9v+t(�Hq<�Q����X!T1w'����~V��N���&Y�zr�r��~�Js�I�� K0��*�O��7���U&�I���W��f�����B�����sgn����j��:e����=����.��Q��Ij(p"��
�Q���:���$��U#M{����x�����K��D�oM��5Ny�|-g�~�]~b�A���IZ����A��O�i�i{�)Kw^2I���Q��'���'�>XC���m�
vP�E�a:��IH{L�cA='w4^C'r��H���vQG���63��xJ�@�m���E8&S������h��{�}c�Q�	�X���!>�����6���g�"\�����v[�~V�O��<?6�ED�-�"�\�)���u��*��%����)��ud*�>���yy2�g_{G~FK$�����$J���h�MFv��#�	���3=�������B��O��Z����n����F��X�3)�}P{mEc�,����jI�S���v�������y��#�<����r}�������~���6��GKvSG
�����
K(�
��/���>���^�9�^d����Zj�Tu�D#�ZW��b�:�^O���E������r�,��X��w�������m���A��T^��P�SI5{��j���_IZH&(����F=C���-������ym�z�'}��*N�����}�:�����[C�I�'�,�����Y.H_8������q
~]��6� eV�1�W$���?��1E����j��	����|�j��B����MH��V�y.���*�q�T�I����������VO�(A��"���gs����g`F���|�cp
]i}������N��#�o�'g'x�1�QoE7�MM��+>3��O�E��>�� Co��j=)@������>'C!<������JLY�Q�8�)���D��|Jv�kQ�}�:I��]����b���b\Av�_r���%��6�����PW`�Gn:���r�j���X�8s�:�qvjo�@^�������Jn��@�{R������^��o�M2=&<2��N��+����I������
N�����sJ�Kh�������6�����;������l)O��Z����s���p�S���D^��9t��ET�#��p$[���+x0���@��v�H�S��i��X�Nj��-t
5\C���F`���2�/��w�-�u2{�T�M5`�:E�P:?�FX�����NM�����.
���K!�d�W^�G2,��Hwr��n2�9e]7�{��z�wQF0�A��{�j��K�����%5t�|�8q�����~�*����d��@����I�"B�^-���f9��=u|��\���f�AR�����7t���2���2����3E�G<��&I��4M�
.Y�[,g��"&V�JN�e����Z{U�_t(l1�s���!3���xgq�.1�$����d��	{�jI|@�3��G��O��e�,ge���������
u:����������"4��A�WX�i
�����X�v�/m,��~d��A=��*� �;j�Eo��E��ID������&����8����3gW�Ae���	��@l�^(YlXA��+���Kti������w��n`�'�������m�Z��')J �����-��T��=��A������2M?S��;2J(m�)b��8t��g��B�GwK���$^��B�,ziZ�
5���R�5�I3`@�r����#��Q���d���Y`���`�V���m�e#c���m����M�nm4.}:&�o�t9��b_�{#����%�=<�Q�����2�\Pg6��B�Ml�)b*�/96O!
����]�B@������4@��]��>�_�_a~}����.n����w6	d����B=��#����������]h�	�q~	��m�rL{	����/M���Qw��Q@��]g�c}��v���f�%��r�x
���N��OvQ���o^�[2�}`f�3	;��M~=)2�qy��~*M�W�<���:�yW�*����
Ih����.���(6��7���p��@��)��|��8�������N�@Q^����1E�cI9��5�>�D������@��C>�(���2z}��������T9����R���Q4��S���G���/U7h�w�/�
���`����KUl��?Q�@p����:;�8�ub�I�:�(����E�Y�
�E�����8�_��������V�v�f����@ n��F��qa��?�a���E#uy�����	��2�2�����X�a�
�Z�YKM����1�u��1�qj6��	�����a�����e��J+���?.\Y����|�w0Pm�������W�
�����O�6o�tc,3�C�4o��W��>S�BU��t+���-���IB��LJ���}C��
����L�/_m~���3�dg>O���P%�1qe/����A�:6_yEI���sj5dY����7B�����g�zf���v�x+��#�K�
����g���S d��x�q�JHf`����	0-������	t9��L�k��}P�j���@=b����bmt������|C���]���l��`�o�����l'{�nt`f-��*/�L���"�^y�n���C�$�F���s�[x�v�|�"f��?{C9��\��,S��Gz���o[W�<3#����P�.��p=������Z���=+==t�K�]H�!���������|��7;#���q����{]Oj�?<2�-hu���).0���d��	���-���9q
��=�s���^|.��jC�o�$�hz2,�r5��
�k����M�G�.`�:�����-�+W����N����Cu����"D�-!QS�|0C���}��|IPv~�����G�����/�r�(�}ZG{�[�(����y�}��o�<��5����\aB&8����dew&$�}/>�'�C�R��2W����o7~i���MK��cR)Yt!p�ktKN��0��+�0�{*��E��Y��]��O����yR�r�f���m�a[%D���c;�E�k�Dn�\��:��1�)�S�:��l��~�����������51��	{�~��%$�j��7|�����}�`�9�,��}i�*L��~��w��/��,���s�d"�i�#?��|�����G:��/ZK\����M��
5'��=��
V��p��#Tc�S����/�o�I��<��!��-y���RN�?
�
g?o��n��M��A���

07���i�QL��V<��i4��Q��!2���F	����������������GU�-L��;#�t�Q���Y�.�x��5$����N�^��a#��|��9��������kX�A)i2�Xf�v,m�������:Y�1��l<}]�x<
.dRX���a]��).\�f�w=b�	����{����O�&"���'�'?�<�l������~�Iz!�
>	9x�\zy���L�hI�[ ��g��FLI=�������Me�i���=H�ha������&�s��MH2��#U���3�#��D�.����5�$�@E��x���������L�m��&d�n�(4��.���>

���d�<������b�#z_�iC�;e~r\���:��4[���	��M7,U�.OJd�7y�����cn%�8u��nC����m�P-�W�,��"�.�����:3�^�`{�;��>�{q�8�-���=�p;�D.,J��w�5�q��-4x=������3��Jb����CR���S��������q��yJ�����Culd�������I3�U�c�CKlHBu1��e��!\��8L%XK+I�����k��(�`zzEl�r������.eF!�N�e<]�&,����:���xO}�����}k���>�����W����}A#����
`�='��,�/`^���q�X���#���iDy��D*�f�G�����/�����sMB�_c9p��q�tM;��?�}6�v�����7��$�!����m�%;Ou��Y�$���1�&���{JkO;?.���;�u���L���%+�qU�k�M��y�7&�S���"��*G����Y�=0y�1���������/���/�Nk7o�	�G�~�����0��B�TT�.����3
��������~�5���c���iH�0D0�|��K`���PF���M��j�IK���c��J.��t~|l���L�T�-Tc�;���M~��_9�,w��Hv�V-+2NwOQV���b����8��H��GD!�8V�O2��[)�B{�G�V����P)�`~�]h��65�a��������PM{�� p&�S���UZ2��|Be?����Du�<���a�����7�H=�� Y�5��F��S;��!�0
oz�l���k��������]��8�K+��zj�;��P��`��j����0��b����P���P*�X�������)�C�	�*�d%����BL�l-;.2�ufK��gC����r�c:�������X9�S���!�o�!�����w�68<KmUz���.I���	|%R���V1������m�}kh2�������K�g�c�kX��d�B�bT	{Yw��g
Z�*��dO�{�X#z��(*;�/13�$@Pu�t��.v�N"u6��E�(��5�����F���sE����-L	U>
0bbqF��)^�*`Q����~Q�,�{���u�:B������U��]�$5��H��P��No���%����O=��<���\�G��_F}��BqP�9�cp�qu����b����u���Z��J��Tt��V	�=l$[SQ�cH�C�|�[��8]�����L�������H��m��zL���_(��S�m`��M�o=w0o:���MIb{������L��`�����"��VY�&F3���y%nn�$1�">�S`2�%9�s}brkZ�G�	�r
N����)!�����>�s_X(��X�����N����yY��l��s����f7��l��;�����2
����*9X���:)N���v��� ���3�7��
����=�a���9[��2�z�{��'��%��ms�O/�����`;u'r3�N�1'Bj�3�U)D.�^�������[a�Q9G*K;I�NeY��y���ybH��Gkr�u]�xq%L�>:��#R0B�����R�B�;5�D[L
�K�ndG�xj#��c���V[��`����
�!H�BN�������y�����RL���2l\B���>V#����RO{wu7�ol�����3BY�F��D�������<;���AG���&
����T�^���fr�@#��9e�'nKIu�v�A3(�i��*c��2�^�����GP\\W�Ly,�yIE����f3�����{�TG��4�-����c%��x��_p�n.j������	e��t���Aj���19�8�oFm���!9'�9��p�����[4����6��IEAT�3FF�
�t��]Z+\�A���9��g20�t���^��Z{����aA���p�� y�.?d���=��N�{�_�8�F��8)��������:J�;u��`��,	{��98��e+��:{�?����qG��!dB���������������������te��C����30uo�	�*wTbG�������\w)��dS��s��I��l�H�5�����@�����h;.)�Vz�v��%��F�&#�fVj�woX��)�f"��� ��59������:�������x�O�����QL����/
�6o��l����1�����5���3`��'�����q�8�<��s���%A�7P.�����&s������
��y��YT��h��GO�EP��B`l�iVcm> }��Od��C�L�-�c��&G�D�����zj5I������e�g����/B1����\��`��
ZxP

:-��pG�aR��=���r�cj�/��k�a���S����'L���]��FW|��U��.��e�?��oG��%�H6
�������p��D�)����8<hc( }4
�W5W���HT������j���U����VR_GR�	����Q{�.	�
��l��u��&���8�J3��������l 8`(	�;��������=���"0q}fZT�	�k�<����v���VNk�B���CKP�DrHY��q��pHW ���G��jmk?�b>����[����>j�~��y�����w�j�nB�
s�v���"�q7$����Ya��A����>:�Sg��ZCXE�y&N6��N���4�x��R��U��7A?�V��X���:�u�T��]l�'>F��o3n.�ss��yv�2Sk57��U��Ir�n)Hl��I?PRY���/�B]��]=�Wdm��O�
��|{��":�ad���W�S
E
R��$^�!�e����n}�����-gQ�@W���o�PAP�C" I�Z�Fd�>���~��PU3�E���5��D���t�F�]h"G:�G��;��s}e��}�%�f
���?��9�(�6>�j�g�X�����x�4�3E1���x
�����l!�{~��W�n�m�U�Y:E	������T���2,�"�B*F��-��K'oT��"����WBJY[!*Q�#
� "\o���C�w���(��u:���1��J0�O��rc�(�x������j��	���$I/�"�E�lW���|*n�p	���u%���#�Q��g��c|�&�(�^�
=�\�xJ,1^?�Zx��zh�+��&z�sX��/�8�M��eo��ph�L�����C�^�1�,����S����oV)U[����J�0��^b7�������o���
�o�c_��%��]k9l�
����2�hF1������p!Ta�B��$��e0�����2P\�z������W������=d{9`���������,�oz �7�H%��q������q�A�"�X�w�s��
`��u�2�7yjR�I���'jy��GqjS��F����B��,{�i����'�1���OK���G�tV��Ctx��A����?RB~��m�sH��`����Q�����QX�f+9��tr�N"�{�_!o!�7���)��J!�L`���"|�~�����'��}	z����n��U Y@�K�9����]V�{�Rn��&>-�o����
*���"\���&�CA.F���GNn�l@����~v�^����3�]
#������89%_�?��	}g�>)|*kd-�u���*�������wTO;�]��3 ~�Ym6F���$���m��������1������e��]�����)����vc�k)�_�n�F;��Fk����d��n��s��[B�����z�o�V[B�r�m}���[0�',�?�����c����(z�J7B������K4���Q)_tiw�Yr�K�&��$����B�2���L��|x�Y������B��/��>�}�]��G
�G�;��vl�8N���_�YVQ�~�k=�u���G5�O/����9�"p���,�R�9&��z��b�E����5�� ����j&����i��h@�k���d����I�)�.�5#�K����.8���
���b��B��}(���4���0{�G^���0�<<t�7b{�Z�zV��I��I�IG� ��6����/_D`#���3?~��<v�(�SIbb>O>"$q�Y��F��V����0iz\�PL{_n�r�������{zn����[
�t�-�������!��[Z;3���~����a��
������Vt���&��=���	�',��|s���R����FO�����7�j>��������_29�?��J:�o_Z�I@�;A>����c�&������$Ew�a.���,���e�����O��d���8n#`+S��I������d��GU����Kdr��`���cU�l&JUA�?�9z��j@�J�@�� ��/��{������x�..�3"�tJ�<���
�����5�8�.62C���Tx�3�%Cr����Z�@c����-��M���Q��u^:���,_��C�:R�9���Qb���D!���t������)��/{^Gf
�%Y�w�#�2�:My����^}��Q��B�7�B��&�j��].'\�n%�
���	|�X�6O!g�6��
��/��A$�e^�����A
�.��g^���rkM���I����t��%��7v�?t����^B�C�����-����2i�����aa~�7�����0�D�F��F�{OQ����}5�R�|�Jw\#Z�-��kfY~����	tD?,4����������=Y�o:����s8�.��VvI�jI����00��bS��7d74u�7zs��2��zQ�X1��V6p���"��5	�����9`��&�N��^bFKl��YT��Qw{�O��n�U.����*���%&yy�\��>7x�bn����|����`��O~�'���I����p�!6�L�o���N��$n�*�:&��7��!�s�v�D�#aW[T�n\�Men�SVV�g/�7������9]�,2�D�� M����q����ye�������-g8�%G|�	k����Y����>��<mx���c�G�4#r�FiI�&`{+�
 �d6A����
�S���/1�AH\����H������d�ce����3dZ���.v�E���@�q���X���8!MZx x��_//	5�@��e��<�YdK�G���7w��%Gm�Kq��44VP��1���B�%��y[��>����T�Dg`�����6�a����>�]�}�E$�UI���,5�x/���K�w|F�����b�������G��))��LV�S��&���%����������%@��u���g�m��z�w)<;����S��\�5�`s��;iS�S��e!-�1���}���b9W�e��D0�fh#WV�{}�O�P�s�V�=�p�/u���u�a�W����l��z�G��$�4�h~���A���q�����U�:���:[��L|<����~����NWV��1��M�����%c��M��u�����X�}jB��{w�+�7�G�k�����1�T�1�Eq}��e5,���h��?3R�081�Y]��o+^�+��M������I�?w�������g+�a�|(3�:1�+x��n���HidSE�V�/�����?�Q��f83v����_�C�0}�����|����a�x��6��pr|�)�W�Y�7`�F������b}��	Y$:�
��xjD����F�s����CMr�����+%e	=�_o���_����iWV���`"��rS.�)l��V�y~�����oU�9$���S{���T�P�cAz�1��IE,��'"t�f?
	�
��q�a�!7r�N%�����V�����=>�=P�U^Lr=��x�w�p���d�����'�+63�����5���#R
LD�x�oj�
=	�"r���P-#YG��a���������]��S�N���jt��L�:x6m%Q��`�������
�o~��r��Ag���v�n�����
����	;��o�	1���;@���+e����G9\������+T����}#���e6=��0~j���onv�_k������=-��NFm��J�� �)P�]��sJ�:���G��k�K?�_8'�����R���i��!�1�/
R�a���d�	CR3r���^��)�*���;7!na]��dg����6j{
�=�����(�����?����A����
!�vZ,����~���n5e@DZch�)	>�`�������z�Em}��Z��&�\6LJ���+�����x��;S�ZE��"���z�r�sE<A��|����H�[���:���P�����#�pY�E�Au��b��C���D��B7�h��T}H��$��3G���'f5�9qFH!����������G��(�{L(��P�;��
�j�fwM�6�gF�����*�j�����K���(]�h����]a�?�������sN���6	~�0���C>��G�l���J,�����������w
�m������<q�6!��j#M����]���;��]��S$v�%Xf�q6�<��G��u��8X��G@�#q46)}-��nz��$#r�9%�0H�e�}?�V0Y��Fm�?�"M��F�Tf[�C�xx�����"u���������un{r�R��=���O��q��3[�e�����<��i�}�X��v:t�V Y��+����1up��p��P&��70k
�{�'��z��a��(
��G�{�U�0y�e�����V��=C�`L���@���F����O*(��f>v�[��=s���{(O��<;��]��D����f%�������&���z�f��*���=dz�\����(z=��
����)��Q��8�����
�M����jd=�q�d��|#3������Ze����.\�*�-
I��]�a 1���!����?��5�xi��f7�UL��G����T<�6�"��Fe}aF�\��>tfQ�'�mD���rV#=)L?|Z�o�L3G��jC} �8�<%U�Yw��a[��w4�N��"I��������h�����}����U��%6��c#�O�O����h*�4��*c1����r(����&�x�?�c��$I[�7��/�B�b?�%���l75��l��{E���?��t��������YD��W������m;����=�QB�(�~��#�3zR`�5��u���%f�w��������9]�T�/6�X�:���P�h��N�����'�*�S�������m�>,Ue9�b[Qg�\��� �?A��H�n��rI��?�*���0��w�6R�D[������AJE4��ru���G*��<�\f���y6%#j�_z��������B]��V�?+�##,��;R�}E���NT��1<O�����j.J�hC�&��������~eYR`�����e����k�9����D�6^�������n���>~��G<�@��4:`�Y�h�~U8=Z/{H##��<@$["�l�f|�sid���V��`�`�����"��(�P��Z\q���3������N�cQ!��������#���AeV����u$^���8�������y�p1��d�L)�}�0�Go'u��8!R_j�9,wW��O����U���,�������J��X��ms8L���5c���(3�CE�`oeFS��_����0����[YyY����o
x���`#U��5
-��cz(V�_N<�'��c����K����@��	��������t���
D�]����P.���Y��F*I���������,���'����R��������<&3t�t�Q���������nt���G�
Hm��C��
x�`>�9�I";0{g3�t�H��@���;�L��� ^�&j6|C�{)�����j��/6�O�l���/$i�Gb�0���\!}@x�BYj��������	��$����#���5��F�G�g��\�a�r�w=���L(����+�0r�ZV��Wl�$MN\�#�  ����)Hf�;j���(m��	��P�u2��#���JeEs��f��([*� P����&�k^�Z����#�h��P���`�V��y\�{D��Z���=*y��a��
�3P�
�o%��
|�N�A���z�Ho�����:rj������V�_^]�a���F3���L]��H�,+�8p*��z��2�y��d�Y�3Xc(Z	���>b����s,)O1h��rh�B���i����`9+�������OD�� Os�`��'31�����%!u�
��#�Vi����|��f�K����^�}�X��������"^����W��hD4~k�2.�����s�8�i/6y��DAsD�n�S�V��=�����q�9B�;���rt�!����yL��t��N6/�g���SK�<�Z�>0�	%���a5I����;@�$,���N����?-������� N�<_�����E����!�	*cO������������|r'��l�%�e�%�����a$�].O��6vH0�C��U"���l&�0�V<�����\���4�!�}cv���A�$���u[.���O����9)L#��x%�{I}��`�������v��;!����]^�%<�����0�m5Y�y���������|b�J�K<g^��;])�%}�P���������-�#����;H&��C�U;�m�g��d~��7\x�w�m75����U+)���'��J�I/���Y��-M��9O��-Y����q�&��,�T���I��K2D9$����;Fu��B?)
��+�����78hz�k+*�_��'='�+��$����\<�m\�T��Z��A���R������%Z��)c��i�u��ccM�l���u��t�+u�H��w�&cZt�����9�(R@�p�=����M� �^[����i�vC]K 9i���s�Rp���b��k�������B�c8��4)�W�^�,0�����=��A�,��r��<���������9����3����=b����zOR�������
�\�5?��u�G*���v��Ly��o$��3��)�#��p���H�z��Q����h�o���3=�,EtfW�gY��l*.�K�U��UoM�,\_=!(o(aV1���t��OT
�x4�����J��"x�M����^F�a�4�5�}����;�.��4
�u��So��r�dn�����6��?K*:O�I���;v��������)�<-����M��?;8�q�����0�#9���j%-*5 �����������O�.ju����H� �~�Bo�x��a�?y��
2L��N��L�����x����P��b�
?=����Z����u�ZO��X^��),�hW�k�9�5��7�H���/�8���T�E�I�b2������F`6���'��dbGd���
���8��/���b=�y,�U�9yhyo��T��nL�7��}����i!?j9<��������	�h9p�.
N
�����_0�����g]��-B~�����CYs')�mq��#;�7Rx+3�o/�3�\8��W�a�?f(s��p4U�c�����C2���<f�:���������$�l�bv��f��#��\D#�G���-��yF���
�_�?l���
.E%5��e���S7���5�F]+�����~7�n8IJ���B��p���������L��b�H��X�S�[N�J�e�����I�r����gB��e��(2����)E�ZI�
��H|A>������;�c�=�M��*�&8|]@�I��=�B�Y�-�M����w����I�������i�L�C9��� 4��5Q��[@�2�GOM��cer�K���,�t�Qt����=D3n���$I��4�0���l!��8������ �u�|� *���o2y��E^���������E^�z=��P�]^_��1���2��6b	����M���BF�~�-R����;�V���`,M���v�U:���l��s5o����-`��Z�W:E��}���	�+^��
NZ�'��w*�-������9R����>-�~��K�����V`5��{|#�$��ZR"��]U��r�l���q��I����
s��:��<��zHTW�f��[F2~��c<6�
It�����?��d�w'=
�����4�9�Bg�F��<'�rv���*N��y���U&�q������=<��|��$����������
Cs���6�
%����,$'&��V:�GoCU��;�D���'��?]/{�����E�����4�A�������#�O��hr�]���U��^�%�������|�sO���0KSl'^���j�G����3�;������o��#	"N�`�(��|U������[��������L��i�
��G�kn��k���^#���Hr�B[����2��oX����7�Rp�w=�����A�qd�����"������)����0g��
�^+:G��_]��w.����<4yf����j����KY����G�`�&�0g�ANd�����K��{ �����0A@pu�����t4��)T�6�����;!�r�Q��O
,��[!&�.�������xu���km����q���>�.���8upf�&`�[�&�C5��&2&L�@�$]r���������Q���0����V���a�g���)�G�3�?)���S,���<d,�W�^��"����SB`�40)p�"���K�/���F�1q8*�������e�O:���53$��L3�d?0��G-�T�����q��4�5^�%�N�YRu��;�}QSp�a0QBi����Oc��IN1����e�

�`��[*0�
w�_CT��E�v��.�	%t�gD���k���v� ��*9�����7*D���\�"w��%�D������sj��U�kfr�~�k��4}=��cQ@�_^c��7v�E���6�UJF����?��Y��Jg������S�Qp.���f�Kw�(�s��5��g������[��Ub�����ko(k��q��R��f>��sn�\FFh�2��N�n�P��?���FA��������t0��Z��K��<���J�*��NU��S���b��V��H^$�i0����]a��P���9-��������@x��f|�X �8�Iz�N�]��>�+����� yU]8�{��E�|=������}�P%[Wri5, <"�+E�y���/��+��=nSF:��I�]lA���$O}%�����#���$�z�>����hQ��
����`;�F���E�s1�� q���1�fJ�����6�%���5\����e��1!���
a�$�5 A�|�ksQ����q�)���L�@�"v����B wZ6=
x���1q4�������H����u��w�(o���%5P\���D�	���l��-:�?�����-��YO����&�\x��j�h/�r#y�3`�K �|���"��UoQr����.2a��������M���m��,�1Q�bY{K�u��8%x%u<������������N/�?��:����w���oT�h3%nt��)D�-����Y���}�m��������8u3�����7�uFz{3V%���k��:���m�D�S���j�{�>�G����h�Ar�+_���~�?��W;�._�%��������/T����A���PFs�3���i����{T�l�8���$I:P����"�"�T�B
4�����+K\i�`x���~�q�0A�����������sS���	P��Z|��.0����F�(�{��X��W+�w�~q]q��>��?s����nX�����=)��9N/Q�����+�p��U��'���^�:CP�3^�����	L�����w���@�,����IK��f��������F�#�E�{pF�)����-Y��{�;�a���l+�]�4�\?�6,�	�;���s+w�&1�k< �8d�,\����o'*�nNOV�c��.��
���gq]Q�D���.���)�6�R-.n[�a�^���ig_F�����>�sFv�d�wR�?^7�
�����.����SM��� 	(��`�����\R0��W�Dn����h �B�����wY�]�t����_4�}}b%~}ip=�*%
!��yz�B��'tfs�$�d�C6z�z�U��'F6�#���+������,c\����n�����I�4�
w�//�,�/��_��64�R1I^�@j?c����|�_���X���wra��s;z�l��[~��!N-�Y|����cd=��=D����Vh���$� e����K:V���Z+��L~~�YgD��x�0(��[a0���������E���vo%��6�����[#�@�8�^o���5W�iXT{� kV��il���}��Y��P2�n4��U�Q*/��fS|��@"���N��b������1�=,9�&��9R�����6�%���Gg��:��I���U����7�"�&{uL���XU�<KY{�������I�$Q���!\a��>������t��<4�����k-j��]�N�jh��:��+jC�C=�B�p�B�F>hAh���U���p>�P� �~�q��sl��HZp���3N��(�2��S�,7�A�=H�5	�U�\�P�d����=T(M/p]�!/���k,�7��I�[/�j�+�eO�4&����v;}=�P(sE�[L��=�z�������K�2��*WCiB����_��4��7`��G����[>�[�1�H�Ru#�� �M�{�B�v
J+��0~`���r
z�Xz
���y�?F�,��9�e�
7�)*,Q�O�	����`��3��{M����*��
�v�]|(|F�`��d^Ig]'R�4qWB2Z(3�����T6�u�Xh�@�]�_�Qs����W��h�1��r����(���A�y�[*���`�V������E����7h���8q����|4�^�y����*����k=8�K��!?95�RR~�f����G��D/q����	CI����@.m�%)�����x@P�i-���h����8�2x��f����E�����ip�V��>:b����O����>��{�u�>G�2	J�[m<�6���RB��f���m���#��P��M������5@�����bA���
�#�
{e�����t��A�Q������a��0np{*V��sZ�5\���{:i9.����%+�a�����H6�`^�t��@=$�Z�H�R4?|p���%�:��7P���Ga��K��N���D��j�_e��C�����ZA��sjO�q��0j�����	�����O��K7��\���a54�4�yOL?4
�"�S$���i�����g�t���>��9������S�oY)���ZMY�^��9RS��k�|�P�a;��Z�����W�����10����9_�\6�7gY]V�����������Kj��d���o|�R�iTsO��|�.'��?�]�B�����2@=y�8����i����hI�t���+�L�vvw�o��-�Mh+5$:�2A�h!;x���"����O	�b������+/J�R�(U#���1�0�8dJ����i�v�]f���
Bl+J�Q���d��YW���T�^��]_�h<�T����4+��':`�����+tZ������f��������.��#��$:��,�X/��f���@���~����}���xD�@|Z��~����������LJy�<�9�`Y��	
6�nz�Y�I����%>`�6�������$
^����������9���9���l�����x���&�s>G�����^;���dC�\�����������*�������<A�"[�'�\�`��Z[�cp���j�d����������0����P�V�4�/����bQ����y��<����s|�k�����q-hXv�L%a=/{����X5Ix���|�?���{����g��xv���<���q�
��_�]S�g�8��5��GL�r���s^�4����xc�?@k�)uO���PU(�%��le��}
=�ir+�V7�x��>��]\�����FMAUUr�h���`��,����<�-7��jS�Is��G��i9��W�pr~s���0]�Q
Uddo���t�:B�}���5��)Q\FR`�s�1���)u���|�,��3}B���zHw'�tWW���=�U]��s����L��`�����}���x�mn.��4���!�S�<um1���7gv��������g����;C��X=l�~������9��L�p!��d]���Tji���	eg�`��K���������5��
b��@�J�3
y�FA�,c4�!1mg!d�j�`[�I
�4f�Z��B���CR�W�b:��H�o9*�{��:N�D�M�L����e;�:K"#�{~~���N��X���{�xB�B9��C�b����U�#83�#�� �EYn��2�� ����lh$v�f��6Pq4o��D���
����o�	^m%�aI��>���2(��$�?��)�->+W��y�a�������e
�[��;>�)�����`2i�;�N��Ps�{��?�U�V��a��*���m�s#�R�_���<;��2e�}�������Z�Y�	�O�m��|��z@B�����NRf1��T��+��q`��d9��e�kA_����	��������X����6*�A ��_��}�aI�'6�(��RN7a�����D����c[���#�n6+8�ev{$�%f�������;!*�����%�
�)��������1��K�m�G�	/��Q���goB2s��XK`���3����!�g9��� �������
��
�^*�p��gd+Ut����������fI,M�-x��i����p^��V�Q<[��VH������7�������hsV
m=Rm�`��:�;T��Q��3?nQ��GL*���V�Rsu�����w�	��2C(���|�d{����RY�������������M�r�>���v��>��@�
�&0��T�B�s �(�w(�	���za��4�����7�b�k��=~��LPR��� ��#WY���GX��Dv����.��8sGuLCU
�%S��5� �U�p6��P��XA�*��c~GZ�~���$����E�5S������R7�\���5����)lT�h��}�� 1��m%����k�jT��!��/�E�P/F`��E_I+[Q����lf\$@�C�oadD<�[�q�^���f��������<��{T~5��Rh���eZL\e�O����2����.�x���T(o����m#����i���y��7���F5(<�!X���!q��f? ��I���@r�@�O����7c?	��t�d	�0����7���g����+����,�sa��[���D�Ho7E'�	@�F�FR��?��F�����)&�`G#E��3*����f��m����Q�����������u�z�rN�rE������G0X���F�TR)�A�vCkX)������2��V�C�5;wO�����N5�������1VC�6@�"�V�F3'	iwI������3�y5r������tVF�);���_�L�.?���������#���)��e��V�����/p�����H�t���vsT+2w���o
�7H�k�X�yM�J(�,5�X���������V�������M�Jn8��p������'���z�G3F��C��e���z�&���n���rw0k�.����0,�B�R2�o�%�GtA ���C���Z=�������H
!]@�<_B� x_�
9.����V��J�Gs��
t�2�R>��P����Fu*n�r��������%2|��DqX��R���V���ip��7����r�\Z!�'�y}�?�t��Uw���I�8�%�*���u�i�����c����������	�*n���/{�r�(��;*b����Z.)�����Ow��R����j��X���^���+��d�Z\f��KG���]�o����^K-	I��+W$N��7�&9��o	�����}�����-E�B7����n�/�+�A���\m)9�Qh�$5��2�V�����/2������E��@F���.���r:��<�u%~Y���n�&21���Q�!T����Iq�b�$*��I�w�w�4�:����L[�3�{]����]<
H��c�6�
o�K�C���z���7ss�x0��P�9a��V�;���G���O�4w��=�s�����
�P��(�(���N7'����>Q5���t��j��X�46����|������5���k�{z��T?-�aa�a��
���C}���4�������
��kd��{��}Z����c�Nky����
���~�����J��R�w���
���4���k%����_�������Y�n>���
�D���Z�����IJo��_Lo���>'��#�FQx5h=5���R�G�L-\ww�HG��q��[w�R�a�y��O6�.dX�]-!��x]�52:�4�!�-�i�[qqe��u�:���B
&���N�l��j��D=���Pz��������	dF�\�	U����rs5��9��W��q��sV���	�
=���|NUx���H:�DJB�sL&�O���G���6������w�M> ���vJ�mD���i<�3KR���h5��s[���9��nO�N�a���.V6(�u�����"�_���}4�P]���{����0���/]�Mm�I��$��A�3�T`��,��r���l����i}�r$�����-��>EDN�Ax��*�������[�I����hv�	S���:� !���S�~/�������(J��k�g_���F��clx��`�#����G�Y��)���M�*`��Z/
[	nV���*�a-���|����}y\qI������}���b�
�H�K��K�15�w�_	�bI��C�UB6�o�:����	y���r�)�\���������}o�]L�5�:���^�QKQq��kxk�/�,���6dGV8��2V�,�pVn��{�b"�}�A[���fg�e���#v/.��h� EE��^8mm�S~N����V8 
���W�f���oM�����Mp�X�!/����n��PN�`�>:���7�:()(e��M�|��VpeJ��3x��y����uj��3�t�"���������^�-.�!�I�hGu6<�x�m�����0�6�����V��Y(���,������G)�b��&]9��.��O.��z>��F��@C
t���h�\S�a=�N�T�������G��?�bU�+��]�/xt{�0�7P>]E2�N�ZJ7�����c��� ����8��#E�5�MG�9�;��It�G|���]�R��\�9�h�,#�����8������P���F��vyceQ(��b�=��8�����&c{
�=��c��79r�����ds�i�Vf����(�%��I���9�n���cMS��b
V���eQ�����F�������A�T`�$��(���#w�iv^�]�S�>����*����B'�u������.f!�yYc���`�z���W���&J�����\���yEh����������,�i+i0�f��EMZpS���
�#�d��; �k��������� FG�l��o�6��Dd�P?���Y����#�+��y��9LtT����-R����#W{7n�#����0�;��F�:=����,�o�p^����/��LM����\���R2����[�3(��RX6MTB������ZM9dA3�Ii�P)����Qp��&�o?�g?���{�}�k�B������W'd�p�~�����56�.
��oe�����/U#�Iyy��I�l���C� �IR!��~x���g�%���3�Y�a|�����W�3����T�+������D��������w�$3�e������gE]8�J��4����`sB%�;�h����z�s�W��&Y	�E|��	{P����1V?�� U/�������1h��X	�z��u��u\�{`�Hp��5n��.�G���H�c��%N��	{�t�d#6�	������	M� �K�{����B��c��{��� ���n%H��zI�A�"��o�������bjtAMZ�y���/q�	��? t��#f�6�:s��T`��|l9���7 �Ni� ����v�)��6�`����Y�z!�<���#������E���.��[���"��/F���h$�X��m���Zce��!��Te� �����#!\�L5���*�g�D���&�\jC���H��DLgX�����A�`������b�eGE\�����'Q.�ALn��R���HB����7+�`�t����:�H����E37f�4���������Iy�3d��)1@�iz>p�w%zx�[��&�����4Y���s
�j�]iY�}�}�A��Sb���.����'f�1�j�u0�����E�hZ�y
�(%�Oo� ��3Cf]�#$��Fz���I'�j����lV�~�YG����/c��y��{?<���.�sP@�1����23� #Lp��!����>�����FM�&��,� k|�KG�>�����-5E������I��"%������R�A-�������B
�7�]�����D2X"Y�5kB�<�������KN�
~t��\��>���(�%�+��:�|{��������a`���Z�c������0j6���R"�N?�����zB5H�R{���M�	�.��<�x�FI����9g
/���;�O�<��bd�D���:��#nV�'����HJ�<h-��dT�����j��G�����U���$�����Nu� �a4v�Z��1\)��;�MN{������4��r��HQ���������-�����6�(m�l!]0I�),����r�0R���fy���v�!����Jq��_�������1��L�f�}�������}�f��*d{m��h`�N�z�{��	����{�I���A����*���2 :���}�w����T�����a�;�~N�V��5<]�:B��CSO��j���U�S�7G�W�X7�=�4�����G�����#�[d�oE�M���{���(Wj�<AQ�]��[+��	�����a�,7���Z�z�(A7�zE���;�">(�"�^�A-=�_��(�^���pW'��W������]I���|�v��l�8R�����D y�������gT��n��"�(_�-�����#@�#����u��L0b"N;����<�g��/�)�����F�����{�9��;
���J�;�@S��H��������Ik�I���&1d�o ����%5�����P-<|�)��{��?�:�����B�V����l����im>����-R9XW� ������M�T��o��.�����L"���9�OT��5���v���a3��E0j��cK�(n�!7"�cw�F�~Wf5��`�]�Vc�V��5��w�-�%ojX�h45P�:i�G��Q��"9r7������Mtm���z#
�����p���A��0L�F��"��W�a�����5�m�V����<%2Xjsb7
_�k�,���8`�=5�{RW��<���y4������.9��&��DFmhw�v�K�����������������e�,),J�1��������H���n����~���6X�	����R���=n�����:��N3�����-�3KN_�23����u�"�����$����)>��d�+a���)V;�>���r��99G����J��}kV"��U��$P� 6�J�
�d���e��9�����[���[(R<D��: n'���I9����@����o4"��h�8n:�	@��tw3��5��&f�,����	/�|��~��f����g86����i��0��
K�8 ��g}{V���rQT���u�PG}[;]������
4x��9b6���9��!VT
�M����&$��Td���4����[�5m�6-v��n�wIT���U�4E�Tb�@3��l(�FI&�����1�@"��G����&�E�k{���M�����Jc��:����W��0��95Hy]c������v!w�Y���
�����A:5Y�� �5���}6���/J�!?�d�k�_�9,6	jw�P{���w@@P ��;2Z�hC��	������ .s�%�q�8C����g�.$;�YSF�cN�����m�0�lf�a�-��xC5lTC�f<���
�������T����B�1�@Q�ZwV�]G�x�6��*�`T:='�TH��N&���5aL��Z3S�}|
�j����+���^��������
F�'V�aK.C��j�pmx�*�����0Z������.���pG=�!Q��do�Z}�9q�~��3����1�)&t+��l��z�	�o�jg�`�8C0H/�D_��ds���j�K�gQ�^�F>G��?	�-��?mp�Y���N��?������$��S[!CP�a�.~6���q��O�y��"O};��N��^��=��s�-t���3o���m �V�{�f��kK+�n�F�P=������������[��p������j�k(A����A!������F��v�u��>l"*�'���yr%�����������#F����\
#h=��LNl8�#��Q���6�s�T�c��a1Q*����e� U���}�M�u���1��n}�2���N�_c��Z�S����]�'�`���$=�o���c|m���-��%{o�H3�"H�zx��I���f�����)��|�(�6f����
���N�bf��3�M�"K\
��4�{�
l�����G�k�K�����%�N�������p�?���~��aY%�����=u�c���R������������\NN��!�+�Ij�MK���l{s��:��;b�D/�r�d��!"m.��5X&��.�a�Y"��WiN^ wZ����
u�/��������
��;��f�'Zs
yC������E�TF�K��	Qs���c���	�}����S��3��������
H�w��l�}��B��O���i 	�X�g7����}�2��:���<K�>Z���,���:}��Rp'
*l��yeW��J0�U��e����}��.\�z�H i�@:yiT"n�V�;3������������Ev�L�nQd��
!;�pO`�s���{
/����0s���Q��9k\������s,j����x<*����0�l���k�|*��`3v.5=�0F*rG�
`��Sf���Z�����������.
���4���s���0X�	�H��R�������{�������$f�8
�'eB��;�����Y�D}_��9��6�����LK���RIDVN�_�oq���avd)#��3�w�J�zT���w�������?����J�n�i*�E-�x)�Q���'z��f��H�u#��D�!�u�#;ZX�	���EC��R���&���>���1c� PG�F��[p)�bC����Ag�j�%
���������-Ly2����~q�����ZHk�J��hb\>c_��@wX�{D�A�>"��������\8M��'Uo��{	���c�������L���!e��5��1���@`�T+�c[����l<}����w�)�����u�1L)G���
b�Vk������}��8��3R�1��>��q^���N4�?P���9������^"���R@�2<�cOu+��6�	��t�`��`gM�3g���4`�-`����T).M�.�c�e$�S�Fq��e��.)<�*V�Z�CA�w�����/�]I�����W�";q��mA c��3��<v-��1H����b���X\M�!��o�������D�����U.��;�'�8K*W�N���O�i���?O���"���#ESEvZ�}��������F�$��L�O�u{��!�3��#t�2;g*}��7�	s,����7�{(��������5�I�'g<�J�i�,�j��OI�W�~t�P�8�Q/��|�?C�����{������������V�4���kd�����k��.����jPj��e��(��������I18���C^��G��$�Do�.�.��������:��392F�OY���q�����W���c������x3�A�}���H	�U���R�@�6
�j��kj2��x}�Tj��0)�@��Y���&P-*%G��-;|��-e��Uh�/{M=���y
�Y����]�B�Yj����q}��K�D���F6H������lJ��`�FS9`'.����`[�R7-gg�;	'���2�jeO�y���cO������ppj�zZ���HgE����� ��"_��P�!���=
_<j��|	_���})��z�v��U���L�%i�o��7���f ���[�*GE�`�z�B1q��\B��hDf+��>d������/c����Q�
@�T����{=�����������
�a��J���6���s[����07����������N�k��T�����<(������_qcEu���a�Zp8�3�
��h'J�)�I�/~�H�������rN�@���s(4�������VO�-�`����������g��O^I�\k�R����q*��7���2Qg����
��4)�f-5[��:I�f!$\zU����.��~���!�w�?�xO�����2`CEpv�~�?��r0��J�q���)I��k���L��v8pH}��oX���r�_*/����F����"�L�G�	
B��1�s���%�����3K6v�T����}1]Y �t��h6��p���?ER�G	6��E����yz*��e�������{�K�Bd��I��*uh2�;vk�)�b`M����rv�-8��b�>Nn���/Ia���C��|�m�WO�K�M������%�HI$N�%����-4�g/���~����W��!S&wlU����_]��Q)XR/�_t�7����O�dvp�Ae���rSA��7CB�o�s]����D3f��h�zt}�HK��q	{�`0��rz�l��t Rk�"_F��'��2:�_�u:12�P�}s(������@�3�H�����A��7�����r�#u5{�K|!�Q���k���Q�	�����1D�e��yz��e��V����|��J�
�i}�2:-'�x���MO_���d����$�s��!�$�pH����������T���;�)��������8i*���������+w�$����GVW����*����-���oLSI/~�����@�UJ���<:������?Q��io"p5:0uZ�bm�9T��/�^(������t_"��R���a���R4`]0l�d"�V\X���n��B��\����]���mueMt�{m$�D�������CqT�gK)h�N���mbB�K%�%�F/| v���o	<f|3�w1+*��1x�2���==��
�+}H*Co��5�����j���C������"l�M^���:��h{�<\�[#�7��v�?����������A�p�����)C2�<�Z��4W��t�Il)30l����`��
��)]�=q��*l��c�@��2X�\��E'&)~+��Y���'��z�ycnU�a
(v(0W���{�-���2�=�Y='a����v�Y���l��A$1�^�f6�?�@� �����:�&`#�K;L:`�6��b����t����t�t,V����t�K������d(�hE��LJ�N����/�N
O7�a)#x�'�Y�=a�����siGf�
"�-f+���F����UZ�� ���f�d�����;R�5������s�K�O��)��lW�"f�$Z��R���P��Df`����a'������m�W�B�����~���!��O��+C�~�A�?Wr���l%sw��jY��.W�W��x�������/F~��Q�%�����^�I�s<�?r���JLR��Le���E5��H+ZAS���M.���e�>��6(�Z����tR�;OQx��w��m������b\��a;Q�[��a�.�����<����)���	O�!���[�f�/��!��������D/.�x1�X��#��9���y���q3�����Z���c��|�,�_�7��$z31���T���k�|�!S�SD~3:"��im����-v���h�����^1)?�_�W�4w���;�Y���K��9�
A�������s�����k��d6���H`IL o�	=+J��3���6�@�v�J����6f�]��f:p�o���
�{3��-�1��u�+�M��l3���'��|���B �@G���g�l�����
�h��h���J�K>���fK? GY����c\���g�����];l��\u��������ts���.�5��*("�.�73��_U���������>7,'K�[�e���������e�CgQd�x�H�.��c����k��K����p��p�6�qy�6�tm��A[�������r�j*	�A���������Ue���HD���U�����X?�&���Z��3g��-3����9S7��<���V���#5r�a�^��J������Ww5���������dz}��G&��>Lb�tH���L!��_IE?��T�\����.Fd����q���;������6oc�n	��x$��UQ�.7�D�
��0��$�2��L�������b�!5E��4�|��7pFm�[�@���S�2�T3������.�2���5"�b�
�b�[5K?]	+_��E���w;Nr��%����f���+K��|}�p����a��R���x�3)��R����>�i�
�)���g����D'�������Y�=�����6,��_��;�f
\u�Y��(��b�;~&�����	u�����0u��5�:V�-rI	L��Dk�����o E��;�5��n�IK�)�D�@��o.��t�~U/5/�������8�-������>�:8]�������a�#u-����u��J��f��LV%�<�J��`g�3��@�3�nZRT�!
Y����B0+���SE���;cgB���'��a�Pf��E��{=Z%nv�0���+v\�{�c)Y����/	B�f��!��T]q��3N���
K��"�����j_T_�/.��
>	}x'kh�������j���8����F$�P=�=.���
8�E?��������d�{����
�H}`wn&��"H9�i;�,3ZYe���������RZz('I8��n��{L\F��~2c���M0����<�?���{�_�%U��l������2X�
S@�:U3h?!U��U��<�?}�QU�wi6`O���8�
4�K��*8�����Dp�SHM!Z��	�'V�yD��S�z��
���w��I�)����@g������6�R���@�|��W�MN��5-������<������Ko��6�����%a�$��G=�$_�!8�*��qU��)`�<s��{p��7L���t��&�����]fB���_�{+�h��`��H��B�"6I�2���N3&5eya��G.�%>�Z%��4���Vx���yQ���;P�;p�I5b��Nm
��(R����'��k>b>C�9��N���6+G~��`���$�Zx����k
a��o���
g06�XRC(�D[��*)b`��|�Wy�o�i�w�-*�i�������&�QI=Z�H8�6.�PJ����Q�k	������=�nZ�2�������;�'���Q�}�&|�f��C��Q�u7��K��O�:��%}���)�4Y�}p�	\�n0*!��&���@��J5���%���*�o���[q���k0�XR
0>o���������3����f���K�d�s����p�pb{���@�������NB�S���")����
�9J-�J�f�4���P�{Y0�KK�'�r����U�,�� �A�H!XIR���<J�$��w����U����E�	�+�����g
����U���v�_d�`�%7x,�c�����*���H��
�,Q�����R��J�������@ kH����ez�
9�x���� �
�#kM������p���	�	HP�Q�d�����}�mY(���w�LV�i_��g��q#����uq��Xv
��w'��	�����L7�+�y�'���������+Unk�:����������	j�^;/�8e���1�����}PwKsS�O|};�9�!����D#{��ZSy��R.:��+����k�n������#�S�]DV��{L��K[�v�O���	���%+�6�oSg\_Dm��/E������j�O�����V���+����bT�~�m����(�O����/)ssZ��y	��B�V�-�������Ow�nG��2�e���D���J,m����=���Ppp�x�VO}��G��t�P���{{�����r��K2��z>P��D~������AlP��w5���Q�g�f|H����BK�����PZ���������A����.k{��F�����~�TS�`�2����9�J����~�
��Q^�~6���7Rq0�7:�FS8�[�@<�3�9��]�)�M5r#6��3A��pN��q�y`"q"S��p��A�;���Z��0_�e9�kS[V�%b)��_]$�g���E,����i8�`@��w>�v_���K�J/�{���:�L���0�?�6h'��GuRp�;Q�I�d���O�tEh�e;��<8�se�\]�V���L}Q��z����j� D:�1-w-����}�^�z�y����y�q]��\	��n���@m��hRp���O���	��N��������>��n��+�Y]zM�	����%]����w����w���*Sq��yF��n1vK���pjE�LVsps�M��{�/����k����w';������cQJo�
J���ay�[��{
����x|��E|�zw��Q���Q�0�-�U������<?}����8���>�n�B�n�21��C�����5�����SNO�j�:SF���}��J������S�
���}�2�rP5�A��%q����!!���	�O$��?P�l�8/������/�9t���d4CW���P��@�!��yM�c���(
�^�����$��O��bZP���UJ���J����@F&wp��q��&�Zbk����AfC����������������i
�h�i��V����q9���_,(;�8��}�g���y�S������4,���zh�����/���8���"��
h��0z�6�������U�w�i�bd.@�{&?k�w�H7�z�X?�����$����e.����6�3��a�{S��ZL��w�+���uq[�3���4�-����P�6x����|���?�b�M�h������k%�v���l����dSj9��}M����g.K:�����
1�,�&�����U��g�{��%����}P0���&�oJu/������,�M��\���S���M�A�*��RsZ�g�;j@*�i��>�Rqd��XY�4�J[���Z�7#*%Y<��!�3�'0�C�4X�����@�:��:��6o���\�7�zn������g3��C�v�m������FX���v������G���n_�HM�0Yn��3so{���~�{��S(h�d$s"���6�@�0p��� �G�ZF9p����`��������������Ah�=�b��R��"�^����V�%�
rQ�[X����|�i<&��3{B�W\��������d.z��������,�:L�����<���a+���y�){.Z�{'�/}O�<X���{�IKZ�����LKW�@�a�����xn��X�@�@�~:��������C�DL2'��.�mxQJ��4
w�����4���i��~��V�%�CW������C�|K��1���MA����Bp�!��=I"+W�p��<BS����a1���Nf��ry��/8��/��.ON01���Z�6.�Jj�@���|�}���	=g6�2@��]?����
y��������2{j}�^".R���eD<�fB������+M��b_6�����5��w��D���a� �A�&S6=mT�XHB|�1�
Po)�Fnp^�M6�;AY�^������G�J�4���A��3����>�X[�$CyuF#�m���XT_#@�H),�QqK��q2-���Xo*�	;�jla����J��F���{{"��+�U`h�o�D~*�5
��$�>cD�m!>J#�'�R�Q�I�R����Ec�n����_��W����}</�������ox�}9Bx��8��b�9�u�FCqI�y�tp����*��Ky,��.��r��Y����]]W�����b��M�W�f�p��M�t�
�J������~���*[��G�%����!�b��t��3w�0
���j���\:K�:���k�o���"���4�����uW�[��G����v�'����f��0�h9��b���������f��c����c7S^�h���'�|v��K���:"7��R�0k�������~f���b���%I�ju�A 7�����K���T����S,��BW�
W�C������Lx�t���Gn���7�
K�����O���l|O�b3b$+n
<e�}�luQ����������l0����M{�*luZ�������@��7�'O�bSLI&$~V�V7�A����Y�����Y;��~a��������V���u��&����-�[�z�{��N���67��M����+�| �2N���%w�P��
��C�������� �>iv�	4�]6��������+FiJC����%l����|����Z��x������$���H]��;;w��]�3��o�A� '(���4��5�##�����Oo���B1�B	z]��="-Jf���?0��U����s������A3Y�ZI�73u���47I`��B�� 1��c�p�[��8��C	���$Q�~i�)��2���,��/��8���G����TeW�B
h�m^%��}�t�l��������-*80�Ly�".�	BN�2.$�|�:W�Bn�f���lo�����Vo�G�o��EiZ���)6C�
`��5��������'	�������v$M(�x�����\;����b�~l��;T	|z���c�&�� ���G����Mn1n���I��E�*B:|y�IU��~:�;��R��9F�
�\�Z� XF� r��5�|��� s�_������TS�F�i\+���_����o]���j	�u��i�~&-h� �1�x'\�g?�7|��6�w�}��z �toa:��4�|!{����
@^���~3J��.���\��s`������P)���Y8����d�R��F%EX��	����i���/��SW�y~��
�[�����)Mg��FQ�.���d'�k�>��5?�T���e����76$$mm,�CI6��J"?Bn>�9���B������
+��&����p���mZx#6|4�7n��'�l�W��z�)�
�l��W9�|/���
���!w�������i*�7u������0�b������"�Q���=�k2����M�������I�Y�3����/!'
��b�?����O�1M�K��w�:.���|��J��u�?�1G����Xx��N�d�V�M�_�@�ZB/��Q
7�����I��K�X�-y�B���[�	�����$�T������� ��d�j*zq�!���Q� �����j]��{���o~k����8XR��rN�w:�[8��A{&+�Z��P�������@	���k��dc4��w�2�X��{�Y����:��Hj_V�U�F��W�aj�$#96SW�4��<����cr�����
�+�K�����
}����Cw���Qd�}^���~�5 �hSb�ON;�+�E�t���,:o��[2��5C�md����)�I�H���Ik����p$BJ�������}�,BM�2����,�J\������|%e��5�N����q�i���AM�:N���'%�No
pxWe�[�1�}=O�>��Sk*�Z"QI~\�}mW�p@d?�Lx����������H�������rO�}��aV���$��[�k��/H�9$�e\w������Z@�"�X~��p����)I����1���3�RD�`���%���k�	S�0�""82���� �h(Df�_l�����h�~���L	�r.������1��|���8�@�]{r�C�j=���.3�<�i���(���\�bSO�SH�+4���+�ZKi�Xj�p���7ho^D��K&��x�B��5#G�C6�F��d]"�(�aC������"V����R���� =���*��z��CD@����v,q�5�fb����r��m�SD�.�`Q!h��b��*�
�����EfG��h���e��j��2��I�{���g � �r���|),��]^���F�g�x��K"���T����������El� 0%�����L������������n!ub/$����{}�A�aZ�I��.�: ��L���s�g^r�W���$�on�	Y��m����"����
��B3t��Y�ZC��B����htj��������o6�v*K��.�g)������/�� �����h@�2���pn���
r�;eO��z�Q(�t+������H�4��fu����R4B&6���FB]lF_7+����aY�|F�|���6��I9���xZwc�W��f4���E���9OA��2�����V�P�C���6���
 �R
s���|� ���)�h�TN�n*<SV2B���m��+�t���<T���y����X<}
�f�J��N�7t����P�*��[I�� x�jp"EX�;>�!������R���nx���8�����!%V��9��D�fz��NpP�s��@���Hr3_�l%���������g���5���nM�W��PI�	^q�������� ��M�f6�}r$R��kc�4��S�������m�1��u���������h|���_��r����3�'	\���`�.\��'d�����D��������7�������]7��p���X�eG3�T0�G
��p��
�@��W����%>�Id�'-��.��7����h�C�)���-�	Q����p�X������W&�(���4V�.mk��RP��H�7����m�5*o5�V������{oY��x%��f����/6���z�ZB������l���_�[������CO+^U5,�����/&�E��gCS�E�����oG
������X���S�r�8�9�B,J
��Y�h�+	����O���L�N��rJ����o��FPfo7B;
���o�rD��R��G�<J���XL�Y1�X���$,e�Z�p�PP�-*�����1�l&v������m���$������j�����q!�]?2,�	pPo�������������._m:G/��eGT.��1��I���+�$W'�!C�VR"���n�5C������2��J ���\A>`�B��Kgx���vL]��_����+[�8H����������H-)4����w?�*���|�������~��O(E��<��*~qv'��
�A���3����Oag������v���2`	w��/����C���$6��0�o����C �j{���!5����U�m�^�� C���
R�bC]��S0��������.�%�>5�Z�-[X���s��h������h
��q�O
����a��o`���Fkd��"8�
3��$�m��U��@�d2! 
))��j�,��;����
��6^v�f4+>������{P���m�?17����U���,�m3|Y����
|��G�jF5��>�V�>8��K4����`x2�t:bu�w���"��%�S�M�3��Z�q8�
�r�'�����;Z��TJ�$��n����s2���)���x^�;����W�'�AX�G������H�����/�:�����'������(��d`�h�:��TOw%H!��;�'��G8�����>j�h]��������Ea��
T�`S��zi�4��*�<d�v��
������0�kn��j~��h�
x��wQ�[G����=����R5�k�c��}&�7���E�K>�?qcWPL������i��!s}���u7�pS.�7��`�IH���Hy��M���xP���3��+� 3����1n�]
���
�&���%���1���<�#5J����8�����&3#��|3.�#�b��Q5�\�<��\���*�Cq���:�g�����X�,j��'
�R9B��Y�q5H�l
�LA�FR�w�0��T�C���9���DH6����������
m�iG/��y�c��-S>T
>����M��.F�3��q\D��x/+6(��Np��%�61s�����Xt�.�=�����bf��D19M`��7H�����������F_��W����j_�U�q[���7���\r3)n�������Z!R�Fa�8m���S~T�W~-�
M���G�&/�P�~�S��=�!�0.w��9"E��	�X�%���MVk���e@��;�}sJOdqK���pA'��9��Y�j*�EG��M�0�o�L�}�����$�G��^��Jv�,���f"��(`
����Rj�c/9!slvbu{�������\�:N
���F"�m�����X�Sv���@�xVN��|�������R�8�+`�����4>l������$E�=��k<���N�M���D_p�q���yZ�t}��f�FW�	���"�3��~K��{�9��=�tuh�\d&!r-����{*I:;v�;�����@��������j#���M%���B�Ca?�Q��
Ybx�1���� [>
�G�(���f�$�����P���y�I��r� �2���gJ���|z��a��sp�l����6�G����EZ*���Qpc��~��p�0�[���(��_UZh`"
���kV��[g�0d�"}Ib�O�9H�ve�����z.��s�%�
����v����	�� B<��[���:�����(�<S��KC��XYl����yGi~��^a��b��r�^�}��U
��R�P�����^�$��
�����h�1��������x���i>�������i1f�,�[���E@��k�n����(����~"�/�!����\�0�_6���8���EH���	a�*�����A7K9�N0����]l������)X����j����wO��������P<�*���n���AY���O�����Ut2���`~��b")n��R�d������*�����h"
m��|���ig��x�:$&;�n����C��p���+��l,�y_�Q�:��E.V�R�M����qY��3�&&�O_1	����iC�,}�7(T�������f�)MW�@I�K��9�[���
���c�"����7���Vq ���,��b�_�c�p:r��(�\���gc���F}�b��O;����U&*���E����w�>�7���<
�-H��m�����]���`�
[\�/-��������������	��Tu�~j�g�����7�A��+��+��k����i����	�M~�_���.����C}R��5������K���=:#"����1v2��T�v�F����I�om���]����.9Q���A���U���M��C>���_dn�d�-�D2������|km�1ul���� 4�^����?Q��
����T�.��z>�y����I��ws���)�H��T��RdNBH�������2.R��e�)�����*�C@�Z��Q���&-S2#I9�C������d7���b�4��j�}���������QH.��
7����]Z�P�~8�`��n5�rQ��D��]�`���d���
������i��������J�	����{���@�<���U�	P�2p�Mu
��A��m�Vk��4+���k=c�t��� M������a���di9k�\T�i�6[���2QT�r����*�����A����\����m�$"���A�?�V��kcQ#%���(��zR��z�(f�� �0iAh7g�D�n[0UH�����r	`	}d�E��������=�tt_p�����v������������xzMVr^��<+�IZd��h���KR����.K�r{I�]K�����8�8>�����&O2�u3�~r����M)���%��a��u	������s��*h=:���TG������(�q�-�8�&�H�������q�E�w�����kJ~���/�-	���+�1�����a�D_J����3:�;J�;�����~�5�u�Y���?L]�������h���W���x�k��`h�L��Qm�t�Z�:�<�������z}���";� >J����H���2������wA���K}�.���*�-�����I/�951Jwk�������z���)�����TQ�~���h	s��Y�K�f�Z6�.
CU47t�n��=L7����y��F6@(��
��(O��������6G�P3$��6�[U�x����:5��y��/9�S�$�D��g���i�gKMhv3=��N�� 8���-V�md�$���EOf�G��s���)���c�R�
!'�N1�����
�Xk&�IU��u��s�y��*�����
�a������2k������
r>���4�Uq@u���@�p]���
����JO������8�?����t~v���L��@��E[��	�!�
�C��/Fs~���L$yLOQ�C7�`V�����>��oR+C�}��[����1.��A.�E�zO@���� pw�~>����9>�\Y5o
��CR�E*?�c[�wcS�Q�1�^�i����m�Lc9n�n�i}�n�L7�Ml�{6�\gY�q�E���{$��C�9��� ��'pB�@w�Zf��{C=��w-�:E�:�Z�9��An���'h��4���4�z? �Pdc{��g�M�,R�:�e>);jg���4���a������A:`�.��Ok���OC6��������}�.v�F���������]��������`���LDJ��t���tE����P\�����N�z{t��-��[���0�hh{��m�KST~��e�y&E��'�\�����ZG)��$�)
n3?��rHO���������
/�����>����_�2
Oed��p����&b	O ��p\��#�3������LD�<�AZ��o������aeY��vn�n�`\�k�8�t�MS�:L�Ts�$���U���8���;���6��%��Y�P��nM(Q�0b���lO����{��^|��{A��]��!)l_�L�yY�9NH��b�����
��b�D8�"�����i���5{XV�T|rNf<&�E(@�b60��[8;���ATYwkay�8�T!>�X�@������
R�4^��U�
/����*���l�Hv�w �~W��(��C�{H��� \��X�pe��.O��G���M��6�o�g��R>��5a���~;�m?M�7�N ��n����m�1�4#�p0�����B?��)9����#Z�ZB���_�H��\��^kN��ib�O/��h��y�Z���!CQ�)��:����
��R���<����Z�y��~z�+��|mg#���P���Q�eis����R4:G�y���G�bn�E��4�����.���
��"���5r���1X���vFd*�RA�r��P���\���P�eW���hX�
p���?�K��/s\�95�s}�(�k6I�r��Hli�h����GE=���C��iH������IM=��+n2x�J�HKB��Ob���	�7�����)�_��47�S02%hd��5�m*�uF�(���:�_MR]����1��:�����h��T6���]�.}���%G�7y�M3�:s����?�����[Q�7�c����C�����]��������[e���Z�j:��Z��r�/�����	����~��T���[�W��]W�f �/��x�����K�.�}U�b���L�P�����]��S��$��d�z@�7_dM�DG���SU�N���]�"�E�Y�x�$�w)7g����!�q5�vl��Js�t4}�9:�K��ZJ��d��}�r�,��W�X6�0����f����Xx�C+[��Gz���2���{N���C����G0�i�|�'b�uX6(���NDG���0f��8$�Fb��5���jM9�>�� 8Qo��i�d�d����4�<���	���8,^
G�����\��sN�6�]Q�����g�goo0��#�\����w:|����L
%�U�AbF�W�(gDR8�����"cM�uU��vH���4�\�QE��T�q�H����D��T�eZ�FLr�XY5H�
.���	��p<��ha����r���v��:���������x���+
v6���W�������S���Wn��X������f�{� �P"S�
�����W@v%9h��^1��c?���cVw-��y��.5������8^��b�y
�K�@�=�h���O�k��J��;�����P�|��e8��F7TP_t�'��/O��)K�c{��Dj�a����(��
�#@VC<��z�O����0v��h��iY�SB?�-��F�g��������[#��6�+����~:wz���t`^���Z �l�����~�����FD�>����c_�OyZ���G���'��F*+��G)}|r��o�+>eXr�MWd�;�(@3���|�N��U��N�E������<x"�����2�g��Nr>����]��q ���l0�g������SL�u�]�������2�~�k`��K���F��`�x�������m#cVn+!`�H^�<��m��2"�P�"�~�U#�I
W.5JS�%�������
��~&��� $������
�6F��i+t�h�$Y���O���:�(�E�oPM�����'�$x���wu��]����,�;�c���:F\��c�gHc�w^!E �����MF�M�p
��P��4Z K�j�280�������-�_/|6��wK1�)�-��^B���V���\����1{M,�f�,�q�����<�^�3��f%����J���g�}X��\zF2�h%B|��f�1�F!��h�M�54��i��?}<O�R<�b�Ys�����w�q*7:�r�tf`)�ps�m��/Oo�4�2=H1"Io��l��`����-�X\K��-���`�j��]��@��6�d�����t�"ki�74�Ce>"��?[�	�	�V�
�:z�r��t���4k���9A�>O����Q�
p	���-=���g��sc����N��0�	���n�qk��)-���`���T{��l�V��T�Fp��
_�\R �������?�I�i�*���*4�n�3���()-01
WI)��JS_6�cw��<�\��;���T����a����f�Tg���h��2��y�����F��W����gO����I�R�_B���.�����i�-��{�6{�����"��
q�#�LW�u� ��Y<�B�Pjs�7o��!q���7SD?�;g����S^F<�#z]vC���t?��I'N/@��>����
��*���G8g���O)�aH�C�0Ob����|x����mp��`RF���(��Ir3-<R��&	+`��se���9�R�3^�3C���\]�8n��_�A�N��
&�� E7-��U���#qS"�@NK�����������l�['�����c�.����5_�t��o!H�
���P3�Z��K���$]��F�C���(x3>�����P��3Y`4(�PC�����5B��&�
��n^��'Y7m���w��'���f?��#���sx^�9�8"��D~�>+��
sl�K��eS�.����<G�����
)y|���2e����Zw�csa�A?�o`$��q����(��U��?��P��Do���T����r%����yB3j��c�\!������X�wha��t��;_�`�\	{h{>?I���F[��N(C5o��s
��b_l7�usF"��)���'nv_��g�f����=J3*ei:YVz��,�8�wg.�1��Y*�u������f��c�t���Y"`*������tGK��`��rTdx�.?���2��)�����Yz���2�Wv���K�G����d����������rQG��w�!�������-�u ��?���iR7����^]�����ZF��q���GyHYF�X��vI=���oUl'�����5�>���l�mH�67=0H|XGU�
CX�:�
�2a���v5o�;8�!PL����X�.�9'n\�2�e�zc$��6�b6������Bz:u��4w�k��
��8Q�Y��z��
�":�������/�\@�[��'f� J�R3&Z�+'�&�Ok��p��2s�S4V1���6���4�B"�����U�l]��Hx�r��b�)HxX�,L�^0i�����@�r�v�t�ZaO+B���� V[*E��kM-��Nd�oPO}�����2�z�.�!���G/���k���.C���*���*<P��C�����s4	��*�`,R�
l��g��|8��j����+7F�UW�P�a�b@�S>P�6'M����D4��\������K]IH��4�����/Cc�xc���tf`>E���9�4h��Q��(��:���sX]����.V�
@��9^������0�-����\�"�����Z��Hi��7(8�&��}�&5���Pk���K����!�79$�!\3Z�d�4���~0S���>l���D���D��Bo����n��Dy�BfU�� ���y{��$!8P�V�y�D7���bo���Q���������C0��k��f�y����kuzo��=Lr!~��0�b�����v�8[�����h=v�c	��"��@�����cb0z����2�^gX��B�T
,�E�������������QR7X��|�A��v��v�E��ns��Y?�L��[%�a�=������K�E$�8�V��N3n���?�2jA'g���~
�y�^%����6�s
���7][g���h����()Z�t�g�P�5D���B��s��K��^P����C��>���'����;5�_����]#q�����Hp�H�t��:�V~��6�����{L=3�E�O>]�R���7��WF��5�{2�����/��7���+APR��=�>���
]?���� �f�
�?��||�Z�����<�Sbi��s�u�Y�y��`��u�i$T,x
�X�Y(IM����T��vz�����\ub1��
����>���b\W�b����L_^��]��!\��P�&)����<M�yZ�J������@�����@���� �
%3�6����),!Q�w4����@�X'�����|��>wm�����x�	fz�l 
�2���w;��+�[�i ��74M����'}EH	�n&7n�B���j��\���*�*@������%�67�a���V}�r�B@�Wv�N�!�qY����b��DnMXJq���f�r|���%N��K�8�������Jo�F0��E�0&�����K�Oh"a'��d�����������?0�I�8+�-���
�l�����W��qAZh3d��T���?�K� ����j��J���4�p��d���*����������CR������J}�\��������\����{0-�"�;_���N�
���e<4o\:�ql�X^��r��v���=��Z���-U0B�!��.�	�/��5'��n�~=73Yt}����wWQ����Fm�-8��@h�Ll��O�/�4���;��L�T�~�(`�iU+�c�J�:�
��e��u:��T�VZ.�����`Z�b����=�C�=s���|�����_�%f�
k����8��mr{��4����,zm���6�T"$�����j���=��L./�a�����t6>�5���yD����B��8J�o?�4�\���%��?�d�����R�FS��������MC E��!`+K"����4���]Y=Y<��=(�&��*0�~���X�g�7��EEV�g�.�Z�$jFgA����
�!��5��w���s��������Xm����TFSZ@��*�CS$��*����}B&�y(8��?E�~!c$�@����Rb4<#���ha-�6�s'�j������X�t�a�t�_}:������b��@�h�J��}qO�#�>2��m
��]���!�-^%G~3�$�Jc�/�h�D$�������
�V������bWZ����U���k�������1pn�+�(���������$�����pc���o��Y�/)T[��UOi�8�2��k���blC������A��v��j��f�=�g����0x���0���5(�������JN�OW}���,Q�|�8�H��`<fm���pP��/v��7�g�	`�9��h,�c����C�����P�)��z�tk���it��1	H�^:��Y�[	s������z,��g�tN#W����[U��U(Y���KO�|J�<s��3p��T:�s9f5�hmF���+c���)FG���l��Wg>Bq�m��I��s��i�1�;'6=p\X"�-�N9TY�>����Om���0����i��(��/���<"a?�L��N���y^\c�H>�7�kP��������X�����Sk��G��K�#U����������
�Ao�k���u��y�K�~�K.Ra��P{�����������=��"���`x�]��Z���9�/���3�65R���������
,�|��Nu��n��8BI����Gj�'��)�{�P�)�����`vk�r�w0 ��I�������.�
�;�#XO�����v�X����a�~���������Bsk�X'��=����Z?~�OX{da
)��3���iEs��U�n����2u�����tL��V'��v9�i����#\��+������!����d���MP�0�e�9;!�����/������eEP~������G(�H-�(^����%�Z����|�{�������oMQ����������Hg��m�6�Mp"���y�l�;��]�a{wK�t���v������{��H��ac������F��ac�~�K@�DkC���@;	q��>Jp}T����l)�K�
�8��%��������W�*c���Z l9:�2��������~�#�B-�{M���i�
���g���o��(:lO���,���#_z�6���Xk��vIw�0�'�����o�(R������ ��j����%����S�.l�0����M��Q|����G\�~&�
�#~�)��y�N�9�O�Vcw������a�)�j
���=:�Z?�U
�������.]Kl�����������,[[nk�aE"��/#d����������
l���C��~���2l�Z��y�����������Y�M|�OU5��}�������u�J�z�~�3�b�\D�	���e ����YY���<���B62���j�X�_����L�kOV��W]/��l�nj�	Q3>����\�����������u�/���5��W�����f��A*j2����-z86t�)`���5t����684����
����c���������5�[n�6�k��?E������������6Y�Tn���9�,��u3��z��x�%f7J$���o�-[�U��
MUR���<+J^~_��H8�(v����Nsv_B�i�_����p�7�Y
���m#��N�Y6�DJ0���&"�J��mF6 +��V������	��5S�h[�PE9�y���V�T=��*�t)�0���Z����A
�Kw����@)V��I�{��<�����K!�<�����	�+��S	p����P������|��Y�4_5�8�=w�3J��f|��
�q�UN�`��uqv�����:���S�9�O�!i�G�f�}{��/��S����j��c:F�����7g��O�p��3��4a$���1��~�aW9p�K�R�O��e�5g|�<��?
kr�
��c�q�y����H�$������L������}$�`�qu�m��d����K�H+����{N�T*�V���)����0y
��|JDVr>��m�E���g<��h�v���BDqg��z�����+��S}8�ZZ�A�z�<��^K���a6��pJ;@O?sM�+?��w��{r8�	������������tN�fru<	�����.���R�	WpY�WJ0+7nVw���L��HbE�������@Z��3��?H��j�;�)����oT�����v
]�5���Ek����p�����r��79�r���x�E��
KS��"H�W��g(')���$���&���j��5!}�}	j��2��&Z����S������95�(��bM���+��_���Y�k���.�����|�#	K���N5��~0�*!�,Vl��/�GU����%��6<��?����)|a��M��(�W�0*?.���!�t-AA������$1�.y��v �G��f���m�����^h���
����g�ut�;�������1>��9�����q��x~,�ReU��GbR 
]�,c2lpi�r�U�`aC.'���l�R���w���)K�T���I�c\�e<�DgF�������r^���
��M��5YZ��\��M����Gmfc;����P��5���F�3������Q��O�1�"�`<;F���G�A��
	������[���{�j��#e�@�ZG���0}�*_��h�m�� I�*��813�go��<t��U��(	��	����KWo���=�F��Ef�g��q�pw0u���H7
��5���o/��-�O��pk6V�����n��u4[�V�WO\g��t�<`pen����x1���b^	z���Y�SM���A�)��).z�� �����kM���w�Wd�&�\P4F��h���X�}�	 ��W*��G *p�MUm
*���|�b�d�������g
j���~G&��%�dJ���L��V�<���y�7`�����NNi�p$}i~
��[�j!����`��Dw��7�;#wf���9��Y���)*�vK�6���U"Z�����P����Cn���7�^�=��}$0�P,��9���v�_E��,��1,m���i����.����m�T��!
����������h	=�%�uYE��ip�Q���d Y��x�����'�8���{��;�B���
lG����R>5# S~��l�$�L�/UI^n�b*����m��z���[�P`e���"VH���n1�+��t������F�l�e����z�v:OP��C�3�@�1!�'�p$����VxD2[O�d�3fh���VnUR� $��R��7������@������Y4�Q��b*�
^��_D����HY��
��^y�����pz���g���� ��+X���b�������xKi�2��{/`!0�|��g#o�9�`��~��\�#q�P,+��z�\M?{1��!$�	�e��m��F���I��
0����
�!v�����"������P����]�t#8~�
�/C&��
��jX������S[	���D)����0���a{pQ�a�7�Ge:�2j�ej#'f|l&���4�(���TY4�yx<NK�L�S����y����(��Z�)�;?�����@kD$$	{��~�QE��\n���h��F��l���	�MPn�
����^!<�p�P������K���j�.�%S�F��/�{��#��/�~��9��r��vk����(�}�j�5A���z��9�+O�A/�*#n����e���%#nn,�YV}�Fj����v������8z��K})p�]q��bR+u=/8��x�:h�X�U9#B~���hFr���p��,����'�g��������z�7��s,�7p^�;$
��;p������H�n�������B)wn�����������r��X~Y�L�`@���]=hWJ�T��tP��!�QT*�*b4��,&z}I�5D �	��=�=�����A��z��=��D��=����	�Gv���XgC�]�t�f�����^b�$	�s��J���<��������1;�~3���g�qu�W����3�a4l\nA4�Yp���X�u#�z|)�9d�y
�!C0��0O�[���H*��I��KotE��Q�^�&'��]�h��o+"��9���Vh�z���lP�t@_���jmh��6(�VyQx��P������+H6�<�)�T��C�Q�
%V�����g0�/dL{���
�pc��^�tyY�.�Y;����	�BQ�qV�Q��P�C�^��B����*����������)i��g�)��e���q�����(������\#��Z&�X����!��U�(�P?]��~V��v���;z��EK��:�����or��z/�Xa����7��x��i��gD�� �ypM�����P���)D�������m�/�'�8?FS��$�N�"����*�f��|�X����[u����n�U!��kx4���p�G�CO&�7�V�	�n�~��Pz��P�(�l��:�
ol}���\����������7�:�Le
2Q�K��v"��Z�~���]�J�8&�@�-#�d(_+f
b�s�w?
~���f��s����$�qc�J~��vk�d�m!��$�
'����4��~N�Z�bB:M��6��]�l�M�t�Q:Y��^]�����vu�@�P���e����B�di4H;�q'�3;5��������M����:�Y�[Vi��B��L,����b���0�{*�vC��s�������.��pd%%w��sqRz�W�BZs��(l�"H-�����.%LK������n����`�a�+���������f,gU���h!�T����K�8�x9���>,]:��/n5��u9�X��]-��\(QrD�$BN�G�y��v�m]��G��_Dw�Dd��i�D����j���w�����2���{��da�'M��es�q�!����	�%
��!��k5=; �'mh���A�L���\"j�I����}���!��3�=nv]c_�L"�������	����c��c�ob�'����'�*=2���\�Q�������x�T���F�S�,w;|P]p(^����z<	�[����x���Z�K�6��r)��D����j=F:�I5R���M�J�/�1�U����G�7��`=����*wP�4�=���Z`��?���V������b�i���v����bs>�M�]����r�"*Vy.�����4Jz��~|��]�xF,�����=��~�'��u�"�$?"c����Q��i:�Fb7_�d������WE�S���O�����I<����m�Ae�hr���F��
��������?����((������h�U&n���
�T�|�$��U%i��i�n���U����Z�H�CM����%k��YT�t����J��s�l/�������55z���v{�5
V�E�Zq$V����1K}�*�1\�K���@�r#6�.j��^;��.�7-�����%��__?�!�Y���
���F�(G������j�m?��R����!w�������e���E���
<)��� �����ag��7��g���|��-Y����qN��bL;����E3Qx?L��^��L�7V/���Y{��Lw�Gi���G>�����^c���/�
���5W�����"������0�%�V�5$�X�����_�n�>��x�G�D_�����
62��#K�1t��CK*��<�ub^����qV���'3�Y��}��^�yv8"T�M
u�[;S	��� ��rz��?�d�B0�m1��'��A`�����2&U��"�;����pw�y�0;g	2��BW��&��{f�����;��I*��������3C��Ur���}��U8
���Y�l~����VMr��������/7��{�=��[��7���-D��]#�p'�_B��A��
[���j��
�Gh��_��?��5����cY��$�Z!�#��������|b�����\Z�*�b6�1�fg#��d�b��j������;f�]Rc%�F|���� �P��0Hq�Yg�U]*3H�z�8�{M��q]����G� R�C����v���/H���XJ��fTE�Eg7�0j��	���m b%��c�w���nU�e��P\!��Z-���E��^��;����!J��h���a��|�(��z<�U*�[cO)�,`2"CG���1�A���\5�xY*J��ts�
����$��wc��W3o����I@�A*�87�K�/|�������y�r:��
���h��+�!Tq&�	�s����5�"7�#5/���+���~�pMhJ��8wa�=�-~9q���\���J��S�Y�b�gk���Q�}�K/P��{>���H�$���z�
�����O���5�\�t��R�l�c�x�1��6��I�i� g��I�{p�X���#PP��U�i�;��~�������e��,�I��'�_����d��8�zB*m=�����������
��#�e���G���b3ol$��>�k)�]k@�j-�0��>���M��<���y���T�5X�p���3��	�	�?0�����%��:�Q�L�
$��Pl�Z���Ww�9��+�����4�n��$�����(u��:	.x�88!/t��+\&C	�{�j�������t��8}E#�	����wJ��\�7��������Ch�P������s���U�?�4� W��'���H�(29)w����54���m�|L����������K����5$u��|���o���XvU��P������1g���t\s.������@<����a3��
6J"m5���D�7�*^�M���[��V��q����n���~c��8�L�3��.�B���������79YGk��Q�J"���Q���*�K��.�����k��~��_�+z y�L����=e4��7��sS:�;���=\���+0S�&�������:L]�.8*��k���^ �
o>��-c�F���N)u�������i����."9]*�+J���J��=��jn��-�����r��������r�����qR����y@">�p����j������i�nu��O5�j���8�����:d&�Gvv�@��D����D������2:5�@/�p�\.��b��!���([�3Nb��-�sbv�=�{���=������%J}�����20R�X������0��V����V�����V�������
�:m����0�Mc���d(feuU�h��vK2F�
h���8�/��c`3�"���m'�L��`�]��vp���C��C��V����Tb�f�:��������C���1��%��D���U��FJO���*�J�_H�,��`;��M�mLRs�`���9���GO/��D���
;���T��������� W��z�9Ce�3Yl��)J������Hr�3�-�F�H"]z5�4%�=�L�����w�v}�^���L�.�!�~=y�N��V�=���r����',���D��G<���e��##4��a�� �����}d`�������A#�����YV�?T�P��%13	��^S���s��@B4����\v��7RX�Ue�9���uQnQ		�,�>-`E������S�^j5k�@B]R{������>lC��� ��iZ8��7��Kq�a�(���S�BSP\����*��v9d�	��!#-��W�U%�
Y���ob��������]���u���nE��7��Po{�[D`��0�as��uB���#�y�Y���c�&�]����/�2T����~F�N+�0W��7yq�v��t��i���`t��d|����;'�����8������7���F�bt#�A�P~R����5a������u!���������[c���7�)����>7(����8�T�O$��&����t��sE� On��uT�!`l`��5�N����4��WzI��H��Z�96����rEm�Q9�����9+����E�i���ip����4�v)�'H������I��S�o�rr����h�y�V�h�N�������n���b��]��T�-�,��*�!��-J6FR���r�m�<2�a�_o�o�U�
�lS3�� P�����R����OX�j���)���2\���=
������1��"Uc��F��hE{PwP�D�Y�qJ�3�v/�N s����7��#��r���*��K_��s��(�I�y6�B�����LL�����b=(h�[����8`
��C
�n����X�y�m��n����g���j$��>��'����&��K�����	��X�e����]:�4�`�u����jD�+z�$��$�q���Vq�������z���&MvJ�O#���x�Z����X��*�X9s���Kf*������JHM(�Fq/h���N��j��y���o8������r+�L�(������+���I�v_.����Iz��a���K�bH`WQe��K�D��}k�����z�.-�#�TB�<I�v��v7���3�?�dI��N�0P���/�B-^4,.nZ�(8�������������m���4�&���j+���a��7�WU���[�$�6�vj��lO~
Vj6��<\���0��Q�K�����bH����b�g�R��x��G��2�T0Z�B�J��%�����>�� -��5�c$Gg3cw��EB�]i�43������v:�D�|�B?�c"����������X�A���_�E�����6Hk�yt�@�0��b��@}fC��i����+����g�dB�v�LA��?���w��s�J��&�$�p����W�t�����_��X��k;�/��"����1�S���vw����N��#�)$)��j\���I�7^��kg<^���f��%��%���oC�M��*o�B��J����0w@����>�		+U��-^+{!K?c����M���������
k	��OV��C	A�f n�X���/������=���9��I~^�5�&l~�i���r_���)������"f>���v��N�Q~�V���_�Y�	v!Tj�O�y����������i��<����1T8��t����-�T�H`i��V����F��{�����;6��6���x��Cf~"�+�H��P
�|0�0l�;�A����sT�jU:F��
�����k���8�3{�����,��O����|������(���o]H�~&;yK|^'}��wH���Y���2�	�{P���D�Iv#a�)vZ!��F�+���/�KS)b�����C�D��z_�3�e3�����!�-���Q���7��Z���%�r��O�_���.�}�G�T�����|NI�������U�-a]�K;�Z��	q���jI�L��������n@�vs�2�|�K�D�y;�&����9H�?b�E:3a�� ���S�N:cK#m��L?�9�j�1�"�����^)���H���Ot�����/
Tj������LY�[�Z�Y�M�S5���|�i���1����n���c�]x���H��5�d��>66�x���Zp5\[�o�]�X���QEQ�)��`������w�*����e��d������������������Ok��F�:��[T��p����fyz��93ez�����d��a����+L�!f�*�g��t��m����7�P����R���X�o&��A�xF��������`���fl�{)5��~� izT�b���:��=6^���y�h�k<eq|��g�p<��k���8Xp+y�����8�o0���{���6����}x��u����U���nZ�%���������d������}���*�7����07���_�J��?{��/@�YW����/�!�������^�\oO�w��
���	v��S�U24��=%M�" 4FW)(_t����XZ��G�������U!*
&���	�cu|i��h��Hj���w�uI��+���V(;��aE
����I�0Jd��`���hAQ�s��/�UI*�wi"�������s�^eP� ���o�����=��;����>�5vn�������z\W�U��]L�0�����z��
>��\���Y�YA~_�d�����}�})x�bv�85T������OMV0���{s	������:�"6(}��%N��oG���
�lQla���I�D�e��a@u=g��kw$W��N�V�J�g��y�����Di���d���n-J����s�s���8H*
�^)a`i�L^��I��a$����T����.(��U��W�;��|g�,�"���,�=
�2
���$�RC������M��$�����vG��Bi���l��O������Kr-��I_���b�L�<����N[��d�rG
w�!�q����\�6*+/�b����O�F�y[����W�G)�SW�����������r<���\O��]�;��"T3zX�@��O{������E�K���L��r���-�0\BG�����.7�y����j���S����T�-z
H�*G�
�j�����!�U���^�Y����.���X{�����|�SW/BQv�T�I�?�%h���k�"�_C%"��a
m�e�I!=�K�������=��+a���^�}�����d>l)�����U����k���1�"3�������$�&���1,
�;�P<�0��C�������@��A�i%$5l��U�$�������|X�������-][#/�����}���	1��Fn�70R�H.���C�{��y
�^0�IJ��g�fM��@��3B��(��wb��_u��)���*H94�����c�8���Q�`{��������Br���-)(�D����9�gix;���u�g�?44�1��Y��]e��C�&}���T�+$�g�iX=O�+w���c����X��?����lw�������V-[��"�N�
�Z�vT�9W�>�M�����N�������?�PQrY��������2�����A���^TL���������\�1L��]�A�$����0�.x����@�/������0$�����C��o�G���`�*�����o��
��=~�x=�Lw�=�2���� ;�j&�"�N� ��
��a</hb��	as= ���ZKN!��8��[?�#�r��O��!M��xnl�]��%%�b�6Z;��]�����~�E�Y�K�Gw����������9�b;�[��*cv�dx��$�
^��m�Mu�IK@)>�1������(�~o��{��|c&j�|@g;�ZF`�K�eI����%,�"P�dP�\����� �pe��m�tI�"����z��1����������9���N�����cy���i����CC)r.{\���I��<���m �"V���j����H�������U������T-On�	�1V�����b��5�[�_�t#�z\T��j�+��&�����A���'���r��/5�����p��Y�"��*)�X�l���.yl��/F#�inC�
����o��mY���#��x�'�����H���e�j�Q�}B]�k�N i�!�F�>�<��&u�������L7�)���mE���3Y[}������=�  >������5k�4�j0�G�4(5���fR�O���*�L����2RC<.�%�;�M��re���a�8B	�O�K���{�KJg!�S��D#
�]�Dc��v�*��+b�+G?�-p��#��>W<��#�;*���a�k�<���C��'d=]So(�)V;n�4b����6s���K
��i�+�\6�2Cr��n���m����/��6�������5;�	��{������jF�O0P��<i�k����g���290�^��!r%��~/�h�
����|y���2����b1&t�<.���'3U�V[��0]��v1M?����D�����@��xi'���UfL#$��Qb�Ju4����ME����WW��*��R��D-�F/�����B�*!�������o�������iQ�;\A���^(��2��U�:�^<�&e���w
`y�q����id~�~�J]���(=�PN���r@�ol����#A�q����g��_0�������e���}�u<�)��^�Z��<�po*��| ��48��;����bw�_-��:O�3��y��H�a��L��Mh}�z���JUbGs�}���l���)�9�w!]����������r\>��#�N
K�p{��%�l+����JD�q�<����
���O��z�i&f��X���|2Z`����br�Gf��*�1�%[��l��$���
�Q�������xs�hh���p�s��?��6'���8y1D:QB��N}N�5���������|	��=������^���.>
�V�&�C�K������*rWU����vM/����*��7�����}�YH
���Q��)��
�#� LM�I^di�#�dx}�+��O�F���*A%�1�C��n9D�������e��
�L*��Z�������E|�vT4�x&����-�WM�����d2�[���������h���xV��������������[�)b��eG��Er�S�B�[�9��d��9��^J�����A�G���7��Q�h��_.G�0�OF�-�*''X�v�F2�.kU�(�"�{3���1dm�P��!Q�g�^g-��Z��K�`������+��F��M���'Q��c38������B���z'�����I,���F����������u�t;�u5W�:�Z�Va�9�X<�*�I���V45�h���e�����M5';���\�_�<A�vgs����6$�Icwc�y���z�����$���v1���PJ2�� Y`�Ds�O,��v�bA.1Roi���d|�R���������y�ZL����DW|��8�h���W W��0zX�y�&$�����/.g@�/�+�v�<�*��-[�1Z�T41[�aOI.f,Gp�ZE��Umg�S�`Kr��81tt@�@Su�b����5��������	5R��R������C�����G�,
�C  :�0`g*\�>iw�}RrVR�-���gB�m�
}*
��wX7B�I����o���_�@���{W�s^sxC���m�&��@f��l��[�����	�tv�I�Mk�I��b��f�^���@�;V�����v4 QL-�0����In�U��1�I���s&e8�o�^��gP�G�h��O1U����������<S��:���/h�8/�?�/�+�t�������)E��k�]
h)���']��-���kM���u�WX	������)hS�<���U�)Q��8��[\�����:��-���|�j:�uGy�q����vFS��!�J w$�1���s�����Y�\��~"[k���h�18�QE���������a�������
N� ��F�q,��vk��7mB�V�w[!K���b�[���6_w����%�������!x��/x4��[�4.�U�J�[?lI����`�������<��*�l�r^m��u�����O$��Z�yP��3V]���x�S?����p��O{xuJ�����K�.�����ip�$x����,������F9������������9��e�]-���*?�/�zS��(T����(&f����.j�"q����jF�����w�gg�o8D5����*>��w�UqHx/��	-��m�����#�'�k4H��}~�?
�iD[�`Z��Pr^��,���K���wH�B���`"~��p�l��*��t�a�'Ei�E8=�Wa��	�A���1��I�BY��T�+A�������W���F�(�w���_����y�iU3�O��kd�~�����kBR�������	~n;���H{
#�.���^8������H��<�
\�u/�hl*+�u��:38�~|R'��@<7��oB�����Nmu�q�>B;����+n������0HY�;��������=Qe��TJR#|�������l1���7������u���u����{�?F�o�}b����o��N�Z(���	�{�0b��T�%�26x�{$P��O�Y0�9.�*b�(5+yI������A�9���^eX�h�;��x�-!�Bf��Vy���x-UP���Y������B���Y�@�S.+"��60��d�x���������e��Y�I�\��}v�
��+1��L��_z��i�����sW�A�^�Rx��'W���
�n�����V�V��GTOuw��?z?���e0�o�i�(|������������b=@�e���u�K����)��{��iL��&���b����D�K��q
�����f�� ����7���(S���_������?�lF����(F��!�K��<��Y^�"*�����|���e��]-�a���f�����P�r�YUf�t�V��$��E|��l�,T���������K����\u�]%^hA��xL���5��&I$j�� ���|���O�{��:�k�J���@���������A{FB����<�Z7'D�E?����d��j�@b��uA���Z)����Q���#1h
���ikL��o�W=7�f��!���*"�%&���+3�)�K`���e�"4vD���P�gc���o�"YV����{�Ra�\v4~�.w�@U+����B}zo������h��S�A�1`�KjWw$��64���*30.��,O����bD^��6B1��,X~%�f��R����^��~�J�R�)x�F���sv��V3����l�{�|\�T��vU4i�acc�5��`l��XP�����M��v���/]�|�t���tU1���N`����]Dn	$���I(�g6�����g<C?'M�%�7��w����+GA����
M>������m�0��l�2(��0����g��=�Q�L2���AN�V����uMQ/�W0�����l��e��4���f�����g<�b�UIU���Wu��.k���U��(�,M]O�(�����cZ8�~AIb��u��r4�d��G��vQ�=2^<�����}�����5z0�&~Pv��9����h�T�_��'����v0�u�����o��t,d�wFt����W�u����6@S�%
Xiw@�����=T=�T��?�<��W�)��]��8}��N��lO�o$��i]f��x�2��7.c�B���Nd��u`�\�H�����M��u��B�U��l������^:�1C,���sD�|���t��@p���J���
f�[qV�����y3��-C���m�E�;
��V�����Mk��Zz��QY@Y�����n	��G�Ys�7N��M�� ^*�"��IJ,��,�U�^���Dc�#�j�8��S�r�.�,N���E��������2����D���Oa�Ly��k_������yx.��Q[���W�G��J?�`&���m�(V�i�������������3����(�T���5��}D�.8���'��!U�Zm����US4�m�][�O��os�#F�'�j��H�9X��VP1�|�Z�R���Y������l����*����v$&=��,,�6x&�j�8����MO������u�����R�%�!��%P��|H9���D�RY��V������������CP��q���0�k�r�����$�|�&�=3t��d�S��8G�w��"����a*���Tp�+�s�,�\y�~#n�����D��2|�w���N
���&������B��B����g�v�NU~�`27���g���K����������?�m������7���n8�b���fFB��h5���#�W��f�O���N���!.���x�:�1� ���,u���\���r:2H����*q{�"��U���iv!FRQ���m����Y�#; �g$��[�~�{|�6��2��.���v����l��G
�	�`��~��Zv*����l^�BWy
I��i/��A�TM�vzC��-1q�C��0!������+��(�%�q
f��jR�h]7C!@*�,��������7(��B�x�hV����\w%j�'}z��J�NUEfv�z�+��f��h��|G����I�@n����V�_�f�ut��G1S��}�]����\xC'�������h8�^�s����a)U��5������,��u�f�/*8)x����I��zf6��G�~{3�d��`�(��"UO89r�����d�!yt��z����J��sU%�0�ndg9BW����*
|Jz�!��*���z�$)�R�Z���"��i9u� U�R��45��#��t�K>o��ui���z�`3��f������b27�:u����6Z��4MNt��'H��4q�c�6��Y��2-��=�cY�Z��.�Q9q�E�[R���z	H��"dV�y�e�l1
qxF�'��f������qcE7
1R�GC�qoPn�����X���i�YomUy��Hbq�TY��g��������[�?y���!�tV����8�yguh�5���P���9�I%z���,M����:=��@�4k@�A_N+|�xm����)U|���&D�����!�G�U`��� am'�%����[a���p�n������}
�Q�W#��0+��'���}r>�F���1��R<#%�+w�������%�0���k�������
X����T�o��L�a)�!�J������@��������I})i�L�
PT���E�v��`'{��u�����t��t���|������!F��g�j�r5�G�Yt<e�����o5��Q.��y?����r��M��j���"��To��^��v�ojl�2���h8��"�s-�q���G�[�����5z�_�����5+��C�4
nK`�����RY4H����w*C�r�k�h!�������2L��xA�:o�jc����$���6�Y�
)�"��@�L�t������������p��gNA�Y��#�)C���4�uQ�S��L�!K
�W�����N��a1�j��������#�|��f�#�$PVFr�������:uy�q��p!�>��07&���������
���8���%+�{qb����ew\�624:?�2(t�=��f��0����w^-�;�$T��_�L�[�����!���g�YK���V[��4R-��U�#��yfT��V�@�E��#�Sa����R&�H��ES|50���%��:
�����������	/#�����?'�z���H��1[�B�)���:&��5�����UR����\-��=a:�O��m���Wy4��F������|z�m����-&�]�2Os%a�����u���4�*�<GV���!���4r|%���4�wa�;P5����%y��;�,e��M��a�%���S)�4=s^0������,�����\u4;�@�Gp����:l�����
�K����/�<eY���7)��MS+]����������6���{�3V������L��A�MQ��������3�^=mH���d��4�'�&yLS����F�
j�Y�d�:S`���aO���qRU!HR�Ux;��p�eX�vYcS�ln�\,��XV��>91��4���}_'�����L�����e&�^�1F�Yy{���c���L�S�'��nU�������)����,m=
����L S����RU��i�>�}M8"�brjZ���<p����j�Z5/rj�������������I���l��Ou;Yh>6n0����L
E�*��h�cY(����������}�>s2������%��t;�q���YY&{��
���xP^�b�F>��H�X�Xoe��\���d�gN�v���	Ui��TZ$\1�nkycw4Py�*��r�>\�5��y}���� c,�5h��������9���IifW�m�
@�������{��m��?��%_@k��wPd%����'�����C�����������~�5*M�cP&�
����1��YmB2���,c�A�C��I�5x�fH��]OV}1R��7Sq�?,f������&?r�������%F5S|M�1�/�05�]�sY^�\��vf�f�{��u���p�^/>�xLO������&��6-��U�)��;���� ����l����L����o��.�����gf��y���?�D��������v8@
����eO���S~xq�3^����]C�7�Y���@�1����h8Q�o��P��1�M\��W)m��}���s���������~�q-��Q~��|n�Q+6�9��8��|�@iE���[w����|��!G���c�l��g��P�iHR��zT��am��t��3��AN��ON�v��*q�Q%'�\\����lE9y�/�)'\� B�	�H)�xbD���T7��o�9���q�e8�r�m�>h^5,�r�����S�
��Q_�i�2�"���[�j"l�$����p���#:�1v�,2��y�eYGg[�0������n��+��sT�vQ���eR�P�Vi	{�<��hM��������7"��|y��asT�uL��>v�&f��P1���X��|���7������M�8�Y�,�5�B��\G�R�
��_��g���-^���O?QL[� ���[�����yje ���K}l(O�u}�$���U*��U��>�GBX������
�%5���3�F������OXi�6���M��!�gB�DX��i~�$��ja�3�w���6�(��D��m���=9�)���2��wB�:�y-'���A
d-���5�=T���]j��j s �<eY�!WF�b�������R�X"�H2���k�j�*�����|(W��xk����
������vs�n����=�;��b���u%e!U�Iv��:??bQ���lb+�@b��M��prmg��+_!��/�2����:�h�����vE��R=�g�T�@��C��80� 6�M�����q�oCo���r�����	���R����7�{���B���$f��~�<L�7������W��������W�V��.{�����0$O����
�W��IIFnAK��a|E4����U�����������r�;���7m���\��t�5~I�Fs���bC�!�����8y�������i/>��k����<�$qj�F
"�A��#�j�W3]j�"��������e�o;"dC2B���N�
�����Y���+��bU��i��7Wp8t��ruN�l A]���
�JtK4
���`�R�k�������Z�=����|���wq�Lo��&f0{������kB���n
�X��*M�&�+��f���j���VF�����#���G(m���"��U�)�j#!�2�d���\AEY�����$B���#	�G�p�����$���4 �*����L����c
3�!iH�V\�'
l��2$n]�ipL{�m���O
����I�_���PG��B����,Z�K�Gk 
�-�",�Z�p��*n��H�1�.������\.	z��~���-�U|?�8TdyK����v��_�}t�.�������������>��G%f3�R��L����5U�"yC�k�=(���
�����py��|e�>�Op�����N�8�C��o�S�����t��g��f����WwV�-Eu��P�S6�T��.S�P�Q��lDJ�g����Q&%�4��}�7/���S���U\��b(��7��c������]��:�������u�3��]~y,H�k�6����!5�����|�"�j|h$�U��z��D��Vn�5��[e�O>���l����z@����n
���]}2�V�n���5PzX
�~��6����83�?$�@#�Z
�p��k�63n�cc��
����%m�n������|�dot����i��,�oHQ��m�����Z	��#]��9
^���
#67Alexander Korotkov
aekorotkov@gmail.com
In reply to: vignesh C (#66)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

Hi, Vignesh!

On Fri, Jun 20, 2025 at 3:42 PM vignesh C <vignesh21@gmail.com> wrote:

On Fri, 20 Jun 2025 at 05:54, Alexander Korotkov <aekorotkov@gmail.com> wrote:

On Thu, Jun 19, 2025 at 2:05 PM Hayato Kuroda (Fujitsu)
<kuroda.hayato@fujitsu.com> wrote:

Regarding assertion failure, I've found that assert in
PhysicalConfirmReceivedLocation() conflicts with restart_lsn
previously set by ReplicationSlotReserveWal(). As I can see,
ReplicationSlotReserveWal() just picks fresh XLogCtl->RedoRecPtr lsn.
So, it doesn't seems there is a guarantee that restart_lsn never goes
backward. The commit in ReplicationSlotReserveWal() even states there
is a "chance that we have to retry".

I don't see how this theory can lead to a restart_lsn of a slot going
backwards. The retry mentioned there is just a retry to reserve the
slot's position again if the required WAL is already removed. Such a
retry can only get the position later than the previous restart_lsn.

We analyzed the assertion failure happened at pg_basebackup/020_pg_receivewal,
and confirmed that restart_lsn can go backward. This meant that Assert() added
by the ca307d5 can cause crash.

Background
===========
When pg_receivewal starts the replication and it uses the replication slot, it
sets as the beginning of the segment where restart_lsn exists, as the startpoint.
E.g., if the restart_lsn of the slot is 0/B000D0, pg_receivewal requests WALs
from 0/B00000.
More detail of this behavior, see f61e1dd2 and d9bae531.

What happened here
==================
Based on above theory, walsender sent from the beginning of segment (0/B00000).
When walreceiver receives, it tried to send reply. At that time the flushed
location of WAL would be 0/B00000. walsender sets the received lsn as restart_lsn
in PhysicalConfirmReceivedLocation(). Here the restart_lsn went backward (0/B000D0->0/B00000).

The assertion failure could happen if CHECKPOINT happened at that time.
Attribute last_saved_restart_lsn of the slot was 0/B000D0, but the data.restart_lsn
was 0/B00000. It could not satisfy the assertion added in InvalidatePossiblyObsoleteSlot().

Thank you for your detailed explanation!

Note
====
1.
In this case, starting from the beginning of the segment is not a problem, because
the checkpoint process only removes WAL files from segments that precede the
restart_lsn's wal segment. The current segment (0/B00000) will not be removed,
so there is no risk of data loss or inconsistency.

2.
A similar pattern applies to pg_basebackup. Both use logic that adjusts the
requested streaming position to the start of the segment, and it replies the
received LSN as flushed.

3.
I considered the theory above, but I could not reproduce 040_standby_failover_slots_sync
because it is a timing issue. Have someone else reproduced?

We are still investigating failure caused at 040_standby_failover_slots_sync.

I didn't manage to reproduce this. But as I see from the logs [1] on
mamba that START_REPLICATION command was issued just before assert
trap. Could it be something similar to what I described in [2].
Namely:
1. ReplicationSlotReserveWal() sets restart_lsn for the slot.
2. Concurrent checkpoint flushes that restart_lsn to the disk.
3. PhysicalConfirmReceivedLocation() sets restart_lsn of the slot to
the beginning of the segment.

Here is my analysis for the 040_standby_failover_slots_sync test
failure where in physical replication slot can point to backward lsn:
In certain rare cases the restart LSN can go backwards. This scenario
can be reproduced by performing checkpoint continuously and slowing
the WAL applying. I have a patch with changes to handle this.

Here's a summary of the sequence of events:
1) Standby confirms a new LSN (0/40369C8) when primary sends some WAL contents:
After standby writes the received WAL contents in XLogWalRcvWrite, the
standby sends this lsn 0/40369C8 as the confirmed flush location. The
primary acknowledges this and updates the replication slot's
restart_lsn accordingly:
2025-06-20 14:33:21.777 IST [134998] standby1 LOG:
PhysicalConfirmReceivedLocation replication slot "sb1_slot" set
restart_lsn to 0/40369C8
2025-06-20 14:33:21.777 IST [134998] standby1 STATEMENT:
START_REPLICATION SLOT "sb1_slot" 0/3000000 TIMELINE 1
Checkpoint persists the new restart_lsn:

2) Shortly after receiving the new LSN, a checkpoint occurs which
saves this restart_lsn:
2025-06-20 14:33:21.780 IST [134913] LOG: checkpoint complete: wrote
0 buffers (0.0%), wrote 0 SLRU buffers; 0 WAL file(s) added, 0
removed, 0 recycled; write=0.001 s, sync=0.001 s, total=0.002 s; sync
files=0, longest=0.000 s, average=0.000 s; distance=0 kB, estimate=0
kB; lsn=0/4036A20, redo lsn=0/40369C8

3)Streaming replication is restarted because of primary_conninfo
change and reload
The WAL receiver process is restarted:
25-06-20 14:33:21.779 IST [134997] FATAL: terminating walreceiver
process due to administrator command

4) Standby sends an older flush pointer after restart:
Upon restart, the WAL receiver sends a flush location (0/401D448)
derived from XLogRecoveryCtl->lastReplayedEndRecPtr, which is older
than the previously confirmed restart_lsn. It is important to note
that we are sending the lastReplayedEndRecPtr which is the last
successfully replayed lsn in this case:
5-06-20 14:33:21.796 IST [135135] LOG: WalReceiverMain
LogstreamResult.Flush initialized to 0/401D448
2025-06-20 14:33:21.796 IST [135135] LOG: sending write 0/401D448
flush 0/401D448 apply 0/401D448

This is done from here:
....
/* Initialize LogstreamResult and buffers for processing messages */
LogstreamResult.Write = LogstreamResult.Flush = GetXLogReplayRecPtr(NULL);

initStringInfo(&reply_message);

/* Initialize nap wakeup times. */
now = GetCurrentTimestamp();
for (int i = 0; i < NUM_WALRCV_WAKEUPS; ++i)
WalRcvComputeNextWakeup(i, now);

/* Send initial reply/feedback messages. */
XLogWalRcvSendReply(true, false);
...

In case of step 1, we are sending the lsn of the WAL that is written,
since we have slowed down the WAL applying the replay location is
lesser and the replay location is being sent here.

5) I have added logs to detect this inconsistency:
This leads to a scenario where the standby tries to confirm a
restart_lsn older than the one currently held by the primary:
2025-06-20 14:33:21.797 IST [135136] standby1 LOG: crash scenario -
slot sb1_slot, cannot confirm a restart LSN (0/401D448) that is older
than the current one (0/40369C8)

If a checkpoint happens concurrently during this condition, it may
trigger an assertion failure on the primary due to the restart_lsn
being less than the last_saved_restart_lsn.
Currently this does not break physical replication, but I'm not sure
if the gap increases to many WAL files and if the WAL files get
deleted, how it will behave.
Attached the patch changes with which you can reproduce. Grep for
"crash scenario" in the logs. For me it occurs with every run. The
reproduced logs are attached.

This proves that the restart_lsn can go backward in cases where the
standby is slowly applying. But this has nothing to do with this
thread, I felt you can commit the assert removal patch. I will
continue the analysis further and see if there is any impact or not
and we can later add comments accordingly.

Thank you and other thread participants for the analysis!
I'd like to also ask for help with [1]. It seems that new test
triggers another bug, which I suppose was there before.

Links.
1. /messages/by-id/CAAKRu_ZCOzQpEumLFgG_+iw3FTa+hJ4SRpxzaQBYxxM_ZAzWcA@mail.gmail.com

------
Regards,
Alexander Korotkov
Supabase

#68Alexander Korotkov
aekorotkov@gmail.com
In reply to: Vitaly Davydov (#1)
1 attachment(s)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

On Fri, Jun 20, 2025 at 2:24 PM vignesh C <vignesh21@gmail.com> wrote:

On Fri, 20 Jun 2025 at 05:54, Alexander Korotkov <aekorotkov@gmail.com> wrote:

Dear Kuroda-san,

On Thu, Jun 19, 2025 at 2:05 PM Hayato Kuroda (Fujitsu)
<kuroda.hayato@fujitsu.com> wrote:

Regarding assertion failure, I've found that assert in
PhysicalConfirmReceivedLocation() conflicts with restart_lsn
previously set by ReplicationSlotReserveWal(). As I can see,
ReplicationSlotReserveWal() just picks fresh XLogCtl->RedoRecPtr lsn.
So, it doesn't seems there is a guarantee that restart_lsn never goes
backward. The commit in ReplicationSlotReserveWal() even states there
is a "chance that we have to retry".

I don't see how this theory can lead to a restart_lsn of a slot going
backwards. The retry mentioned there is just a retry to reserve the
slot's position again if the required WAL is already removed. Such a
retry can only get the position later than the previous restart_lsn.

We analyzed the assertion failure happened at pg_basebackup/020_pg_receivewal,
and confirmed that restart_lsn can go backward. This meant that Assert() added
by the ca307d5 can cause crash.

Background
===========
When pg_receivewal starts the replication and it uses the replication slot, it
sets as the beginning of the segment where restart_lsn exists, as the startpoint.
E.g., if the restart_lsn of the slot is 0/B000D0, pg_receivewal requests WALs
from 0/B00000.
More detail of this behavior, see f61e1dd2 and d9bae531.

What happened here
==================
Based on above theory, walsender sent from the beginning of segment (0/B00000).
When walreceiver receives, it tried to send reply. At that time the flushed
location of WAL would be 0/B00000. walsender sets the received lsn as restart_lsn
in PhysicalConfirmReceivedLocation(). Here the restart_lsn went backward (0/B000D0->0/B00000).

The assertion failure could happen if CHECKPOINT happened at that time.
Attribute last_saved_restart_lsn of the slot was 0/B000D0, but the data.restart_lsn
was 0/B00000. It could not satisfy the assertion added in InvalidatePossiblyObsoleteSlot().

Thank you for your detailed explanation!

Note
====
1.
In this case, starting from the beginning of the segment is not a problem, because
the checkpoint process only removes WAL files from segments that precede the
restart_lsn's wal segment. The current segment (0/B00000) will not be removed,
so there is no risk of data loss or inconsistency.

2.
A similar pattern applies to pg_basebackup. Both use logic that adjusts the
requested streaming position to the start of the segment, and it replies the
received LSN as flushed.

3.
I considered the theory above, but I could not reproduce 040_standby_failover_slots_sync
because it is a timing issue. Have someone else reproduced?

We are still investigating failure caused at 040_standby_failover_slots_sync.

I didn't manage to reproduce this. But as I see from the logs [1] on
mamba that START_REPLICATION command was issued just before assert
trap. Could it be something similar to what I described in [2].
Namely:
1. ReplicationSlotReserveWal() sets restart_lsn for the slot.
2. Concurrent checkpoint flushes that restart_lsn to the disk.
3. PhysicalConfirmReceivedLocation() sets restart_lsn of the slot to
the beginning of the segment.

Here is my analysis for the 040_standby_failover_slots_sync test
failure where the physical replication slot can point to backward lsn:
In certain rare cases the restart LSN can go backwards. This scenario
can be reproduced by performing checkpoint continuously and slowing
the WAL applying. I have a patch with changes to handle this.
Here's a summary of the sequence of events:
1) Standby confirms a new LSN (0/40369C8) when primary sends some WAL contents:
After the standby writes the received WAL contents in XLogWalRcvWrite,
the standby sends this lsn 0/40369C8 as the confirmed flush location.
The primary acknowledges this and updates the replication slot's
restart_lsn accordingly:
2025-06-20 14:33:21.777 IST [134998] standby1 LOG:
PhysicalConfirmReceivedLocation replication slot "sb1_slot" set
restart_lsn to 0/40369C8
2025-06-20 14:33:21.777 IST [134998] standby1 STATEMENT:
START_REPLICATION SLOT "sb1_slot" 0/3000000 TIMELINE 1

2) Shortly after receiving the new LSN, a checkpoint occurs which
saves this restart_lsn:
2025-06-20 14:33:21.780 IST [134913] LOG: checkpoint complete: wrote
0 buffers (0.0%), wrote 0 SLRU buffers; 0 WAL file(s) added, 0
removed, 0 recycled; write=0.001 s, sync=0.001 s, total=0.002 s; sync
files=0, longest=0.000 s, average=0.000 s; distance=0 kB, estimate=0
kB; lsn=0/4036A20, redo lsn=0/40369C8

3) Streaming replication is restarted because of primary_conninfo guc
change and reload
The WAL receiver process is restarted:
25-06-20 14:33:21.779 IST [134997] FATAL: terminating walreceiver
process due to administrator command

4) Standby sends an older flush pointer after restart:
Upon restart, the WAL receiver sends a flush location (0/401D448)
derived from XLogRecoveryCtl->lastReplayedEndRecPtr, which is older
than the previously confirmed restart_lsn. It is important to note
that we are sending the lastReplayedEndRecPtr which is the last
successfully replayed lsn in this case:
5-06-20 14:33:21.796 IST [135135] LOG: WalReceiverMain
LogstreamResult.Flush initialized to 0/401D448
2025-06-20 14:33:21.796 IST [135135] LOG: sending write 0/401D448
flush 0/401D448 apply 0/401D448

This is done from here:
....
/* Initialize LogstreamResult and buffers for processing messages */
LogstreamResult.Write = LogstreamResult.Flush = GetXLogReplayRecPtr(NULL);

initStringInfo(&reply_message);

/* Initialize nap wakeup times. */
now = GetCurrentTimestamp();
for (int i = 0; i < NUM_WALRCV_WAKEUPS; ++i)
WalRcvComputeNextWakeup(i, now);

/* Send initial reply/feedback messages. */
XLogWalRcvSendReply(true, false);
...

In case of step 1, we are sending the lsn of the WAL that is written,
since we have slowed down the WAL applying the replay location is
lesser.

5) I have added logs to detect this inconsistency:
This leads to a scenario where the standby tries to confirm a
restart_lsn older than the one currently held by the primary:
2025-06-20 14:33:21.797 IST [135136] standby1 LOG: crash scenario -
slot sb1_slot, cannot confirm a restart LSN (0/401D448) that is older
than the current one (0/40369C8)

If a checkpoint happens concurrently during this condition, it may
trigger an assertion failure on the primary due to the restart_lsn
being less than the last_saved_restart_lsn.
Currently this does not break physical replication, but I'm not sure
if the gap increases to many WAL files and if the WAL files get
deleted, how it will behave.

Attached the restart_lsn_backup_repro_v1 patch changes with which you
can reproduce the 040_standby_failover_slots_sync failure. grep for
"crash scenario - slot sb1_slot" in the logs. For me it occurs with
every run. The reproduced logs
040_standby_failover_slots_sync_publisher and
040_standby_failover_slots_sync_standby1.log are attached.

This proves that the restart_lsn can go backward in cases where the
standby is slowly applying. But this has nothing to do with this
thread, I felt you can commit the assert removal patch. I will
continue the analysis further and see if there is any impact or not on
physical replication, and we can later add comments accordingly.

I think this thread now have well-documented cases when restart_lsn
goes backward. I suppose the first thing we should do is to remove
the assert to make buildfarm stop failing on this. I've prepared a
patch with revised commit message. Then we can focus on documenting
that correctly in the code comments.

------
Regards,
Alexander Korotkov
Supabase

Attachments:

v5-0001-Remove-excess-assert-from-InvalidatePossiblyObsol.patchapplication/octet-stream; name=v5-0001-Remove-excess-assert-from-InvalidatePossiblyObsol.patchDownload
From 3b1d44983d08403328f4b42698f35a4ed1f681ca Mon Sep 17 00:00:00 2001
From: Alexander Korotkov <akorotkov@postgresql.org>
Date: Wed, 18 Jun 2025 19:34:00 +0300
Subject: [PATCH v5] Remove excess assert from InvalidatePossiblyObsoleteSlot()

ca307d5cec90 introduced keeping WAL segments by slot's last saved restart LSN.
It also added an assertion that the slot's restart LSN never goes backward.
However, situations when the restart LSN goes backward have been spotted by
buildfarm animals and investigated in the thread.

When pg_receivewal starts the replication, it sets the last replayed LSN to
the beginning of the segment, which is older than what
ReplicationSlotReserveWal() set for the slot.  When standby reconnects to
the primary, it sends the last replayed LSN, which might be older than the
last confirmed flush LSN.  In both these situations, a concurrent checkpoint
may trigger an assert trap.

Based on ideas from Vitaly Davydov <v.davydov@postgrespro.ru>,
Hayato Kuroda (Fujitsu) <kuroda.hayato@fujitsu.com>,
vignesh C <vignesh21@gmail.com>,
Amit Kapila <amit.kapila16@gmail.com>.

Reported-by: Vignesh C <vignesh21@gmail.com>
Reported-by: Tom Lane <tgl@sss.pgh.pa.us>
Discussion: https://postgr.es/m/CALDaNm3s-jpQTe1MshsvQ8GO%3DTLj233JCdkQ7uZ6pwqRVpxAdw%40mail.gmail.com
---
 src/backend/replication/slot.c | 2 --
 1 file changed, 2 deletions(-)

diff --git a/src/backend/replication/slot.c b/src/backend/replication/slot.c
index c64f020742f..c11e588d632 100644
--- a/src/backend/replication/slot.c
+++ b/src/backend/replication/slot.c
@@ -1810,8 +1810,6 @@ InvalidatePossiblyObsoleteSlot(uint32 possible_causes,
 		 */
 		SpinLockAcquire(&s->mutex);
 
-		Assert(s->data.restart_lsn >= s->last_saved_restart_lsn);
-
 		restart_lsn = s->data.restart_lsn;
 
 		/* we do nothing if the slot is already invalid */
-- 
2.39.5 (Apple Git-154)

#69vignesh C
vignesh21@gmail.com
In reply to: Alexander Korotkov (#68)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

On Mon, 23 Jun 2025 at 04:36, Alexander Korotkov <aekorotkov@gmail.com> wrote:

On Fri, Jun 20, 2025 at 2:24 PM vignesh C <vignesh21@gmail.com> wrote:

On Fri, 20 Jun 2025 at 05:54, Alexander Korotkov <aekorotkov@gmail.com> wrote:

Dear Kuroda-san,

On Thu, Jun 19, 2025 at 2:05 PM Hayato Kuroda (Fujitsu)
<kuroda.hayato@fujitsu.com> wrote:

Regarding assertion failure, I've found that assert in
PhysicalConfirmReceivedLocation() conflicts with restart_lsn
previously set by ReplicationSlotReserveWal(). As I can see,
ReplicationSlotReserveWal() just picks fresh XLogCtl->RedoRecPtr lsn.
So, it doesn't seems there is a guarantee that restart_lsn never goes
backward. The commit in ReplicationSlotReserveWal() even states there
is a "chance that we have to retry".

I don't see how this theory can lead to a restart_lsn of a slot going
backwards. The retry mentioned there is just a retry to reserve the
slot's position again if the required WAL is already removed. Such a
retry can only get the position later than the previous restart_lsn.

We analyzed the assertion failure happened at pg_basebackup/020_pg_receivewal,
and confirmed that restart_lsn can go backward. This meant that Assert() added
by the ca307d5 can cause crash.

Background
===========
When pg_receivewal starts the replication and it uses the replication slot, it
sets as the beginning of the segment where restart_lsn exists, as the startpoint.
E.g., if the restart_lsn of the slot is 0/B000D0, pg_receivewal requests WALs
from 0/B00000.
More detail of this behavior, see f61e1dd2 and d9bae531.

What happened here
==================
Based on above theory, walsender sent from the beginning of segment (0/B00000).
When walreceiver receives, it tried to send reply. At that time the flushed
location of WAL would be 0/B00000. walsender sets the received lsn as restart_lsn
in PhysicalConfirmReceivedLocation(). Here the restart_lsn went backward (0/B000D0->0/B00000).

The assertion failure could happen if CHECKPOINT happened at that time.
Attribute last_saved_restart_lsn of the slot was 0/B000D0, but the data.restart_lsn
was 0/B00000. It could not satisfy the assertion added in InvalidatePossiblyObsoleteSlot().

Thank you for your detailed explanation!

Note
====
1.
In this case, starting from the beginning of the segment is not a problem, because
the checkpoint process only removes WAL files from segments that precede the
restart_lsn's wal segment. The current segment (0/B00000) will not be removed,
so there is no risk of data loss or inconsistency.

2.
A similar pattern applies to pg_basebackup. Both use logic that adjusts the
requested streaming position to the start of the segment, and it replies the
received LSN as flushed.

3.
I considered the theory above, but I could not reproduce 040_standby_failover_slots_sync
because it is a timing issue. Have someone else reproduced?

We are still investigating failure caused at 040_standby_failover_slots_sync.

I didn't manage to reproduce this. But as I see from the logs [1] on
mamba that START_REPLICATION command was issued just before assert
trap. Could it be something similar to what I described in [2].
Namely:
1. ReplicationSlotReserveWal() sets restart_lsn for the slot.
2. Concurrent checkpoint flushes that restart_lsn to the disk.
3. PhysicalConfirmReceivedLocation() sets restart_lsn of the slot to
the beginning of the segment.

Here is my analysis for the 040_standby_failover_slots_sync test
failure where the physical replication slot can point to backward lsn:
In certain rare cases the restart LSN can go backwards. This scenario
can be reproduced by performing checkpoint continuously and slowing
the WAL applying. I have a patch with changes to handle this.
Here's a summary of the sequence of events:
1) Standby confirms a new LSN (0/40369C8) when primary sends some WAL contents:
After the standby writes the received WAL contents in XLogWalRcvWrite,
the standby sends this lsn 0/40369C8 as the confirmed flush location.
The primary acknowledges this and updates the replication slot's
restart_lsn accordingly:
2025-06-20 14:33:21.777 IST [134998] standby1 LOG:
PhysicalConfirmReceivedLocation replication slot "sb1_slot" set
restart_lsn to 0/40369C8
2025-06-20 14:33:21.777 IST [134998] standby1 STATEMENT:
START_REPLICATION SLOT "sb1_slot" 0/3000000 TIMELINE 1

2) Shortly after receiving the new LSN, a checkpoint occurs which
saves this restart_lsn:
2025-06-20 14:33:21.780 IST [134913] LOG: checkpoint complete: wrote
0 buffers (0.0%), wrote 0 SLRU buffers; 0 WAL file(s) added, 0
removed, 0 recycled; write=0.001 s, sync=0.001 s, total=0.002 s; sync
files=0, longest=0.000 s, average=0.000 s; distance=0 kB, estimate=0
kB; lsn=0/4036A20, redo lsn=0/40369C8

3) Streaming replication is restarted because of primary_conninfo guc
change and reload
The WAL receiver process is restarted:
25-06-20 14:33:21.779 IST [134997] FATAL: terminating walreceiver
process due to administrator command

4) Standby sends an older flush pointer after restart:
Upon restart, the WAL receiver sends a flush location (0/401D448)
derived from XLogRecoveryCtl->lastReplayedEndRecPtr, which is older
than the previously confirmed restart_lsn. It is important to note
that we are sending the lastReplayedEndRecPtr which is the last
successfully replayed lsn in this case:
5-06-20 14:33:21.796 IST [135135] LOG: WalReceiverMain
LogstreamResult.Flush initialized to 0/401D448
2025-06-20 14:33:21.796 IST [135135] LOG: sending write 0/401D448
flush 0/401D448 apply 0/401D448

This is done from here:
....
/* Initialize LogstreamResult and buffers for processing messages */
LogstreamResult.Write = LogstreamResult.Flush = GetXLogReplayRecPtr(NULL);

initStringInfo(&reply_message);

/* Initialize nap wakeup times. */
now = GetCurrentTimestamp();
for (int i = 0; i < NUM_WALRCV_WAKEUPS; ++i)
WalRcvComputeNextWakeup(i, now);

/* Send initial reply/feedback messages. */
XLogWalRcvSendReply(true, false);
...

In case of step 1, we are sending the lsn of the WAL that is written,
since we have slowed down the WAL applying the replay location is
lesser.

5) I have added logs to detect this inconsistency:
This leads to a scenario where the standby tries to confirm a
restart_lsn older than the one currently held by the primary:
2025-06-20 14:33:21.797 IST [135136] standby1 LOG: crash scenario -
slot sb1_slot, cannot confirm a restart LSN (0/401D448) that is older
than the current one (0/40369C8)

If a checkpoint happens concurrently during this condition, it may
trigger an assertion failure on the primary due to the restart_lsn
being less than the last_saved_restart_lsn.
Currently this does not break physical replication, but I'm not sure
if the gap increases to many WAL files and if the WAL files get
deleted, how it will behave.

Attached the restart_lsn_backup_repro_v1 patch changes with which you
can reproduce the 040_standby_failover_slots_sync failure. grep for
"crash scenario - slot sb1_slot" in the logs. For me it occurs with
every run. The reproduced logs
040_standby_failover_slots_sync_publisher and
040_standby_failover_slots_sync_standby1.log are attached.

This proves that the restart_lsn can go backward in cases where the
standby is slowly applying. But this has nothing to do with this
thread, I felt you can commit the assert removal patch. I will
continue the analysis further and see if there is any impact or not on
physical replication, and we can later add comments accordingly.

I think this thread now have well-documented cases when restart_lsn
goes backward. I suppose the first thing we should do is to remove
the assert to make buildfarm stop failing on this. I've prepared a
patch with revised commit message. Then we can focus on documenting
that correctly in the code comments.

+1 to proceed this way, one minor suggestion we can include
pg_basebackup also in the commit message as I noticed this can happen
with pg_basebackup too.

Regards,
Vignesh

#70Alexander Korotkov
aekorotkov@gmail.com
In reply to: vignesh C (#69)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

On Mon, Jun 23, 2025 at 8:04 PM vignesh C <vignesh21@gmail.com> wrote:

On Mon, 23 Jun 2025 at 04:36, Alexander Korotkov <aekorotkov@gmail.com> wrote:

On Fri, Jun 20, 2025 at 2:24 PM vignesh C <vignesh21@gmail.com> wrote:

On Fri, 20 Jun 2025 at 05:54, Alexander Korotkov <aekorotkov@gmail.com> wrote:

Dear Kuroda-san,

On Thu, Jun 19, 2025 at 2:05 PM Hayato Kuroda (Fujitsu)
<kuroda.hayato@fujitsu.com> wrote:

Regarding assertion failure, I've found that assert in
PhysicalConfirmReceivedLocation() conflicts with restart_lsn
previously set by ReplicationSlotReserveWal(). As I can see,
ReplicationSlotReserveWal() just picks fresh XLogCtl->RedoRecPtr lsn.
So, it doesn't seems there is a guarantee that restart_lsn never goes
backward. The commit in ReplicationSlotReserveWal() even states there
is a "chance that we have to retry".

I don't see how this theory can lead to a restart_lsn of a slot going
backwards. The retry mentioned there is just a retry to reserve the
slot's position again if the required WAL is already removed. Such a
retry can only get the position later than the previous restart_lsn.

We analyzed the assertion failure happened at pg_basebackup/020_pg_receivewal,
and confirmed that restart_lsn can go backward. This meant that Assert() added
by the ca307d5 can cause crash.

Background
===========
When pg_receivewal starts the replication and it uses the replication slot, it
sets as the beginning of the segment where restart_lsn exists, as the startpoint.
E.g., if the restart_lsn of the slot is 0/B000D0, pg_receivewal requests WALs
from 0/B00000.
More detail of this behavior, see f61e1dd2 and d9bae531.

What happened here
==================
Based on above theory, walsender sent from the beginning of segment (0/B00000).
When walreceiver receives, it tried to send reply. At that time the flushed
location of WAL would be 0/B00000. walsender sets the received lsn as restart_lsn
in PhysicalConfirmReceivedLocation(). Here the restart_lsn went backward (0/B000D0->0/B00000).

The assertion failure could happen if CHECKPOINT happened at that time.
Attribute last_saved_restart_lsn of the slot was 0/B000D0, but the data.restart_lsn
was 0/B00000. It could not satisfy the assertion added in InvalidatePossiblyObsoleteSlot().

Thank you for your detailed explanation!

Note
====
1.
In this case, starting from the beginning of the segment is not a problem, because
the checkpoint process only removes WAL files from segments that precede the
restart_lsn's wal segment. The current segment (0/B00000) will not be removed,
so there is no risk of data loss or inconsistency.

2.
A similar pattern applies to pg_basebackup. Both use logic that adjusts the
requested streaming position to the start of the segment, and it replies the
received LSN as flushed.

3.
I considered the theory above, but I could not reproduce 040_standby_failover_slots_sync
because it is a timing issue. Have someone else reproduced?

We are still investigating failure caused at 040_standby_failover_slots_sync.

I didn't manage to reproduce this. But as I see from the logs [1] on
mamba that START_REPLICATION command was issued just before assert
trap. Could it be something similar to what I described in [2].
Namely:
1. ReplicationSlotReserveWal() sets restart_lsn for the slot.
2. Concurrent checkpoint flushes that restart_lsn to the disk.
3. PhysicalConfirmReceivedLocation() sets restart_lsn of the slot to
the beginning of the segment.

Here is my analysis for the 040_standby_failover_slots_sync test
failure where the physical replication slot can point to backward lsn:
In certain rare cases the restart LSN can go backwards. This scenario
can be reproduced by performing checkpoint continuously and slowing
the WAL applying. I have a patch with changes to handle this.
Here's a summary of the sequence of events:
1) Standby confirms a new LSN (0/40369C8) when primary sends some WAL contents:
After the standby writes the received WAL contents in XLogWalRcvWrite,
the standby sends this lsn 0/40369C8 as the confirmed flush location.
The primary acknowledges this and updates the replication slot's
restart_lsn accordingly:
2025-06-20 14:33:21.777 IST [134998] standby1 LOG:
PhysicalConfirmReceivedLocation replication slot "sb1_slot" set
restart_lsn to 0/40369C8
2025-06-20 14:33:21.777 IST [134998] standby1 STATEMENT:
START_REPLICATION SLOT "sb1_slot" 0/3000000 TIMELINE 1

2) Shortly after receiving the new LSN, a checkpoint occurs which
saves this restart_lsn:
2025-06-20 14:33:21.780 IST [134913] LOG: checkpoint complete: wrote
0 buffers (0.0%), wrote 0 SLRU buffers; 0 WAL file(s) added, 0
removed, 0 recycled; write=0.001 s, sync=0.001 s, total=0.002 s; sync
files=0, longest=0.000 s, average=0.000 s; distance=0 kB, estimate=0
kB; lsn=0/4036A20, redo lsn=0/40369C8

3) Streaming replication is restarted because of primary_conninfo guc
change and reload
The WAL receiver process is restarted:
25-06-20 14:33:21.779 IST [134997] FATAL: terminating walreceiver
process due to administrator command

4) Standby sends an older flush pointer after restart:
Upon restart, the WAL receiver sends a flush location (0/401D448)
derived from XLogRecoveryCtl->lastReplayedEndRecPtr, which is older
than the previously confirmed restart_lsn. It is important to note
that we are sending the lastReplayedEndRecPtr which is the last
successfully replayed lsn in this case:
5-06-20 14:33:21.796 IST [135135] LOG: WalReceiverMain
LogstreamResult.Flush initialized to 0/401D448
2025-06-20 14:33:21.796 IST [135135] LOG: sending write 0/401D448
flush 0/401D448 apply 0/401D448

This is done from here:
....
/* Initialize LogstreamResult and buffers for processing messages */
LogstreamResult.Write = LogstreamResult.Flush = GetXLogReplayRecPtr(NULL);

initStringInfo(&reply_message);

/* Initialize nap wakeup times. */
now = GetCurrentTimestamp();
for (int i = 0; i < NUM_WALRCV_WAKEUPS; ++i)
WalRcvComputeNextWakeup(i, now);

/* Send initial reply/feedback messages. */
XLogWalRcvSendReply(true, false);
...

In case of step 1, we are sending the lsn of the WAL that is written,
since we have slowed down the WAL applying the replay location is
lesser.

5) I have added logs to detect this inconsistency:
This leads to a scenario where the standby tries to confirm a
restart_lsn older than the one currently held by the primary:
2025-06-20 14:33:21.797 IST [135136] standby1 LOG: crash scenario -
slot sb1_slot, cannot confirm a restart LSN (0/401D448) that is older
than the current one (0/40369C8)

If a checkpoint happens concurrently during this condition, it may
trigger an assertion failure on the primary due to the restart_lsn
being less than the last_saved_restart_lsn.
Currently this does not break physical replication, but I'm not sure
if the gap increases to many WAL files and if the WAL files get
deleted, how it will behave.

Attached the restart_lsn_backup_repro_v1 patch changes with which you
can reproduce the 040_standby_failover_slots_sync failure. grep for
"crash scenario - slot sb1_slot" in the logs. For me it occurs with
every run. The reproduced logs
040_standby_failover_slots_sync_publisher and
040_standby_failover_slots_sync_standby1.log are attached.

This proves that the restart_lsn can go backward in cases where the
standby is slowly applying. But this has nothing to do with this
thread, I felt you can commit the assert removal patch. I will
continue the analysis further and see if there is any impact or not on
physical replication, and we can later add comments accordingly.

I think this thread now have well-documented cases when restart_lsn
goes backward. I suppose the first thing we should do is to remove
the assert to make buildfarm stop failing on this. I've prepared a
patch with revised commit message. Then we can focus on documenting
that correctly in the code comments.

+1 to proceed this way, one minor suggestion we can include
pg_basebackup also in the commit message as I noticed this can happen
with pg_basebackup too.

Thank you! Pushed including your suggestion to mention pg_basebackup.

------
Regards,
Alexander Korotkov
Supabase

#71Zhijie Hou (Fujitsu)
houzj.fnst@fujitsu.com
In reply to: Alexander Korotkov (#70)
RE: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

Hi,

After commit ca307d5, I noticed another crash when testing
some other logical replication features.

The server with max_replication_slots set to 0 would crash when executing CHECKPOINT.

TRAP: failed Assert("ReplicationSlotCtl != NULL"), File: "slot.c", Line: 1162, PID: 577315
postgres: checkpointer (ExceptionalCondition+0x9e)[0xc046cb]
postgres: checkpointer (ReplicationSlotsComputeRequiredLSN+0x30)[0x99697f]
postgres: checkpointer (CheckPointReplicationSlots+0x191)[0x997dc1]
postgres: checkpointer [0x597b1b]
postgres: checkpointer (CreateCheckPoint+0x6d1)[0x59729e]
postgres: checkpointer (CheckpointerMain+0x559)[0x93ee79]
postgres: checkpointer (postmaster_child_launch+0x15f)[0x940311]
postgres: checkpointer [0x9468b0]
postgres: checkpointer (PostmasterMain+0x1258)[0x9434f8]
postgres: checkpointer (main+0x2fe)[0x7f5f9c]
/lib64/libc.so.6(__libc_start_main+0xe5)[0x7f7585f81d85]
postgres: checkpointer (_start+0x2e)[0x4958ee]

I think it is trying to access the replication slots when the shared memory
for them was not allocated.

Best Regards,
Hou zj

#72Dilip Kumar
dilipbalaut@gmail.com
In reply to: Zhijie Hou (Fujitsu) (#71)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

On Wed, Jun 25, 2025 at 10:57 AM Zhijie Hou (Fujitsu)
<houzj.fnst@fujitsu.com> wrote:

Hi,

After commit ca307d5, I noticed another crash when testing
some other logical replication features.

The server with max_replication_slots set to 0 would crash when executing CHECKPOINT.

TRAP: failed Assert("ReplicationSlotCtl != NULL"), File: "slot.c", Line: 1162, PID: 577315
postgres: checkpointer (ExceptionalCondition+0x9e)[0xc046cb]
postgres: checkpointer (ReplicationSlotsComputeRequiredLSN+0x30)[0x99697f]
postgres: checkpointer (CheckPointReplicationSlots+0x191)[0x997dc1]
postgres: checkpointer [0x597b1b]
postgres: checkpointer (CreateCheckPoint+0x6d1)[0x59729e]
postgres: checkpointer (CheckpointerMain+0x559)[0x93ee79]
postgres: checkpointer (postmaster_child_launch+0x15f)[0x940311]
postgres: checkpointer [0x9468b0]
postgres: checkpointer (PostmasterMain+0x1258)[0x9434f8]
postgres: checkpointer (main+0x2fe)[0x7f5f9c]
/lib64/libc.so.6(__libc_start_main+0xe5)[0x7f7585f81d85]
postgres: checkpointer (_start+0x2e)[0x4958ee]

I think it is trying to access the replication slots when the shared memory
for them was not allocated.

I do not understand why CheckPointReplicationSlots() calls
ReplicationSlotsComputeRequiredLSN() unconditionally, shouldn't this
be called under the check[1]--- a/src/backend/replication/slot.c +++ b/src/backend/replication/slot.c, If not then instead of asserting
Assert("ReplicationSlotCtl != NULL"), this should just return if
ReplicationSlotCtl is NULL, isn't it, because ReplicationSlotCtl is
not allocated if max_replication_slots is 0.

[1]: --- a/src/backend/replication/slot.c +++ b/src/backend/replication/slot.c

--- a/src/backend/replication/slot.c
+++ b/src/backend/replication/slot.c
@@ -2131,7 +2131,8 @@ CheckPointReplicationSlots(bool is_shutdown)
         * Recompute the required LSN as SaveSlotToPath() updated
         * last_saved_restart_lsn for slots.
         */
-       ReplicationSlotsComputeRequiredLSN();
+       if (max_replication_slots > 0)
+               ReplicationSlotsComputeRequiredLSN();
 }

--
Regards,
Dilip Kumar
Google

#73Hayato Kuroda (Fujitsu)
kuroda.hayato@fujitsu.com
In reply to: Dilip Kumar (#72)
1 attachment(s)
RE: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

Dear Dilip,

Another idea is to call ReplicationSlotsComputeRequiredLSN() when at least one
of the restart_lsn is updated, like attached. I feel this could reduce the computation
bit more.

Best regards,
Hayato Kuroda
FUJITSU LIMITED

Attachments:

tmp.diffsapplication/octet-stream; name=tmp.diffsDownload
diff --git a/src/backend/replication/slot.c b/src/backend/replication/slot.c
index c11e588d632..6d342dc40f1 100644
--- a/src/backend/replication/slot.c
+++ b/src/backend/replication/slot.c
@@ -2079,6 +2079,7 @@ void
 CheckPointReplicationSlots(bool is_shutdown)
 {
 	int			i;
+	bool		updated = false;
 
 	elog(DEBUG1, "performing replication slot checkpoint");
 
@@ -2119,6 +2120,9 @@ CheckPointReplicationSlots(bool is_shutdown)
 			{
 				s->just_dirtied = true;
 				s->dirty = true;
+
+				if (!updated)
+					updated = true;
 			}
 			SpinLockRelease(&s->mutex);
 		}
@@ -2131,7 +2135,8 @@ CheckPointReplicationSlots(bool is_shutdown)
 	 * Recompute the required LSN as SaveSlotToPath() updated
 	 * last_saved_restart_lsn for slots.
 	 */
-	ReplicationSlotsComputeRequiredLSN();
+	if (updated)
+		ReplicationSlotsComputeRequiredLSN();
 }
 
 /*
#74Dilip Kumar
dilipbalaut@gmail.com
In reply to: Hayato Kuroda (Fujitsu) (#73)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

On Wed, Jun 25, 2025 at 1:18 PM Hayato Kuroda (Fujitsu)
<kuroda.hayato@fujitsu.com> wrote:

Dear Dilip,

Another idea is to call ReplicationSlotsComputeRequiredLSN() when at least one
of the restart_lsn is updated, like attached. I feel this could reduce the computation
bit more.

Right, that makes sense, if there is nothing updated on disk then we
can avoid computing this.

--
Regards,
Dilip Kumar
Google

#75Alexander Korotkov
aekorotkov@gmail.com
In reply to: Dilip Kumar (#74)
1 attachment(s)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

On Wed, Jun 25, 2025 at 11:25 AM Dilip Kumar <dilipbalaut@gmail.com> wrote:

On Wed, Jun 25, 2025 at 1:18 PM Hayato Kuroda (Fujitsu)
<kuroda.hayato@fujitsu.com> wrote:

Another idea is to call ReplicationSlotsComputeRequiredLSN() when at least one
of the restart_lsn is updated, like attached. I feel this could reduce the computation
bit more.

Right, that makes sense, if there is nothing updated on disk then we
can avoid computing this.

Good idea. But I think we should associate the "updated" flag
directly to the fact that one slot (no matter logical or physical)
changed its last_saved_restart_lsn. See the attached patch. I'm
going to push it if no objections.

------
Regards,
Alexander Korotkov
Supabase

Attachments:

v1-0001-Fix-CheckPointReplicationSlots-with-max_replicati.patchapplication/octet-stream; name=v1-0001-Fix-CheckPointReplicationSlots-with-max_replicati.patchDownload
From 0198d7fb73f1d19ba6ae6a004204a1737affe742 Mon Sep 17 00:00:00 2001
From: Alexander Korotkov <akorotkov@postgresql.org>
Date: Thu, 26 Jun 2025 00:32:38 +0300
Subject: [PATCH v1] Fix CheckPointReplicationSlots() with
 max_replication_slots == 0

ca307d5cec90 made CheckPointReplicationSlots() unconditionally call
ReplicationSlotsComputeRequiredLSN().  It causes an assertion trap when
max_replication_slots equals 0.  This commit makes
CheckPointReplicationSlots() call ReplicationSlotsComputeRequiredLSN() only
when at least one slot gets its last_saved_restart_lsn updated.  That avoids
an assert trap and also saves some cycles when no one slot has
last_saved_restart_lsn updated.

Based on ideas from Dilip Kumar <dilipbalaut@gmail.com> and
Hayato Kuroda <kuroda.hayato@fujitsu.com>.

Reported-by: Zhijie Hou <houzj.fnst@fujitsu.com>
Discussion: https://postgr.es/m/OS0PR01MB5716BB506AF934376FF3A8BB947BA%40OS0PR01MB5716.jpnprd01.prod.outlook.com
---
 src/backend/replication/slot.c | 15 ++++++++++++---
 1 file changed, 12 insertions(+), 3 deletions(-)

diff --git a/src/backend/replication/slot.c b/src/backend/replication/slot.c
index c11e588d632..30177388508 100644
--- a/src/backend/replication/slot.c
+++ b/src/backend/replication/slot.c
@@ -2079,6 +2079,7 @@ void
 CheckPointReplicationSlots(bool is_shutdown)
 {
 	int			i;
+	bool		last_saved_restart_lsn_updated = false;
 
 	elog(DEBUG1, "performing replication slot checkpoint");
 
@@ -2123,15 +2124,23 @@ CheckPointReplicationSlots(bool is_shutdown)
 			SpinLockRelease(&s->mutex);
 		}
 
+		/*
+		 * Track if we're going to update slot's last_saved_restart_lsn.
+		 * We need this to know if we need to recompute the required LSN.
+		 */
+		if (s->last_saved_restart_lsn != s->data.restart_lsn)
+			last_saved_restart_lsn_updated = true;
+
 		SaveSlotToPath(s, path, LOG);
 	}
 	LWLockRelease(ReplicationSlotAllocationLock);
 
 	/*
-	 * Recompute the required LSN as SaveSlotToPath() updated
-	 * last_saved_restart_lsn for slots.
+	 * Recompute the required LSN if SaveSlotToPath() updated
+	 * last_saved_restart_lsn for any slot.
 	 */
-	ReplicationSlotsComputeRequiredLSN();
+	if (last_saved_restart_lsn_updated)
+		ReplicationSlotsComputeRequiredLSN();
 }
 
 /*
-- 
2.39.5 (Apple Git-154)

#76Hayato Kuroda (Fujitsu)
kuroda.hayato@fujitsu.com
In reply to: Alexander Korotkov (#75)
RE: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

Dear Alexander,

Good idea. But I think we should associate the "updated" flag
directly to the fact that one slot (no matter logical or physical)
changed its last_saved_restart_lsn. See the attached patch. I'm
going to push it if no objections.

+		/*
+		 * Track if we're going to update slot's last_saved_restart_lsn.
+		 * We need this to know if we need to recompute the required LSN.
+		 */
+		if (s->last_saved_restart_lsn != s->data.restart_lsn)
+			last_saved_restart_lsn_updated = true;

I feel no need to set to true if last_saved_restart_lsn_updated is already true.
Other than that it's OK for me.

Best regards,
Hayato Kuroda
FUJITSU LIMITED

#77Alexander Korotkov
aekorotkov@gmail.com
In reply to: Hayato Kuroda (Fujitsu) (#76)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

Dear Kuroda-san,

On Thu, Jun 26, 2025 at 6:46 AM Hayato Kuroda (Fujitsu)
<kuroda.hayato@fujitsu.com> wrote:

Dear Alexander,

Good idea. But I think we should associate the "updated" flag
directly to the fact that one slot (no matter logical or physical)
changed its last_saved_restart_lsn. See the attached patch. I'm
going to push it if no objections.

+               /*
+                * Track if we're going to update slot's last_saved_restart_lsn.
+                * We need this to know if we need to recompute the required LSN.
+                */
+               if (s->last_saved_restart_lsn != s->data.restart_lsn)
+                       last_saved_restart_lsn_updated = true;

I feel no need to set to true if last_saved_restart_lsn_updated is already true.
Other than that it's OK for me.

Thank you for your feedback.

Regarding last_saved_restart_lsn_updated, I think the opposite. I
think we should check if last_saved_restart_lsn_updated is set already
only if it could promise us some economy of resources. In our case
the main check only compares two fields of slot. And that fields are
to be accessed anyway. So, we are not going to save any RAM accesses.
Therefore, checking for last_saved_restart_lsn_updated seems like
unnecessary code complication (and I don't see we're doing that in
other places). So, I'm going to push this patch "as is".

------
Regards,
Alexander Korotkov
Supabase

#78Hayato Kuroda (Fujitsu)
kuroda.hayato@fujitsu.com
In reply to: Alexander Korotkov (#77)
RE: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

Dear Alexander,

Regarding last_saved_restart_lsn_updated, I think the opposite. I
think we should check if last_saved_restart_lsn_updated is set already
only if it could promise us some economy of resources. In our case
the main check only compares two fields of slot. And that fields are
to be accessed anyway. So, we are not going to save any RAM accesses.
Therefore, checking for last_saved_restart_lsn_updated seems like
unnecessary code complication (and I don't see we're doing that in
other places). So, I'm going to push this patch "as is".

To clarify: I have no objections. Thanks for giving the knowledge.

Best regards,
Hayato Kuroda
FUJITSU LIMITED

#79Dilip Kumar
dilipbalaut@gmail.com
In reply to: Alexander Korotkov (#75)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

On Thu, Jun 26, 2025 at 3:20 AM Alexander Korotkov <aekorotkov@gmail.com> wrote:

On Wed, Jun 25, 2025 at 11:25 AM Dilip Kumar <dilipbalaut@gmail.com> wrote:

On Wed, Jun 25, 2025 at 1:18 PM Hayato Kuroda (Fujitsu)
<kuroda.hayato@fujitsu.com> wrote:

Another idea is to call ReplicationSlotsComputeRequiredLSN() when at least one
of the restart_lsn is updated, like attached. I feel this could reduce the computation
bit more.

Right, that makes sense, if there is nothing updated on disk then we
can avoid computing this.

Good idea. But I think we should associate the "updated" flag
directly to the fact that one slot (no matter logical or physical)
changed its last_saved_restart_lsn. See the attached patch. I'm
going to push it if no objections.

Looks good to me.

--
Regards,
Dilip Kumar
Google

#80Hayato Kuroda (Fujitsu)
kuroda.hayato@fujitsu.com
In reply to: Amit Kapila (#65)
1 attachment(s)
RE: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

Dear hackers,

Thanks everyone who are working on the bug. IIUC the remained task is
to add code comments for avoiding the same mistake again described here:

Sounds reasonable. As per analysis till now, it seems removal of new
assert is correct and we just need to figure out the reason in all
failure cases as to why the physical slot's restart_lsn goes backward,
and then add a comment somewhere to ensure that we don't repeat a
similar mistake in the future.

I've wrote a draft for that. How do you think?

Best regards,
Hayato Kuroda
FUJITSU LIMITED

Attachments:

0001-Update-comment-for-last_saved_restart_lsn.patchapplication/octet-stream; name=0001-Update-comment-for-last_saved_restart_lsn.patchDownload
From c8793bdf8e204f8224deae9068261ceb2a048a18 Mon Sep 17 00:00:00 2001
From: Hayato Kuroda <kuroda.hayato@fujitsu.com>
Date: Sun, 29 Jun 2025 15:19:29 +0900
Subject: [PATCH] Update comment for last_saved_restart_lsn

---
 src/include/replication/slot.h | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)

diff --git a/src/include/replication/slot.h b/src/include/replication/slot.h
index ffacba9d2ae..4481a4d0068 100644
--- a/src/include/replication/slot.h
+++ b/src/include/replication/slot.h
@@ -220,6 +220,25 @@ typedef struct ReplicationSlot
 	 * Latest restart_lsn that has been flushed to disk. For persistent slots
 	 * the flushed LSN should be taken into account when calculating the
 	 * oldest LSN for WAL segments removal.
+	 *
+	 * We cannot assume that restart_lsn will always move forward, i.e., that
+	 * the previously flushed restart_lsn is always behind data.restart_lsn. In
+	 * the case of streaming replication with a physical slot, the restart_lsn
+	 * can be updated based on the flushed WAL position reported by the
+	 * walreceiver.
+	 *
+	 * However, this type of replication allows duplicate WAL records to be
+	 * received and overwritten. If the walreceiver receives older WAL records
+	 * and then reports them as flushed to the walsender, the restart_lsn may
+	 * appear to move backward.
+	 *
+	 * This behavior typically occurs at the beginning of replication. One
+	 * reason is that streaming replication always starts at the beginning of a
+	 * segment. If the current restart_lsn is in the middle of that segment, it
+	 * may be updated to an earlier LSN. Another reason is that the walreceiver
+	 * chooses its startpoint based on the replayed LSN. Some records might
+	 * have been received but not yet applied; in such cases, they will be
+	 * received again.
 	 */
 	XLogRecPtr	last_saved_restart_lsn;
 
-- 
2.47.1

#81vignesh C
vignesh21@gmail.com
In reply to: Hayato Kuroda (Fujitsu) (#80)
3 attachment(s)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

On Sun, 29 Jun 2025 at 11:52, Hayato Kuroda (Fujitsu)
<kuroda.hayato@fujitsu.com> wrote:

Dear hackers,

Thanks everyone who are working on the bug. IIUC the remained task is
to add code comments for avoiding the same mistake again described here:

Sounds reasonable. As per analysis till now, it seems removal of new
assert is correct and we just need to figure out the reason in all
failure cases as to why the physical slot's restart_lsn goes backward,
and then add a comment somewhere to ensure that we don't repeat a
similar mistake in the future.

I've wrote a draft for that. How do you think?

I analyzed a scenario involving physical replication where the
restart_lsn appears to go backward by fewer files:
In my case, current restart_lsn = 0/A721E68, which corresponds to a
WAL record in the file 00000001000000000000000A. However, the recovery
process is progressing slowly and is currently at 0/3058078.
Now when the primary_conninfo is changed the walsender/walreceiver
process will be restarted. As a result, the standby starts requesting
WAL streaming from 0/3058078 the last applied wal lsn, which is in the
file 000000010000000000000003.

Since this WAL segment (000000010000000000000003) has already been
removed due to the restart_lsn being far ahead, the primary throws an
error saying WAL segment is removed. Even though the apply pointer is
at 0/3058078 (the record currently being applied), the standby already
has WAL segments up to 0/A721E68 written and available locally. So,
despite the walsender process failing to start due to missing
segments, the recovery process on the standby continues applying WAL
up to 0/A721E68 using the locally available files (including
00000001000000000000000A). Once all local WAL has been applied, the
standby will attempt to start streaming again—this time using the
latest WAL record (in my case, 0/A74000). Since this record still
exists on the primary, the walsender process starts successfully, and
physical replication resumes normally.

This confirms that even in physical replication, a backward-moving
restart_lsn does not cause issues as the standby retains the necessary
WAL locally and can catch up without requiring removed segments from
the primary.

I was able to reproduce this scenario using the
physical_replication_restart_lsn_backward patch attached, here I have
changed to increase the checkpoint to happen frequently and slowed the
recovery process to apply the wal records with delays. For me I was
able to reproduce this on every run. The logs for the same are
attached in the logs.zip file and test used to reproduce this is
available at test_restart_lsn_backward.zip file:

Important log information from the attached logs:
Restart_lsn has moved to 0/A6E8000 in the primary node:
2025-07-02 22:34:44.563 IST walsender[330205] standby1 LOG:
PhysicalConfirmReceivedLocation replication slot "sb1_slot" set
restart_lsn to 0/A6E8000
2025-07-02 22:34:44.563 IST walsender[330205] standby1 STATEMENT:
START_REPLICATION SLOT "sb1_slot" 0/3000000 TIMELINE 1

When the walsender is restarted, it will request a older WAL which has
been removed and throw an error:
2025-07-02 22:34:44.577 IST walsender[330428] standby1 STATEMENT:
START_REPLICATION SLOT "sb1_slot" 0/3000000 TIMELINE 1
2025-07-02 22:34:44.577 IST walsender[330428] standby1 ERROR:
requested WAL segment 000000010000000000000003 has already been
removed

Standby node has written WAL upto 0/A6E8000:
2025-07-02 22:34:44.563 IST walreceiver[330204] LOG: XLogWalRcvFlush
LogstreamResult.Flush initialized to 0/A6E8000
2025-07-02 22:34:44.563 IST walreceiver[330204] LOG: sending write
0/A6E8000 flush 0/A6E8000 apply 0/

Walreceiver process terminated:
2025-07-02 22:34:44.564 IST walreceiver[330204] FATAL: terminating
walreceiver process due to administrator command

Walreceiver requests wal from 000000010000000000000003 WAL file which
is removed:
2025-07-02 22:34:44.577 IST walreceiver[330427] LOG: started
streaming WAL from primary at 0/3000000 on timeline 1
2025-07-02 22:34:44.577 IST walreceiver[330427] LOG: WalReceiverMain
LogstreamResult.Flush initialized to 0/3047958
2025-07-02 22:34:44.577 IST walreceiver[330427] LOG: sending write
0/3047958 flush 0/3047958 apply 0/3047958
2025-07-02 22:34:44.577 IST walreceiver[330427] FATAL: could not
receive data from WAL stream: ERROR: requested WAL segment
000000010000000000000003 has already been removed

Even though the WAL file is removed there is no issue, recovery
process applies the WAL from locally available WAL file:
2025-07-02 22:34:44.578 IST startup[330195] LOG: Applied wal record
end rec 0/3047990, read rec 0/3047958
2025-07-02 22:34:44.580 IST checkpointer[330193] LOG: recovery
restart point at 0/3047938

Once all the available WAL's are applied the walsender is started
again and replication proceeds smoothly:
2025-07-02 22:35:15.002 IST walsender[330922] standby1 LOG: received
replication command: START_REPLICATION SLOT "sb1_slot" 0/A000000
TIMELINE 1
2025-07-02 22:35:15.002 IST walsender[330922] standby1 STATEMENT:
START_REPLICATION SLOT "sb1_slot" 0/A000000 TIMELINE 1

I'm ok with adding the comments.

Regards,
Vignesh

Attachments:

physical_replication_restart_lsn_backward.patchapplication/octet-stream; name=physical_replication_restart_lsn_backward.patchDownload
diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index 47ffc0a2307..6e325db45d4 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -6836,6 +6836,7 @@ ShutdownXLOG(int code, Datum arg)
 static void
 LogCheckpointStart(int flags, bool restartpoint)
 {
+	#if 0
 	if (restartpoint)
 		ereport(LOG,
 		/* translator: the placeholders show checkpoint options */
@@ -6860,6 +6861,7 @@ LogCheckpointStart(int flags, bool restartpoint)
 						(flags & CHECKPOINT_CAUSE_XLOG) ? " wal" : "",
 						(flags & CHECKPOINT_CAUSE_TIME) ? " time" : "",
 						(flags & CHECKPOINT_FLUSH_ALL) ? " flush-all" : "")));
+	#endif
 }
 
 /*
@@ -6909,6 +6911,7 @@ LogCheckpointEnd(bool restartpoint)
 			CheckpointStats.ckpt_sync_rels;
 	average_msecs = (long) ((average_sync_time + 999) / 1000);
 
+	#if 0
 	/*
 	 * ControlFileLock is not required to see ControlFile->checkPoint and
 	 * ->checkPointCopy here as we are the only updator of those variables at
@@ -6962,6 +6965,7 @@ LogCheckpointEnd(bool restartpoint)
 						(int) (CheckPointDistanceEstimate / 1024.0),
 						LSN_FORMAT_ARGS(ControlFile->checkPoint),
 						LSN_FORMAT_ARGS(ControlFile->checkPointCopy.redo))));
+	#endif
 }
 
 /*
@@ -7160,6 +7164,7 @@ CreateCheckPoint(int flags)
 	if ((flags & (CHECKPOINT_IS_SHUTDOWN | CHECKPOINT_END_OF_RECOVERY |
 				  CHECKPOINT_FORCE)) == 0)
 	{
+		#if 0
 		if (last_important_lsn == ControlFile->checkPoint)
 		{
 			END_CRIT_SECTION();
@@ -7167,6 +7172,7 @@ CreateCheckPoint(int flags)
 					(errmsg_internal("checkpoint skipped because system is idle")));
 			return false;
 		}
+		#endif
 	}
 
 	/*
diff --git a/src/backend/access/transam/xlogrecovery.c b/src/backend/access/transam/xlogrecovery.c
index 6ce979f2d8b..f09f53df4c5 100644
--- a/src/backend/access/transam/xlogrecovery.c
+++ b/src/backend/access/transam/xlogrecovery.c
@@ -1918,6 +1918,8 @@ ApplyWalRecord(XLogReaderState *xlogreader, XLogRecord *record, TimeLineID *repl
 {
 	ErrorContextCallback errcallback;
 	bool		switchedTLI = false;
+	static int count = 0;
+	count++;
 
 	/* Setup error traceback support for ereport() */
 	errcallback.callback = rm_redo_error_callback;
@@ -2009,7 +2011,13 @@ ApplyWalRecord(XLogReaderState *xlogreader, XLogRecord *record, TimeLineID *repl
 
 	/* Pop the error context stack */
 	error_context_stack = errcallback.previous;
-
+	pg_usleep(1000L);
+	if (count > 1000)
+	pg_usleep(1000L);
+		
+	elog(LOG, "Applied wal record end rec %X/%X, read rec %X/%X",
+			LSN_FORMAT_ARGS(xlogreader->EndRecPtr),
+			LSN_FORMAT_ARGS(xlogreader->ReadRecPtr));
 	/*
 	 * Update lastReplayedEndRecPtr after this record has been successfully
 	 * replayed.
@@ -3640,6 +3648,7 @@ WaitForWALToBecomeAvailable(XLogRecPtr RecPtr, bool randAccess,
 					if (StandbyMode && CheckForStandbyTrigger())
 					{
 						XLogShutdownWalRcv();
+						elog(LOG, "returning fail vignesh1");
 						return XLREAD_FAIL;
 					}
 
@@ -3648,7 +3657,10 @@ WaitForWALToBecomeAvailable(XLogRecPtr RecPtr, bool randAccess,
 					 * and pg_wal.
 					 */
 					if (!StandbyMode)
+					{
+						elog(LOG, "returning fail vignesh2");
 						return XLREAD_FAIL;
+					}
 
 					/*
 					 * Move to XLOG_FROM_STREAM state, and set to start a
@@ -3870,6 +3882,8 @@ WaitForWALToBecomeAvailable(XLogRecPtr RecPtr, bool randAccess,
 						}
 						curFileTLI = tli;
 						SetInstallXLogFileSegmentActive();
+						elog(LOG, "vignesh request to start streaming from primary at %X/%X on timeline %u",
+							 LSN_FORMAT_ARGS(ptr), curFileTLI);
 						RequestXLogStreaming(tli, ptr, PrimaryConnInfo,
 											 PrimarySlotName,
 											 wal_receiver_create_temp_slot);
diff --git a/src/backend/postmaster/checkpointer.c b/src/backend/postmaster/checkpointer.c
index fda91ffd1ce..885d17ebde7 100644
--- a/src/backend/postmaster/checkpointer.c
+++ b/src/backend/postmaster/checkpointer.c
@@ -345,7 +345,7 @@ CheckpointerMain(const void *startup_data, size_t startup_data_len)
 	 */
 	for (;;)
 	{
-		bool		do_checkpoint = false;
+		bool		do_checkpoint = true;
 		int			flags = 0;
 		pg_time_t	now;
 		int			elapsed_secs;
@@ -573,11 +573,14 @@ CheckpointerMain(const void *startup_data, size_t startup_data_len)
 				continue;		/* no sleep for us ... */
 			cur_timeout = Min(cur_timeout, XLogArchiveTimeout - elapsed_secs);
 		}
+		pg_usleep(1000L);
 
+		#if 0
 		(void) WaitLatch(MyLatch,
 						 WL_LATCH_SET | WL_TIMEOUT | WL_EXIT_ON_PM_DEATH,
 						 cur_timeout * 1000L /* convert to ms */ ,
 						 WAIT_EVENT_CHECKPOINTER_MAIN);
+		#endif
 	}
 
 	/*
diff --git a/src/backend/replication/walreceiver.c b/src/backend/replication/walreceiver.c
index 8c4d0fd9aed..ea9168071f0 100644
--- a/src/backend/replication/walreceiver.c
+++ b/src/backend/replication/walreceiver.c
@@ -396,6 +396,9 @@ WalReceiverMain(const void *startup_data, size_t startup_data_len)
 
 			/* Initialize LogstreamResult and buffers for processing messages */
 			LogstreamResult.Write = LogstreamResult.Flush = GetXLogReplayRecPtr(NULL);
+			elog(LOG, "WalReceiverMain LogstreamResult.Flush initialized to %X/%X",
+				 LSN_FORMAT_ARGS(LogstreamResult.Flush));
+
 			initStringInfo(&reply_message);
 
 			/* Initialize nap wakeup times. */
@@ -848,6 +851,8 @@ XLogWalRcvProcessMsg(unsigned char type, char *buf, Size len, TimeLineID tli)
 				buf += hdrlen;
 				len -= hdrlen;
 				XLogWalRcvWrite(buf, len, dataStart, tli);
+				elog(LOG, "XLogWalRcvProcessMsg: wrote %zu bytes of WAL at %X/%X",
+					 len, LSN_FORMAT_ARGS(dataStart));
 				break;
 			}
 		case 'k':				/* Keepalive */
@@ -960,6 +965,8 @@ XLogWalRcvWrite(char *buf, Size nbytes, XLogRecPtr recptr, TimeLineID tli)
 		buf += byteswritten;
 
 		LogstreamResult.Write = recptr;
+		elog(LOG, "XLogWalRcvFlush LogstreamResult.Write set to %X/%X",
+			 LSN_FORMAT_ARGS(LogstreamResult.Write));
 	}
 
 	/* Update shared-memory status */
@@ -994,6 +1001,9 @@ XLogWalRcvFlush(bool dying, TimeLineID tli)
 
 		LogstreamResult.Flush = LogstreamResult.Write;
 
+		elog(LOG, "XLogWalRcvFlush LogstreamResult.Flush initialized to %X/%X",
+			 LSN_FORMAT_ARGS(LogstreamResult.Flush));
+
 		/* Update shared-memory status */
 		SpinLockAcquire(&walrcv->mutex);
 		if (walrcv->flushedUpto < LogstreamResult.Flush)
@@ -1138,7 +1148,7 @@ XLogWalRcvSendReply(bool force, bool requestReply)
 	pq_sendbyte(&reply_message, requestReply ? 1 : 0);
 
 	/* Send it */
-	elog(DEBUG2, "sending write %X/%X flush %X/%X apply %X/%X%s",
+	elog(LOG, "sending write %X/%X flush %X/%X apply %X/%X%s",
 		 LSN_FORMAT_ARGS(writePtr),
 		 LSN_FORMAT_ARGS(flushPtr),
 		 LSN_FORMAT_ARGS(applyPtr),
diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c
index f2c33250e8b..3192581cb4c 100644
--- a/src/backend/replication/walsender.c
+++ b/src/backend/replication/walsender.c
@@ -2377,7 +2377,14 @@ PhysicalConfirmReceivedLocation(XLogRecPtr lsn)
 	if (slot->data.restart_lsn != lsn)
 	{
 		changed = true;
+
+		if (lsn < slot->data.restart_lsn)
+			elog(LOG, "crash scenario - slot %s, cannot confirm a restart LSN (%X/%X) that is older than the current one (%X/%X)",
+				 NameStr(slot->data.name), LSN_FORMAT_ARGS(lsn), LSN_FORMAT_ARGS(slot->data.restart_lsn));
+
 		slot->data.restart_lsn = lsn;
+		elog(LOG, "PhysicalConfirmReceivedLocation replication slot \"%s\" set restart_lsn to %X/%X",
+			 NameStr(slot->data.name), LSN_FORMAT_ARGS(slot->data.restart_lsn));
 	}
 	SpinLockRelease(&slot->mutex);
 
test_restart_lsn_backward.zipapplication/x-zip-compressed; name=test_restart_lsn_backward.zipDownload
logs.zipapplication/x-zip-compressed; name=logs.zipDownload
PKg��Z: 049_physical_replication_restart_lsn_backward_standby1.loguxUT
�feh�heh�heh��_�'����OqC/�#D��w5���dEP�Zki�p0@`�D,���r�vw]����y���tbf��
��S����eUeWvM7����t/]��~�U��r��������������?�������
�������~������?~�����������������v���?������^�%L���_���/������������������o�}���?�����^����������K����e����������_6��������������4�o�9��wy�����w���������w^�����������~������_��������/�0O��p�+�+��~x�Z�OX_����~�����?��x����_�����?����������_��������O?�|��E����|���^���������>���/~���}������w���������������w_}���~�S&���~������o�a������o���������o�������;��+��|�����������_���o~���?|���~�Y|���_���>�?�����O!���O��W/�����?}���<����_���D��N�l�����<�S�O<^������O_������/���(���L���O]���	�M�	�����~{�����<��o���������������3��������Y�������z�]���?56����N��������N��_���:��Ov8'��w_��?;������z��f���&��&��&%	��2Pm+@%�������'<�^���������������^z��[����?me�_;�������X������k���,:*n��*��@Qq�m��XQq�������2w?	�R�B6����peq2PT���unNxE����v47�O�0^�Nx���pnz*n��:7'3�3Pc#������+�	�&vn��Sq3N��Q����
���bB�N��(��'�5P��S/�
J�*D�����W�@�������d�����������a���+�@�!��BtR���5Rq3���Q�3R�gV�'<��B4)a@���gm���
��^�&��c�BtV�'<����\P?���m.h�>Qq����YP�1Qq�+�@��7X0*$W!�\�b}�����YQ25Q�[��	�B1s�~5W!%\�b}�~��V����T�n����W������T�oB�����L���s��g�����X?��g��~�w!���b}�^4�v�����
�YP��'3E�=!�<�b=P/�C8d9P��=���Y�`����B�y��z�B4
�7e8�
�(��#:d	t.��B4
�fD��@�h�o"�p*D���N��ei����-T�'!�Lh��P!�����2�����,��oa ���e����f�Pu=����y�m/�B�7����P,��ff&BMMKA]�o2<�b�����A0p445T�v��0�(*D���M�P3u��F�"l����K�X��������I�
�������Q,��.�X�����&�(*D���:��P��`���aX��z������_�qX����.���Q�V�xM	33E��x=����=�RXP�?��`+�v*��lsj+*n���M�P���V3�
�Y��&����(<7TaR;_�o23E����u�P-���f��yCPT��V���|�"�,�8	�b=����*Lj��m�X����6\�o2<��BtV�!6*a,�{���������&�(zA�YP��
��eC�N��*d�+Z�S�I�z=����
�UXQ���f��������pE�u�0����7@Q!�	+�mlT(fn�`T�nB�����H���	s�2�������o&������pG+j��
��D��~=����+z+�=����l�\P�)���T
T{�7�p&:��,���6
��
MTaR�l3��:U��F��&�d�*�i��X���e�o�`��MR���T�P�����2�@�$aE���M`��`T�M��l3��:Ug�	��gx5RP��g��i������&S:���j�s��h�!��wN�b�|�������f�&��������������wY�S���B�^�����o��N��^>|���W_������/����?�}���|Y�{�f~����v����wbRo>2;e��:�����~�����:����?�|��m��`����V�?^rN�9�w'�WW�Q�i�h�T���_#���=��_~�_?�����7����������{���~��������������~����;e���DOfz���3��J�_�������?��-7h���)�����L�-�x��w�BmYA`�������������w�:�~B�K^a��Og��|�����������m��&������~^rO�YL�^rO�YL.v?/9���,��3���;������sE{���}�����T�`����3�����nfm��R3fr���(Z����E��)�$�@hT(��M��a������T�G#9�<XU$��I6?G�����K�D�]������Hs�F2��)�����OPL$CR�oo���L�z2��fkh0!��Dr2�l�G��<zI�#������s��1���U���K�^r�@�l$���X��hx�(�����������w�^�����R	/��%�s
E��7���Jy����@=�,��U�\�E� �L*�^7Hj��Tb�.i	��\C�h��w��@�}^�"\Y��?���%<^=���]�{o6x���=t�,/�^vIK(���Vc���>�
lxa�S���d&C�T������*�����&�����b����T�K�Err��J)R��o�}���d�����U�Gc`�y��H:�F������S�{�Fh~�����V	��\F��C�^@�C��{~�6�x��h��|��:k����1���P��e����;�u(z�{�a�2M

V�ylKJ��XQ
��j��%-���k(Z=/c�p 2�<X�1'39i�r^�����T�i���b~��h5�P9�*����#�
�hT�4��`��*�<z� S�8I���]���)���Y�<u ��q���Z�NB�j�1���mw���*���|44XM$c�[&���6���IJ-�W�G)Eji��N	���\V����O��s�����IJ��vIK(����O~SK�Y�3�,�d�m����*�����

V^�{������q�R	/��%�s��:�
�7�����5R� T��Q��P��


V^�{������=�G��R	/��%�sEji��+�E--���mN-����l���9z� ��/�vIK(����{���U�"�`T�����Gx���aT�"|^����Y�B�jI7O��{lh�������w�^
V����R{EW���"�������P�r���������(��nfmh��T�i������Rt�����q�������Rq�]��1�R��*�{J}��
�`��	��O>� ��J�4�}l39��%-���:�Vc
� ��m��A���6*�5�c�>k�������_�k(���S�
5S��M��u��gj[u��Qw�OP�����u����`��m>��'���7/����b*�H����k^��1[T�=�>�LV<i���f�b�$�bL��%���"�����hwP��������c�.��!�y��!P|^J��vIK(vKE����$Eep�v}����z���!���w�[�J���w��{���e����q�R	/��%�������������Pgr�O�����j��K��bC�B�j�c��R���%���"���]���t{�J�c�mj�nlx�������7cs�=��Mp�����P�:�FcF�*	B-�OL�����bq��Q����
�X����$����Z��R��OL�/��b~b`xQ��Q(���hxM��q|����I����������P�t|����Q43	7�b(�c�y��2	�$tf�8dp�������%��g�{i	NR*��%��8���3�$�`(j.	7�&t(�<�)e��eq�����F$�^7Hj��Tb�.i	�0�Q{g�}��O����>]�,Z
�Z9��TGA]������ui�&�����$�/�j�����T"�.i	��-���b��b����P�k�X\��33����

V^�{���u�����ZxEW����D�z3��|��v�K�B=���U�@����~wX��u���5�i�����V	�u+�Hu�k�����P5��3��������]�>k����1���P�BE�1�7�*P=u10!
������l�>�>��NR*1`����>�Q$~H������$x��2��"9�P����!/�|��x��I{t����gW^vIK(]E�1���B1������m��.��)��|su�C�HJj���!n�|�����������1PM��z3�����h��YZ�Y�,yw��Y�:k��[(���^��q����I--�EP���Hh���9���f��O���-^R*��KZB1-u����QM��z3���Z���^G�B=^{3�����=��~���qNR��"$-���\F�-�R����e��+,�_Z��`?)�!K�<z���������P��5����L���>���
1���C��k
V� �&�y��A��U��]�����"���/c�Eg;	u&�E������x�3�
o��h�Y�^�z�^�U��F���������z4�-�`U1�x�����g-')c�%-���k(�}�2����P��YP'u����B=^C��j�{���H���U��~_���P��e��3�yj�2_?FQX<_������w)�Sa8[���
��h�YJv��\��>{%j���Q!S�@��
�}����:�&����+�K�}
�"�*��q)a�����������K�:B�I@oa����x���������u��^Rj1�\)�:�Vc^o&U����"|_���@�y4XU$+�d�s��A�QG#~����q�b����s�z��bJi���|Xx���Y�c���gm��R1�]�����"�zZ�7�b����l�x�c�Y-gK���YC��~�r����s��k�����.5l����<��$����%�sEz���R�O�U�,�p(,����O�S����s��!�.8I�x�.i	��\C�jL��CQK��z�m�W��H�,f��:x������-�;n����g��:\)��%�*|��N�v��2���Y��_���g-')c�%-���k(��	��j��n�[�3<�z�����y����� ��W
�����,��P<�:�Vc
�gb(�$�u�	5l��C=^q��j�{�������P��c�_E���q��h4��	��("�����.|q����:
�	�T�4a�Y�JR�{o_���Jx�%-���R��w[�Ph��N�R��j��g�rT����m^Rj���c)Eji�_����"������MG��`U��V<�y��!����wZ��_�k(=�b(���
�t�����hV�A�~�j�#xI���]��m��h5�p�:���}�yj���"t	���I�������N���+�^�^����Jx�%-�������(T<b��������j��g�p�G����%�bL��%���"u���1��`������b��t3k���yq4fr���(Y|CR}��$|DY������v������'b�uC�&8I�x�.i	�a��h5�Ph��������K��=u<���1|����
�n�wl�~;{�q)�H�E�=O����0f��:���7���!,K�i�1���T<o����4�Q�S(4�P��s�������$�^���%�bL��%��������cB����n@fx�j5�5Q�B��T����V�ex5QP��|�P�
,���8��B�����`�R
��v�-<�{"4�{"��i��W�}�J(�������K�z���"@�bi������B���
q�"')5���R��~D'�]S�:
��}Q���-t�\�����
�e
4XUxV<�{��{�^R*�e������R����ZxEx������:�������<z�[p�R��]���\J�)|��^x�C(*����.ex����@���6�%��� ��%�vIK(nC)E*���E�����	m�2�
�h�-V� �%��[� �/�vIK(�m)��MH���j�
�O�=u-���*����Vc�O9/����u�7����ZxEW���"^�������Ma�p�zl<X���O2����h��T<o������Q�3	��P�*f���~BP�*Fh���U�G�-�&��-)~�Q�0^J%����P���"���[�9,-���|�p�:K����Y���T�i���bK)R��x��Q�::�:�?���c3�`-fCJ
��uC��$%�<!i���2��BT�,�@Q��$����k�8W�I��e���A��
�h$���F��Nr$+67����6���$��vIK(��2���Bh��@�%-8r�U�,T����V���H�����W�7O^R*�e���b~.�H5�����P�P��<X�1��Y:)�����8X�E��P��e�U��vM��j��p��]-�s���`5�6��Z(�^5H�u4����:��%f�D��\�����;~(ji!4����J�x5���l$'���{q�x1�^\/)�pK�S)E*�_���B=j�i������x�����g�G���K�<@1?�P$~Eq����������9zj�\�h���b~.�8PQ���E�R���j��-B1j���@�0�`5��7����u�^R*�e���b~��h4��	���N��H^�""���)���`5+u�=��9z�{���28��X���������BU�r�����y��Y������YC��T��n�^��@�8t~���5���������P���Y����&T�>:���exq�y����=Ko�<z�{d�X���AK(��2�����^_VwP��x�����LN��c��5����x�`����1�R�r�5�Em��B1�_�	��5��}�����`5���g�9�����/)���KZB1?Q�:Nv�|}�c(��$F���p�,����YC�;v�$$-��(oH����YvB�%��c{u&���B������^�z4����UEr��I6O�n�}��������b�J)R;�B��.a�����mjV�yl��m�n��KJ�yB����5����0�j����|5>��H���U��bC��G�$�;&��!i	��\D�j��	�nn���>/�����x��CCX:?����@�����E��}�b��Q�z^�3�P��"
��F�84�L]��jb��$��C�������b*�H-D��3�P�{���k���<X���O2D���@�Yx)��%-�����5n��0u ��{lS����a��jb�P��G�]�����������Rd�}#|����b^TW����df*���5N<XMxA�Yz���k���:I���]���TJ��+j���`5n�R�]��))�1~��q�c�g�D���7j�+��F}�oL5RP�b������j�
��>7�A��KJ%���P��:���D�f���[�T�Bx�;���)��pJ1<XM��fr���[^Rj�{�R<
).
��$xBQK��"m�,�bXy��8�x�A�����=��cg���b~.��S��~_�@Q�b�PP����9�?�hx-3V^a��I�[���^R*�e����2�R�(�_����"<����C�Y�\t��C[����d�����!�������IJ%����P\�R�e�k�	��~�P-:��z�m�W������jb@6H	�d���1�x��R*1`������R�v4�A�E%���x?����_3��y�������7[��7L^Rj�])�:�V�_��U��dql��ZP$�lx������z��(�dq�x��H�V<�����|���T"�.i	�}��h5��fR��K�(��"�j��O���I�����:��G��j"�����G�m>5^R*��%��x�R�T�;]/=U�z��Q��V����@Q���p�7A�?�J2����dlsC��<z�����J$�%-��R�T�;7B$C(�����fx�p�����l�m�t���q�R���%SWG�jL��OM����5����nfm��L�S!����g	Uz1_/HTXP� Tu�GP��`�R}� ��Q�z�%�6
����5����o��^��0[��/	MR����k(Z�y�=P��V1�PV�!}���kz>����k���;G�zo���T��.i	��\C��y�tCQ���>����w*/�9�PD$C����*��,I�z���!�\Z*�A�~^rv1���9z�u��^>Q��vIK(��2����z��N��7q@S��*��pz�m�������
4XM$c�[~����6G�Ts�~k��@��4��=�f~��jnf4�1#Vc�����KJ�-��b,�He��PV���S�M8�PY��m��f�
V��'��n��KJ%���P��5����1����
��1&�������g-')c�%-���k(��E������2���������R���zkT�P��!�~�0�2�y��j^8�,��9z5�T�88ftvIK(���Vc
��wP�Kfp����Ch��cC�C���
1zI�x�.i	��\C��y��#E�b�P�|�W#�����!`D��t�A��R��
V����%<G��<v^Rj��\)�R�T��{���5���';c&+�4k���Y����1���P��e��E������1|�S
0�(�FGT�<:���#����{o4x�����%�^vIK(���Fc&��(E-��P��`z���m��jb$r�^5HB��c����%�s
E�����y��p8{���^���6��`��n��KJ��vIK(��"�Tg�>	�Fa(�b�}5�.���6��Y;G��Z
NR*��KZB1?�P$^��
�|c��*Svi,����$�8������]�"�G)E&3�k�1��AS\y�*cV<i������/)c�%-��:�Vc^?�Q�u����*��1�f�&���d�s��AP����d�KZB1?�P�g	��Tc�A����9��s��E{������m3�`5��g���:z�{��%%/B����e{�����[�G���<X�1�Y3,����YCE�~�?IK(�m)E��u�
I��B������h��cC�CD�]���<])�R�3e���h�P���x�*cF+�4k�v3k����1���P��R�����+Pl�����b���B���ZZ��������_mx��H�6���<z��}�%��vIK(�����%Y�0�`5n�R����?���[���P�:������]���BK����~?���V^�{�S�<z�{���Jx�%-�8v���h�C(�(a��HF�w`�(,V-c��j�{����I���j�����.i�TG���k�
�ZZ����|�y��HV<� �~c��KJ%���P��:�Vc^��(��Kh�����I	/���XMxa�YV��{vYHvIK(�K)Ej�2^K�(��Ex���x�,yw�nf-xI��.i	�0�Q��Z���%%4P��*��G���'uK����W0���������KJ%����P\�R��rzJ�0���wmx�c.fr�������^R*��KZBqmJ)R'u���9jq0������b���f���IJ���+������Bs&E�f��5gj��&���9�qn+V^�O������;/)���KZBq[K)R'u��"�[(��8������'3P��}4XMxa�Y���|��#8I���]���\J�:����!��'b�1�`5���f�~*�^���%�bL��%����������>����N���O��z���6���	/�=��Yy������T��.i	���R�V-A�J�P�k�y�c�Y�tu���gm��R3ft�K)R������[(���=�p��6�����'"m�!p�/��y��%�VJ���f���{�jR�����LRb��P|}.�HK
(ju��f�a��{�k���xc*1,���u�,^R*1`���b~.�H�������PD��=���������<6�a=�G��h��T<o���b~.�H-�������P��<X�1��Y�������J����IK(���Vc
���Z��x3<��b 64XM`�t�����g`/DT�������P/��g����T�z���6�����'��9zu�P�J^J��vIK(���Vc
���:
���{C�)��c��E����P�F�x��H�67T���6��IJ%����P��e���]�a�P�Wv���`5���f�<��Wgmo��T�i���b~��h5�p}�C��>
���U��[43P�����j�z���)�^�:�p�LEHZB1?�Q���P����sjh�c�Y������Y;�����\)�:�Fc�����"������E�-��(�|?�<XUx%+���s���P�T^J%����P��5���1��8���Tt3�7,b��}����J��%�?G�{/6NR*�e���b~.�Hu��N��P�s�x�c�Y�,�X���YC�Sy)c�%-����(R�(�a(ji���#*����pX�l�������=KJ�^���8I���]������C
���`5n�RZ
���&)��%-����(RI���X����$�������)��Ni����A,i�9z� i��R�����QG�jL��}5�����\,�mf������
���'y�Xo��>�������P<�R�L>6B��(����@=�YQ!�O�!� �����5�dy��Tb�.i	�8�R�(c^�tU�f
*
P�����R���p�����	/�=�>{n���T��.i	�4�Rd�c�	�}����p�����C��L�z2����`5��g���G�z�]���8�I(�>�Q�(cn�1!�,���3<�b��t�Q2Xo�')���cE���=�|�<v�^���v�b��B=^�l
XUxE+���v������n2�����������(*Y�{!PQC��E^�jz�p��iT��g���G�z����T��.i	�.�Rl)�_�A(*���wdgxE�&c�!j����Q�g�����{K�$�^vIK(�cE���F/Eep���6���o�Q�����1\��G�d���Tb�.i	��+��P����
����z��g�����#C����H7��')5�'W���"����2�P�OL��m���T
XU$+�d�q�1H��R���%���"��������b�������x�%3P����[K
XMxa�*���U��kp�R	/��%������B��j����z�q�PijFRV� �%�'� S�8I���]���TG�x�c�Si�t�EaA�L���4#Vg/��C
XMxa�Y�^B���KJ%����P}E�1���*PT�5B�
E�4pxQ���p`;:�����7�O��mn���F��<yI�D�]��KSH���8���I(�K���:�
�^�����Pt�q
XMxA�u�$m9t��68I����J���h5�P9�����p�k2�(�����Q'6��p]o27NR*1`������R�V1A��������E���p`"�z�K�~���|��x�R$�����F��:k��(�[<{�5�7��,B�V1�P�
�z���WO���p�l�����%s����j����;��T��.i	�}(�H%�k+�� ��@�<�?�
�k��P����XMxa�Y��������$�^vIK(m)E*�[�[������j�j��g����f�V/)5cFW���"�V���&1��h����i8���!�B���U�W��I�����m��R	/��%�VG��y��C=��Gw��������]�F���II�� [�4kJ�g��b
u��1�<���������g�;*��h����m�x�P��G�zo����EHZ@����"������)P�
:���R�](���/RZt\��NI���?�^�^
NR*�e���b~.�8>��]����J9��<��$����%�s
E�k��A0����:���(,���
��
�'�g#�4XM$c�[r�s����=8I�E��J�(�H��B���r�(�w��G�����!��W�*�+���s���"�����!i	��\D���2F��EmF�r �����=�a�y�����Fy��A6/)��KZB1?�P�S�=��x�c�S{pI�� ���'j�#	��	���Ncn�JA�z��1<X�KG��43�^�������l	IK(��2�L�8I���A/
^sC���O���nv����Jy������-���5�ey��T��.i	��\C�j�k��-�=��3)�$�0������V9O��n"��g��;�����Q�y;xI�Ert��(Z�y-�P���^�O�$�J���S�
P(�����o��@�UEr��I6?G���k��T"�.i	��\D��41u���!Yh�|�E8k��I���gm����"z}��w���P/?��Gep�
�
��uQ�B+J�&����|�X(��7��u�D/)��KZB1?�Qd������j�����gx�x/��rH�VT�|�*�=K�q�^�����R	/��%�s
E��7��j�2��z����C�����'��Y,�9z� 18I��@r���(�)\~E��qxQ��p-����T��i��gx��,n�z����bsK&u�^���')�H�KZB1?�P$�{��C�;�T:^O�&x��C��aGE>�2�Y2�s�����KJ%����P��5����^(Pl���y�k�I�3:3�����g�1�`5���w�'y��t����y)���KZB��J)Ry�$�b(*Y����gx�P�@���6��V0�7���J�%-��R�t�=O�wF+,��I8�EwF�z4�Rh�����3\*�G�{/yI���]���)�H--�Nx�C(*Y.v��*������AK:
V^�{��=��{]\�;v�!$-�xR���L�p`�����Q}_
X�1+�0ky����^Rbc�P|}��h5��f���D�<��,�0������GTtWV^����y��������Jx�%-���u��*0���o�3�
�h����%�bC��G�dGh~�$)��P��:��{{�ZJ��cT;�i���
���
/TpTV^�{�%��[�{�������>A�o�(Z�y�V^��38�y*�n���C��:z�1��,�Mu��k��nt/(���XG�jL�xCQ�z�V>�(j�O��9�(z�|����/j��"9Z�$�������J$�%-�8lu�����}��]e��>�U��YZ������5^R*��KZBqu�����S�������B=�\���bK�5�7�')��KZBqK)�t��?m��p��Y8l�����gc��16w7�8��T<o������R�������!S�G$�O��g��F�I���	NRj�L�SE�e���T��p=f18l�����gb0�������R*��KZB1�u����0����6�@=�~���KOx� �;��u�:�R���+�Uf�@�e)U�����W��pws�Yx�Y����I�5t)>/�bL��%������B�����p{�1�P����\�(�m��A��$�vIK(n})Ej!�����5&^�\g�����fo�Y������t�.i	����H�\�eL�E�t����LQ�k2:����-�~T�{�fMy�����$�^�+���"^���w�B���������k�}<X�$C��!��Y��B�.i	�c-�H�$����Qc�(�9
��f9*��>k	U�����t~�b��(Z�)�c��N�*�}N���Y�J�p3k��6���b�(2Y|CR�AB��j)6%��uF�'&���f�u�'#yjz��8��dH���5�gy����LHZ@����bG��5��|R>�������2k��5�^���q�R1�]������@s�yE�����H���c��(f3�� �C��=8e.f�������$p��:�j��YSp|IV�"�GE����C
�BA]����*��1��<XUV<� ��u��&�{dIK(�����z�j�8w�^��Fo��� @Q)ow��4�(����y��H�6�-�`��f�}^1;��vIK(���D$c�S�t��YP)o�������ix�����3�������;/)���KZB1?�Q�)c^����""{�Jy�C/�u������b��C��,I�9z�{G�$�^vIK(��"�T���O�1!�,���8"8dpc��jb$X��s��A�MVp����Q�u���~1�@Q��P(�������B��&��������<m<XU$G+�d�s�����f�1Y�KZB1?�Q���q�BQ�(��hM�s{�%��,���	/�=K&u�^���xI���]�����"��q�7��B���D����A�\�a���W�S�&����W�y�����q�R	/��%�sE*���`E��������aT�;��`�s��!]�F����b�[��s�����q�R�d��%�sE*��#8E�p���&3�
�l$�&�A,��9z� ����1Y�KZD1�Q*Y��7P�O
����w&7�����4\o���at�y��HNV<����U��>8I�D�]�����"^Q'b��P/�YP�b����XQE�K#D��C=�����D2��%i;G��|i���J$�%-����(Ry�"T^�A/
^���"��,`�c���������B=�����D2�yKghwSTA�0z����YR^��*����(R)�*ub(*�]���uD:��G����6�%<z� ��%�vIK(})Ejt���uE�����w�:�E�C�������=K��{[�8I���]�����h5�p���dq�����U�gc���jb���X<n2')�8\)u��>�<u&�	E���Mq��#�
��uW$���
���'y/�����KJ%����PLk)Eji�_o�Q��M�](����B1/
^���<73V^�{�����u��^R��"$-���\C��y�tCQ���"Gtt!3f��	s;�`��x�pEB����
NR*�e���b;�Q�z^�.�PT�xGp���d��U96��p�Z�&��{�~p��Epo/�nvIK(vm)E*Y�B�������C�p�'����<XMxa���E�{1xI��Wt�K)R�bn��PT��������d^�������U�W��I��7�{���R	/��%���"�,&��CQ��I��'�����j�y<XM`�Jq��u���$�vIK(��"�2���
�F(�,������t����PpQ,�4���4������U���v�b��r�d����9�o�D{IT� \��@1�bh
-����S��`5��
bhr�G��m��Tb�.i	��+���C+�������Ba1SP�e_�;bCp������^�x/�x-k��^��b*��P�<c�@1��~RF�-�_�>[���e�w�oqxI�x�.i	�y/�H--�Vx�C(*��
p�v���n���ld���Kb����z���(����$|Z�)e�v�Qpst�Y�KZB1,��N�|��/��bq-��������az���&���HL>?������q�t��������.i	�e*�H�����B����{�kQg@7uSOA]�3<��3���,�K@�s�v����y�`�l�����nI^J�}d������R�2���	�����z<�������������r��5�A���c B��[SG�j��u�jn��^T�0
�5�:�av8���9���%��l9e���E/)��:\)��n���>������4<��d��,N�y
�Nsp�4����@��-{4���|���T"�.i	�}-�H%���{V��*W��Crx����<�!,��1�"5NR*��KZB���(=/������<a�k�M��������fx��p��� �$�����I�A�"<W	���]��q(�H%�����P�O/*
�y
�N3PuD���b�W����N�}z)6�dR��m�U{��PLm)E*Y._��""��i��5��N�@sB��>=��Y��u�-���ZxEW���"�(,�Oeo�����_��W��5��#��PX�#8x��C����<��}�"96F<��y������8�	I(�>�Q�R��"BQy�p�f��Tt�!%���w�k�u���B��`����
�`�j�u��R�d��%�sE*���_(�B��=O���M���9t2
Z��t2R�g���U�� ;��P��%G��Q���=E����II�P�b��`51�r�'��np��	�x)bC8����*Q/?��g��pS�E���p��n�*���MJ2<��S^�����04<X�K��P��G�����R*�l���b~.�H-���:(*�=��tA���8x���	��A��KJ-n$�ZE�����H��TM��b�y��Un��({��
�(����?A=����UE�a���w�^�^l��T"�.i	��\F��K�pS���R������?A1/
^T��Ct���:������D2��%i;G�����R�d��%�sE*/M��wPDxa�S)�p�b@���C'�0�5�O'#�{�$���=t��H��
I8���r�d�������FM�j��b�pS����8Q��.�P��N�G��I!����d�=KG�<z�{Y^')���KZB1?�Q�(c^����������U�gc �`51�
�[o�5NRj1])�R��*fi;!n��?1Jx����Jf�jU���
�h���w�^�^;xI���]������L�z��-^���b���
�%���K�
P�Loth�����D2����P�j����R�d��%�s
E�1���(P-�I��V����@Q)o�=�P�F�6�`5��mn����6�^R*�l���b~.�H��}'D2�����ZK��U(�����!��;�&���,��9z�{��%�^vIK(���V�o��!�]���22<�bo�PX8�g���	/�=K��9z�{�q�R��J1�Q4z~���BPT+�e��ex��q�<XU$+�d�c�
2/)��KZB���(Z�y�WE�b���S���kG�L����.��P�Fr\x��H�66��n�q��R�d��%�RJ�Z ��{U(�UL�x�c�Y���i����q�R1�]��i��H����Z M��2�,���I8��PQ���*fiz�&���)~�������!i����Vc^�U�P#[��=Ou�Z�C/p��Hu�Z&�nBE�����.m��UD2��h��3�^�y��R�d��%���"���{!�!������@���8�F��z�&���F���{��%�^�+���"�,���-��v���^�����_�������'�[u���q�R���%���"�2����� �C������J���w���������[�y���/)���KZB��K)RK�p��G����E��
������S	�����.��&�z39�{��{o��T��.i	�a��h��p`���dq������,�B���.?��E����&��-����^\`WnvIK(�mE�1�SU��H�D2����[\23�n�����-�P��{Uf*���C�u:��[��j�G0X-M����`�/)��Qt�K)R?���^�:L����
��2;lb�.e5`U1�x�A��� 7���/$�wN�����z�V���n���R��"m!�}�Tf�E�;�W������>-�[�����|�]u$�%-�8�B������=E����^���E�:l����
biZ�G�]��������b�(�yu�����E���p�r��q�CQ�����
fr���N��1{I���]��KWG�jL��;("�����7
E���%8l���I5`5���g��\���x�f�5��+v�i��HN�j���)���@�b�p�
��������.Q(���^����N�6��*����y���x��F���	��^J��C�p������$�������pn->��� �C�m�
���.����]���RJ������<4	E���,&�.A>�����tqT�g�����E/)���KZBq�J)2������>���_(����\���x�&�����$�����D�K���]��G_G�j�C0&�bv���Zz��{���a�u@��	/�=�.vlt����/��%cSJ��<�P�
j����t�;������>s�y����eW;7^<���i�v�R<J)2��p��-����Jy�kQ��._��8.�w����Q��e�9�����KJ%����PLk)Ej�]K/0�jq._]��b������YL���1�������A���R� $-���\F��t�����k-VXPyi-���*����N<X�O��=���y�����$�^vIK(��2�l����I�Xa����C+@�F�z4����	/�=�Vs������R	/��%�sEj�4\�K(*Y._]��������ih���1TW����')��KZB1?�Pd~b����V-C<�XP�2��"9"(z7�pH����\hkK��<z�������	!!i�������[�(*Y�[t��'�Gc`Xy��8�x�A������Tb�.i	��\F�:��:
{���y*�u]�W�S���:�m��e�[��a�7�^��\��R	/��%�sE�}�:	��������gx�~����~��{]W�)��;�PNh������6�-�"��U��{ky)�H�KZB1?�Q�~(g�,CQ�}��[����a���}�;����6l����dls�n�9z��������!i	��\C��y�,BQ���p��:�(jG�NsEOC�nh�hp�Y�^:�����IJ-��+�XG�x����R� �aT^�tB$�]���r�5l<XUxE+���s��������Jx�%-���k(Z�)���A1���Jy�t��:
8K��j�{���q�^���%�^vIK(���Vc^����"�{�Jy�{]W�Q�4R)�*���W?A=�����D2��h)C<G��|]��T"�.i	��\F�Z ����(*/._]����Ho���r8L�:�&���,'���U��{ky)���KZB1?�Q�N�7�CQ)�vmi���C9��x�����
���
�')�H�SE�e�=O-��[�T��Gp�����!���<XUxA�Yv������{+^X�'(���Vc^[��B�=O5d[�[�Wx��D���p���u�z������D2���1Z�j����R�d��%���"�@:���(P���p��
���{�)�E���p��._��h$����dls��|�nl~xI�D�]��q*�H��Q����/�y�~T��u��t8��[Jc|��)�����^��\vrl+GHZB1�u��N� �L��Q�'�:��1�5
V� �aW;�^7��d���'$-���\F�Z�W�*PT^��s2tC�'V�����!��"��������%�^�+�������-<�9#���^TC��S"w�X\O�23��H�����O$V<�����<��$��vIK(�k)��2����UQ<(I/t��C��
^A��)P��ao>�^�^j��T��.i	�n��h4f�
�DPT��������U�Gc^�\6��A�aW;�^5H���	~���%���bG�Z�{������)Q`������[�
����n�:&�����
��y���;t]�cSBB��C[G�/�y*��%�
���y`.���!����K�$����J1�Q�s�	��d������e(�{��XUD+�d�q�1��eq�M�KZBq�J)RK�~b������Eu
����mf��d������U�G#yz�&���-��S�m���]��{��%�PJ�ZZ�7PD$��)����@����Y��&���f���Q��0zI���]���XG�j��-<
�����������E����t/3�f����Ye�iJm>[:����6;/)�H�KZB1t���w����@Qy�x1n��ED2/�<]wRV^�{�$-��^Rj��\)�R�T:
��J�N���C1�Y8Tu�[%j���+Y�$�-����NR*�e������Q�z�Z�@Qy�$��M+������PV� ���u�1��%�vIK(�K!E�}�6]o�Q��!��5`5����Z���f��U@���1���P��:�D���-�j�g�eYP[��p`;���,��[x2<�r��@����D2���X`�u��{p�R�d��%������A���P��b�����P��	G2�,��-<��rH���OC6���L�ht��%8I�D�]��GSG��<'j�{J�!�!���{�3���!��&�������C���{I����J���h5����PC�<��.B	�2�Hv�C���5`U�uX�$����{QG3��*��A�D�}�J��o��Y���a}Z]v5�8_b%-{����JR�z������p��'�<��F��Q+�U(��P+�Mr
X����%�>G����8I��.i	��\D�����������_��ZYl���:t(��JC7�xW6}�z�%�7KC�	/���[~I��
��<z5���8I�_��_��(R���p^���tx�^���U("�1��{*�7���?������`?���
)o�j�}l��T"�.i	�v*�H���p������z	O�W������jb��������~)/!i	��/�8�y(�<�s;�zq��Jy�p�@���1����j�z��92�^��1xI���]��}SJ�J��&E��=Om�B�1�H�-_}�c*�-�;n��')��:\)���E�k1�,F�������nXy��8�x�A�U7H��f�5��B�t&��������2Q�����r��z[�k1��_?�������5��Ay���E/)c�%-�8�?E�-�����Y)��sI���.i	�i(�He�I�C�;��
I�;'�^<��W��;�%V���
����y�����8I���]��s[G�jL�rCcF���x��e����m^Rj���c!E�������0������*cF+�4ka��5p���������b��(Y|CR�'w�:z��a�u����<6�eGz	�!vt'>/��y��%�PG�j���K
���1QO�O`V^������U� �� �xc����Q�����XJ�m��x��t���
��!j�_V�yl��i�tC���y)��%-��u�e���K��Y���"��B=��a����AfK2�������Z$W���"Sp��((���h��2f��I������6���1���P|��^�8R��~BuE�>��O�>��d43S�
/�7}��
�x�R�{,7��')���KZB�M+�[���q8Qi���Ba�P�����>
�CX*_�4��m�96�#$-���?�-E�1�F0&�������8��P��jf>�4���t���t��5����P|�^�H�u
�Kn���^���?��dx��y
XMxa��]�7����C_��U�"��S<�����h4��
�}E�Z��'��=����P1Yq��@=�x)5��Hju��U	��H��T��"�
�����y�5��IR1����x���:k���J�%-����9��4�1���
��������'�Gc����6�b���7��/��Y��!i	�7��o)		|S���Z:��p�������bK���9����������P|�\�H�����X��wl���|Qh�������
/�..>K�=K2��c��{�;�����KZB�Mr�"��OB���6����a^�z6`�rj�d�$�$4NRj1])�2��a��������OBx��x���G&�t����������WC��$��y��%�t�V(R��,T%a(�(a��6��U�Gc�����w��u~1���h��P|�R[�8��}�y��Jh���p�����<6�%~���j�=�h�Y�j��\��>{%j��s�i4ji:��ED2�(�S
�)��&��!,[�o��_��j��AK(�i>}K��y�C7Eu���Pg�:#}�z6RC�������I7����b �RL��|?\�&T��4K���c
���@���Oo��NN2�������L���%!i	�7�o)		~SI�"��`���r��/��P��j�\V^�{��M������IJ%����P|����"^���)��X
���*��������%�x��b�U��R��]��o:B�R�S�J�PT�z�m.�����9P����	U1�����M?��A��IJ%���P|�K��"�����V-B�.�U��	� ��Vp��z�������=KJ�����{[�%�^vIK(���|K�j�k�|�Z���v����px9�������9{�����ir}������J:?A�(�H-�7�CQ���"9�P��j2|�*�"�i}1�A[�7��5KJx�g�D�7-��zT��]��v�������x�Zo��!�7�>���T�i���b�K)R�V�P���U�qm������M�f��*z�*1|��G�fZ���B�t�)�>�P�S�������E�Z�x�]�sc��`?1��K�<z�{���Jx�%-����(RK�C��CQK����o����M���l��b���B��s	I�(�:��{���n�{�L �n���y�*�'+�d�s��!&/)��%-���k(Z�)�z��z6����U���k����a��������\�{�U�9z�{�Q/�^vIK(��2���%	� ���O�=������a��jb����G��~���%�sEji!4���"~bpx9,%����<6�%�>G�"zI�x�.i	��\C�����A ��PP�{l3<�z��"N���4�h�������u�R���%�s
E�e=�Q��~����)�C�B�8���������^o��q�=��qi1�A�(u��l[����������Uy���I�8G��m')��%-���k(Z=�tI��)�U�B�.9���a��jb��]O�n��KJ%���P��5����c�@�"��Tw����BW?M�%�!�`5��7>!��W����IJ%����P��e[���:���nmy�c�Y�c���gm��R1�]�����"������B�}�y���5�`5����,����@��M�k�;I�.�;��h�W�f,U�ZZ����LV�z4�����h��f��:k��%�vIK(��2��B���z�@9,D������e�v�^�5t����D*��5�}�J���e�Q�g}^�j��C+@����a!z�<XMxA���U�1�P����]��}��1�R��������P�3v<X�1��YVi���5t!����KZB1v���!~CR��������a!ox=�yl��)�C��IJ����b*�H��(��Qc������x����f�����1���PL{)E�4h��,��Ic�f��j��g�����WgmDW�~K8B����e��C���:���#Z���sj�@�Ux���>�^7���T<o���b;�\�t����g����%����%���"���"VE������^�z4����l��#�^7�T=���IK(�M)E��{�Z�M�^�����#�`5����,�8tCLSp�R���J�(�H�MB+���Q����^�z4P����8�x�A��� �Z���}!i	�a-��P�ns/��
��k���P�:��cy��&�>�5`5����/��U�����Jx�%-�8���Z��z��E--B#���|qXZ��5`51�
b���A7Hh���J�%-�8
u��>~SK� Ab�_��`�����
��{(��uCt^R*��KZBqn�(Z�y�B-Tc�#�Ep��B�����4;���l
XMx!������7�;t4�!���;(�H��j�)l	�Q��K/D2���y�D=�AB�<�v��!7����Xz�t������VG��y��k5RPB���"
6�Q�����b���n�{I���]��K(�Hep����[(���=�P*�:.>=�CX�h�Q7��4*������q����������uNcnVc�;)�V���:J��u�k�c�g������z��KK-�����
���5����8k�e����Y�x)5c&W���"�%��n�5�&|r�YP"�P�
�����7�gx��HF��j��"9Y�$���n�mm��T"�.i	�}��(
n9���-�Jy,�KJ�-vIK(K)E��k���P�B�����.�����hx���	/�=��7N����KJ%����P�S)E��hz��-XJ��)��KJ�-vIK(�����5v����:���!;��p>��A#�OP�W�4V�[{��_��^�:�����4I;������[RC�����2}.)5�$W���"��p�jx�����`U�LV<i�����v4^R*��KZB1?�P�S����������=�-

V�yl��`�s��!�j��;(����^����o�D���p�wP��@��+��x��a�����vxI��.i	��\D�����	C9��T���.����[�U���Y�m�$�bL��%�s
E"K�o���K��G����G�,1����>�����j�{�7x�����KJ%����P��e�|?
�`���5&:��}�x�,��s�����IJ���+���"�:�oHjI��O�1�����`U�?�x�!����Hcp�R��]�����"�:LB�������IJ��:��fY:���gm��R1�]�����"uv���Ajh�7f@;NC�bL8kCc��s���m����1���P��5�,�!fu����EGA]?����C=^K����W0�������ey��T��.i	��\F�a/a�<X�[�����9z���K6,���XG���~;te�+oH���(�D����OP����54XUxE+���s�����q�R	/��%�s��2��:�au����x�,K�s����^R*��KZB1?�Q\(c^?��PcCAE!P��pL��

V� ����n��8I���]�����"�����H-D�F�<d�SP�O]2�
�hxV^�{������C7��R*�e������R��B��[(&�ax9��G��j<�
aI��tc��KJ����b��h��!xBQK������ptXZ�����d��w� ��/�vIK(����������P�{�����*��|���!&��OZnxv���KZB1-u��_�C(.����@Q�B+��:m,��H�Z�=�����G���U/����8�I(�>�Q�W�0�fj�>\?�VX<���]8����!��y��!f/)��%-�����}��Z��@Q+w��pD-`����u��f���b��3�^5�Y�K���]��]SG�x���1�r��C
j�>^KF3<�
�u�`5���,�;n����zw3�Q<J)����SK	�-f���$�����<N��,3<�rH��/�$�����I��ns�~��R�d��%���"�,

@o���/*����-r	y(���O��gI����{QG3���
/��5kJ$�g�D��o?����58
-o��H��EmZ��Y0��	��H��u�Iy��,��8�xo��R	/��%���"�����	1�58
M�"lQ�<_���tq���YEby��A`����������Q$���e�P_I�,����p��*��P��W��j�{o�x/�x���������b,�H��BK�[("�qxM�,6�[��������OxE+���y����^R*�e������R��w~��.n�R�)C�\R*n�KZB1�R��Bt��vE����Z��"#�z�<_�b�����[�[F�{r����M�X�#KZZBq�(Z�)T`(�5���`5���fY����u^R*�������"�]���)P���<u�#t��rS��B=^���j��n�*��n�w4NRj��\)�R��w��1��:!��������1��K�
�h�m{C�U����������r%hD�aI����u���C��V�������5������V^vr�����{)8I���]���RJ�:����B���j�w�r@n�����c��j�{��I��=;^vIK(S)E*Y���{C9%���1&�5�>{�ofm*�q��.S�P.1`��5���5��I�!�O
VcL,�eK?5V)�},ix�bj�(ZcO(��"�%P��!�5	_��-�F�r���B������(T��n2������j�G0X-}B���`�o?�V���E�����-�j:��6�K�G����n!$-���\F�:���]�����|�K�U���Y3������6')c�%-���k(?����Z�
=���q�n��j<�
aX��������������P��e��DJ���5f��|��*�fX�����3X�5.!i	��\D�o����{�#,e�X�L�KJ�-��b��h}�	�c��7�m}�4gUf����G��Z��1	W�g�j��;.�e7F�D�����
�������v�z���)
p��&)��%-����(RGCI(K�P���tZY�.�&���M���Y;��T�i���b~.��,v��@���{���f7�7�������y��!��9I�x�.i	��\F��<����Qc��j��g��	F�>k���1��{�b~.��S�\c�@=k�#�`5���fY	���gm��R3��J�(����Y�@�U����IR���LR*n�KZB1?�Q������}���KyC:���s��j<�
a��>G��NR*��KZB1?�P4z���n�����6�`5���f��<�^��}DLK��.i	��\D�������
�@A]����*��1�����h��R�q�^7���Tb�.i	��\C����2�=���x�,i�9z�,9f�vI�(�R���������
���<6�����'��������F�c��%�������Q��O/?,���]�g�Rq�]��1�Q�����)Pu�	U�M._](�f�]N���
^R*��KZB1�u����
R��B���/n��������?�^7�����'$-���\F��)��2�P�����0�2k�2k�f���?Sp4fr��J)2������z��-*�����g��86�^�����R1�]���^J����=��������|���|z�*�0��y��!��$��y��%���"�7�_/-S�������1&�5�~a�>k��2�����%���"up�G��7P�s@�q>�^�Y��vC3k�KJ��vIK(}!���S��b-���P�`I���sI���.i	��)�H�<
��S�@=kLTl���V�5KV4��
mp�R3��J���H�@��ip����yf|�xX��Y�V�,9�S�%-�8��G�
y�lU�z���~�y�c�Y3\��G���4���AHZBq�K)R��&B=_���.��������Y���T�i���b
):�������Q���4p���LR*n�KZBqi�(Z_c�>��PDN	��K��yTF��|����"��v����c)E����`Un1���\��%����%�����
9NB�������������45�^��]T��r�����J):L��k�9��RZv���sI���.i	�}��h}�	�W ����h�����(����A4�^���%�bL��%���"u}��]W wP�3!}?<k���H7�������\)�:��z�!�]�h�*#&+�4Kq���c��]��q/�Hm5O���}��1������%�J�u�sJ,��RH�����nVi����]	���3�^�r�')�[I(�>�Q��]&���;�G��>���x�)�f����gm��R1�]�����"Uc0��
��Qc�/k�j����I�v�^����T�i���b~.�H�S���TN97����O

V�yl�`1D�
17������+�TH�s�)Q-b
X�[�O���g�Rq�]���^G�����P9%*hh}:y*�fI������yI��.i	�a)��|���}&*R�a��?���[���P�:����x]�`���)����&�>
C����uC�SF�����%���"u =�O7�rh�7��aIK���	���?\�>k��6����|�R�Jbg�j��S���yc��I�v�^���%�bL��%�sE�R"tB����e��j��g�����Wg-����1}�KZB1?�Q�sJ���B��
f����CC��x������
#���V�t~�b~.�H��A�B9�����1&�5K�<z}�v/)c�%-����(R��!]��;3�`5����[f-��*�slFHZD1�Q$���t8V�7�����'��9z�,9��%-����(R9�"4��Pg�*�i����`������!i	�#R���E����Qc���1&����p��f�/)c�%-��R������j����l���sI���.i	���Q�����
C����7��hJ<X���!,��)�}x��,����b*�H��Bs��>���%���O�g��O�G���|���	I(�>�Q��)W���;�G��.<X�1�Y3����YC�&��=e������"�l]�Y�z�B��{���p�&���y������&�	IK(vSE"��o���
���y�#�Y2�&��g�o�����b��Q4�!7��z~}P��������aw9�^�5xn4�m���P��e���6�B��SVcL<k��r8nf���R3��J�(�H5���kN	�������U���I�6�7�������IK(�k)E:��o���m��VH�����474X���!{�y��!b�$��y��%�������<�`5n�Rv���?���[���P��:����.\H��6�C�����ew9����(���
}I�(�������5��P��y�c�Y��B���>8I�3�R��:�DD�7��m �����54X���O2����v���KZBq�J):l����q�b&'I���%����%�PG��>1�P�������ewyof���R1�]���XG�h��rJ��S�VcL<k��k��Y;���	~}PU:������Kx��Q2Q��zCX��8��{��j<�\,	��>���[�+�TG�{�'��JH����?V��8v�*�O2���4un[���P<�R��kDk�O�����vq�\R*n�KZB1.u�D�!�o@1&T����/���: ����|����7)'#�{q�����>�T\���1K`>6W�.�����|l�d��i ?���Pl������/��'5��]�������$%N�BR��3�o�`�9��
n���x��m��K�����]�VR��K���m\���B�z�@0����yo����`3�����@��@\�HJ*���b�RT�����A-
�~����Y�x#���v
mQ�KIS.)��~s)���GJj���`)S���$%����G��(��[�!��:��w��<
���� ���wd��v��HLFR��\RE�QT��8��'���'5�L�K����z�Kv�
I9��KQ�\�
���Z���	&vM28��k�II��Rl\�#��$5�TZ�o$ex�JJ"-rI9�3GQ��m�
��P����l&��5�H f���IIS.)�b�\�Y���E���!��)Q�
.�)$5�L�a $7=����VR��K����yU�_�����3I
6L��d$�k=�ZIFR��K����y��
�����K)X:�[�GRi�K����yu5etc*s�L0�kQ�Z�p�YII��R,\���r;5���`��l*�E�7r��z���pFR��K����Y���!��+O����tH�=�Z/t����\R������z������F -#;lF �5Iy^��kW2���\R���OU0�A0?���nz��`b�$#��}��XIIS.)�b��
F ���f����������TZ�)�:GQ����=�P�[���
f���\k7�����(�������[���T�;U����C��D��vy��t�F���k1I�����A��3��j���A0!���N�N=�D0	�#��z��l%%L����������]%|A-
��>�{��B�k��4���k���MS.)����QTB���Alz�� b����&u)��Rls�=��?��4�)4h;7�`6)�����];|2���\R���oQ����nZ�J��_II�E.)���\������Z�� �A6L��`�}o=�Z����\R�3�Q��z�@0�����WU	~�^������V��\}JdO0_�[Of�o�HJ���K��&�����;�_PK��l&��� X��[O�vXIIS.)�bt\������f����L��"���J�������a��`Si)R�����+)���%�PL�E��^|���`21G=�L0�k���?\C�x��D���9r)�?���+�
�:(���H���l&�0��:{��@�d$%�y�����R4���7=�LZ���I�{�+)���%�P�7.E�t����2�)�`3���I����v�tR4M0�)����T����B%����`S��R��k���:�-��rI9�{�����^����7L����$����^���%�
I9K��(�!��O7�2��X���d���&�Y���kw2���\R�zr)�N	8��`(������f��]������54+jxy!iZ@��\��S�6�)?�����f��]���Z����T0�)�������2o���wg�Y�/_��z��{tp ����������8�
I�=�(��J���`=$!���[o�II�E.)��vs)��)���
���L{rj��`b�5eo=��e%%L���{��(
f}���p�����46L��7�����p�:#)�`�%�P<�9�������������3�,T����x&j���w��y�p�+�z����h%%�z�%�P�;��A���S���K)��|�+)��4S�m�����U�Z�_!��S�M�I�F����k�3���\R����(f���*k���T�\�=6�y�MR6�L"�VR��K��2��jJ4
��c(�)��l&��5�|a�y+)�`�%�P��KQ5�I�]%`(��5N
6L�������v-9#)�`�%�P��3?���T-H�+0�����`3�����z�ZO�%#)���%�P��<���y��B�%�28����K
�&�h���t-oVRR�,���j�_>�U�2��.��
f���\���v�tFR��K����y��J�=���o�YT�w���dBR6�ZO�IFR��K����yU��`���`>���f��]��v����U+)�`�%�P��,����������,`���L0�k������t�����D0��r(�gE�)�R�`3i�RJ�K�+)��TS�u�����������!�����S��z���W)�(��DNFR��K��Xo.E�b�k��C���lh��09$�pM�a���v�����\R���U����)��V3;4�����pM�����v
��9��O�f=��,�^�����;���A����s(����&2�!��������D���r(n;���|��0�aL��| \;$������T0�)����*_��]%|A-
������qD�&��z�i����\R���R4�)���I�.&7���%%����G����)���ji�38$�8���g�`3���8���d p��^J"�rI9}�RT���`c�2�)O�8���)�k���<>\;��$�)��C�<�U�?���)1�AM����d���`qDo=�ZvFR��K����j�G����6�E6L�Z��Vh��KFRR�,��EE�����m�#Z�vf� )���xI]2���K���9��r��B��KKrB+�����Z�����]���$�)��C1�9��`�wM�������X&�?��#z�i��3���\R������p���/��y1��KK����f2�!�����@�d$%�y�������ZZR�@���-�6��k�9��~������K�WP�L��{��1� ����-����	�&�����t��HJ"�rI9��K�`�Iz���`)%��O�+)���%�P|��j�����Z�r��f��]�����:�5v��r(��KQ?�A�^T�����a��`n��k�fnB2q]��@<VR��K��Xw.E�	����E�	t,��<�������L)�9��n���B���Z�ds"vMrM`o=�ZC4�z�"��1�dQ�G����'����o��\��NU��[k��\o=�ZLFR�`*$eP��<CQ���a�����`�1�������]�VR��K���E.E�z+�*C�/_����f��]�v���kh����v
I9w�������Y37���A������:��{��2��������
D��HJ"�rI9��KqW��i��2(_���	&vMR��ZO�����YM)V.����/����R�x#)��#)���%�P��Ei7v�w7��/�����	&vM�(���v
-�v{3�r(�i����$~O5�����n��`����<�d��k=�mKFR��K��NE�F q����I��7����?��H�\R��s)�F �{�9u���f��];$���+)�`6S��KQUSn�]S~A-
fz�`S�lR��k�����=���N�����GQ�a��!
�����	"vI����z�K&A�K����y������nepo�u�!���7�&�T���v�&#)�`�%�P��<���rw�`~@-
�}��f��]ls��']����D0��r(�gE�o ����`)%~��#)���%�P��<�A�����jm0�l&���������wFRR�,���~O
>��K6�"��T.�K��W��r(��IqW����P|B-
f�������5������kw2���\R��
����f����������DZ��r(6��x���2��>�V�v�l&��5���z��b%%�BR��<��AZ�l"-���D��WRRi��+��j>��������n=�T0�o��v���3���\R���oQ�eO�����rO%%����{�R���
X}\@|�l&��%�����2�T�Fo��V�O(������y��B�zg0,��l&�XJI������H�\RE��Q��{����P� �M6L�����>\C�|��Kz����(J�Y�#���3oP���l*�M�7
��|�:#)���%�P<�9����s�#(oP��*�����5/)�B�]�g2���\R���7U0�G�P�?��1��f��]|����]�VR��K����W�~W	�`=z��`b�$�]:>\����D0��r(�c�����=�������1d�~��]R��dB�������'#)���%�P��KQ���|������s����&����v�[II��R,\��MgzW	����8��g����|���q]�'���$2/��C���U�ggt�j����Fe�i���pM����v�%#)�`�%�P�#�bP�%��a'�`.��z��`B�$������JJ"�rI9����K��J�Ps	e�L0�k��v�>\E��$�)��C�ls55%�!U��������\BA����\�d�]�G �d$%��jJ�r)����@�/�����l*�U�7r���U+)�`�%�P�7�b4�)[����J%WK:)��x���kD0��q�l���2�;���\���`����C��DU���+!\�r��B���U�����yU5e|_W�	�4����Mt��k�i��z�5�4!��<)$�P�<���B���Js�+�)UPo�L�d��K����6GQ��
$�P�A0���dRS�����k���T0�)����Z���l�P��g����@�X��O7��w��?����D���r(�Ea���r�~����l&��5�z��z���V&�%�
I9}�RT�S���Eep�s��z����k���z�i����D0��r(��Ei0�w������_���	h6!�lf%!���[O�qFR��K��v.E��<��CL����	&vM2_�ZF��
/5SH����U�kl��P�?�?��&�M�7r->��VR��K��.EU����J��Z���l&��5������k�MS.)�b����)Qy:����l&���o��K���\�_4a�q
ng���Fd^�G�������P0�o�x����f����~���#)���%�P��3���`(�2����S���&�����vm����\R��<CQ���)1��J��7(W���`3�����r�����HJ*���baR�T�������3�s����Y�x#�~��]�N�R��K����yU���6�/���,���f��]�Ld���Z����\R��
j���l&-XJI�U�NJ�;~����5"�r�8j��X�x����F,�C��msj���c�$W��.��rI9���������t=�`�
�S8
�!yZ�y�~`@��?j���erb1������$#)����A��3�����eKN
6�BJ�2���?��H�\R�-�Q���{Wy�Pb���	�X�6��@H����'�8g$%�y������������P?����	&vM��v���d$%L�������:���q�P� ����f��]����k�JJ*���b��(
fyW	����y�~%D�`���T��o�|�8#)���%�P������28wCT	g����&�	=3�Z��HJ"�rI9���x�>����Ee�c�	��p`������z��`%%L���!p)��{������3�yl���	�$�I<>\����D0��r(��KQ��
����	�&�6���%�TdrR�g[��r(&7GQ�C��)�*8�`=�L0�k�I\+�k����
f1�X�U���`�+�2�)3|ljJ�������k���D0��r(��KQ5
��]Sb(���Bk��MM�]�\W�pm��`�%�P��EEM�{H�g�:8��X����^6��KLn���"��W,iZ@��\����)���P�()��M(e4�)��r(>�Ea7��x1�jJ��w��
��@����R�:���i�II���b�RT_��3�~�k)�S�M�J�F.�[��I��r(��KQ57��c(���&=�L0�k������d$%L,iZ@�&&���m�=�*L�6�8.�����,�����Z����\R�vr)jN����A0?�U���r��C6q�
A-�[O�;g$%��BR��<��k��9=�DIH)(�z��HJ"-rI977GQ�C��{P� �E6L�Z��V>\C_��TH��X��*�� �*�����ls��
f���\���+)�`�%�P��9��`��M!�����7����`3�������#-IId^.)���53O��1�2������&�	��vm��HJ"�rI9��RTU	���jj���znI
6L��`+Zo=�Z����\R�scR48����3R�9�K)9���^%��A�	�(�`�ax��",��� 4�y�p���2_�x#)��WRi�K��n.E�	��?��`��l&��5�H &���;#)�`�%�P��K1���>��ji0���`3���IF����+)�`�%�P��<�#��'5�LZ�������?��H�\R��<CQ�����P�s��l�=�n0��h�i�G�@�����z:9IIe��Rl\����c�tC��[���������x#�~�'];6g$%L����y��4����	��[��
��-p�k��a���k���D0��r(�gE�`�xD��NH�8\$����]��[O����t0��r(�������^Uu�CC�r��f2����Q��@Tg$%�y����`R<U��w�`B(���
�����vJ&���]�IiX�bI���q)tc�X;m�1,���E'����������I��y���
=z��z��!U����~w���Ae�.=���U�x�@��#�3����\R�v1)�����C+���re(e����WI)}���7s
S�C���G��(����6�b�f7;!��to�II�E.)����Uk�O7(� T�V	��N��O��AJ��S~ �0I����������D���r(��K�Pe>�o0���S���`3�1vM0����]K�HJ"�rI9��KQ���b���-7�� %���	��n����]VR��K����bv�`����Z�-w�9Z�&9w���v�$#)�`�%�P<O.E�V�Cf�~@k����pI2$
��%�u�����a�RT--	���B�C����&��F�Ng$%�fJ�q)������aePSF�)����5I������D0��r(��G1:�B/��A3`3iAR~���L���$�"��C1�9��n�z�@0���D=dt�A9$5�L�q $s%9|�JFR��K����Ea��>���P��}������&�0�[O�wg$%L��������)�`�0�Z����.��f��]�y���]�VR��K��x;&�MU%���0����
��3`3���m����|����T0�)�2GQQS�Rw�Cl���0�yz.=�T��o���DsFR��K���\\����i�
C�?������@�&8����t-mVR��K��X"��AMY}R���K))���+)���%�P��IqW����k�/(M��zH���48�9!{v���mz������������=�HJ���K���6.E�)�V�l&-XJ�|a�R)
kJ,���b��(����1����p���&�{!\�/����v�ZI	�����������:9o�*Bem��3��g~��`���
Db��@d��g���%�P�.&�c[��}�=6��@)�M ��JJ"-rI9�������!��X�}8�`b��k��p-;#)�`�%�P<<������-�_PK��7=�L0�k��5�}�v#�`L,iX@�o\�#_�`3i�RJ�s_�JJ*-��b�R��@�{��������?o=�T��o����{g�y����=GQ��kpH<���3$��	&vm������D0��r(�����b~
��c(�>������������d%%L�����RT
v��]%`���p�����]6�y�$���t �d$%�y����y��0����ou��	}�?m�W��)��~�']�g$%�fJ��Q�s�iCL��G6�&���k=��i%%L�����GQ���N�*CL�^Y6L��dJ��z�����$�)��C�?�PT����Tmjz�~c�wpj����@Hf=�'�8g$%�y�����GQuV�3�
��A��z��`B�������vm����\R����������*�ji0�����&�����v
�����\R�����>����j)z�� 1��KE��a�*��E��Q������1���hE�����(vM2_X���3���\R�z�Q�s�iBE�U�-��f�	]��%�-~����$�)��C��9��`�}PSB(��|����d7��`3���PM��)���Mm��.�=9���R�������P�����u�6=�D0	)�]o�II�E.)���q)�Np(�M�*���f��]����k���T0�)�����-�]%@��~Jt�o=�T0�o��~����KIS.)��~s)���=dR����A�������HN
6�y�Tdo=����D���r(�K�`��O=�LZ������%%������RT��u�
C�����	&vMRp���k�JJ"�rI9��KQUS��]SB�lPS�M6L�Z�\g�p
��
kJ��,��KQ=O	{�����9c��n�qj���7)�(����3����\R��p)��i�Y6�,�`yo�II�E.)�b�\����m�
C�������	&vM�
���v-XIIS.)�b
<�IwkM����ji0���	f������E6���rI9������D=dr�������$�Y���%��C�����R��@~�?�����U�l&��5������uy����YL)�9��`�7
PI���������z�o���HHFR��\R���R��4�3���O�����Ij�'
]��U���O�R�T=dt���|-�V�l�W����+������$�)��C�x.E�o�u����K)�0\����H�\R���Qvc�tc���w]6L����p��k����
f5�X�(J�y�G j�����Z��}�sg����x�|�������[Og���)^�v[Rl7���Q���4��u��d()C���?��E!)���g������CP�;~��>��1��a�� ��N����d@v���*eBR�����g��W�:��h^����-�k�)�/���k?�l������-���t�.+)��K.)�b�QTU�{y��j�J���/�I�L�&X��[O�V���D0��r(�gEu��{H�W��t���A�,��<������q:#)��S��I�4����2����)�H�_��HJ"-rI9�5GQ�����P�*���U�i�����l����~��r%#)�w@.)�b�Q�*g^U%�}�zAUB�z����@H~B�'�wg$%�y�����E1��}���E@�_�GpWk�9l�&9����v�[IIS.)�b�Q4���5��f����L��Z�GRRi��+��jY����C���C�t�;���2_�x�@�ZO"&#)���%�P��<�y}Zr����K�R�Z�GRi�K����Y���k�BBz���	&t-J��_�i��	z)�`�%�P��<�s4���`3i�RJ&0~��#)���%�P��<��B����2��x���	&vM����z��s���
f3���
j��Ij���4)�H�_��HJ"-rI9�3��j1�����/(�x�����-��9�Br�ko=���$2/��C�d.E����}��'��`���	&vMR��������$�)��C�.E�HCk�lN�%������+)���%�Pl��n2�4����@�`%�vMP�����U+)q0	I����gE���
j����Dk���`�p-I\+�kaKFRR�,���z{��T���Y��|l�l*�E�7
�v}";#)���%�P�..��#�cG\����RP������DZ��r(��KQu\]l1�P����g����g������VR��K��x�9��`�wM����jp���ZrxX'��ZBB2���G j2����\RE�q)��Q1:c�
��l&���,q���Et�s�����+�bV�}��s�~��q��^3`S��R��k���Z����\R���RT���~W	_PK�RR���&X3�[O�v'#)�`�%�Pi�����=��8*�I
6D��d�O�K��(�����R�\Ox�����`��v=�L0�k��@�i�����$�)��C1�\���Hip|���`�k��ln������z�5��8�����E�q)�@���`SiiR�����+)���%�P���j��{��4�WNj��`b�$���?\K�HJ"�rI9�<GQ1������I
6D���<���%��\R�;p)�F ypH<�RM���a'��w���|���yp@$���A$�VR��\R��`R�
����ll&-P�]R��WRi�K��X��j�B>�5���`���	&vM������d$%�bJ�p)�kJ�{���{��!���A�Z/=�T��o�z}�8#)���%�P�����v�I
6�,�d������H�\R��U��yp����`z�`���	���z��f%%�BR��,���Ym�z��nKy�|{��HJ"-rI9��KQ5���B���������&����']�����nV[!)����(jF ���8
��l&���S�R��t��R,s�=��*$�~��?.��
f���\;�����\R����(
������j{�`3�<��F�����c%%L���>r)�������P�g����`3���	�|{�i���!o7����C��s5%�!U�����6�����|��l&�8��vz��@��IId^.)�b���AZ�l&-X� �����TZ�)�:GQ��
;�P��x����Y�x#����Z����\R�x�Q��y���4����	&t����)��kh��i8��K����g(*jJ�C�.L|ga����`3����|Q��R�x�3����\R������<��+������`3���I���ZO���$�)��C�?�(���'���/���lz��`b�$��_�i��F��p\%��E�q)vn4)jsc*!�d$�k�II�E.)�b����)���jU��@�`��A[�G�@� ��z2esFR��K����g(J�98�CvJ����&	����a%%L���%p)�;%�kJe�e�.�	&vM�����������\R�zp)�;epK���`6��-�v�k��@s�Ug$%L�����QT�����`��l&��%� ��K��(��,�e������	 T\?�9���
f��
\��']��JJL�����yU_v���)���s�z��`�	F���k���h7�QH���E.E���C��Qupf�~u�hF���o"�AFo=��IId^.)����U��:8��ji0�M6L��`��[O�V��$�)��C���U[��T	P�~g>d���f2��%��t :�&f��WS��I������h&�rJ�$����R��rI9���������|A-
��V����M�&���[O����t0��r(��KQ�i�
6
A-
f8�`3�<��F������JJ"�rI9�������3�z���`)'@�����DZ��r(��IQwih+��2��b����&�Q���v
�hxi�BR�6GQ1^����`�&=z�� 6)����H]2���K���.���!���P)-#����pM2��3�Z��HJ"�rI9s�P���3�^���k���f�2���7��
:)�����C��`����y��P3!������f����|������H�\R����(}���\P���x�
j��95�L�q $��>�8#)���%�P|��������
�J�,z��`b����B���HJ*���baR��*���J>���\N
6�"��V��N+)�`�%�P,���
����O(E��3�����F���<�� ��z:�IId^.)�b�\���xw��B��7��	&vM2q�<������D0��r(6����cp�l��BJ����z���w�};��k8�
�j�{�?jB�l�����)�D��WRRii��E���>�
C\�G6�&���=��	X�KC�r(n������}�~/���b�z������<�`�ao=����$2/��Cq�\��G �z���`)�yo�II�E.)���(J��6�� ��`�z��`b�$��?>\kVR��K���.���[���`3i�R
�E�����DZ��r(�n���;��BeuM�z��`ps.��<�!���B�@_����\R��������C������`S�,R��k��pm��`�%�P����<�A0?��3F=�L0�����?\{��$�)��C1F.E�7�>���2(_�����&��~�']�hm����
I9�3�����!oI
6�(��F���?��H�\R��<CQ�������b��
�#
���f2�!�����D����|5�X�(J3���P�W�����M�J�F��ZO����$�)��C�?�P��}$e�(�Nz��`b�$+~��]C����������EQ}��!U����:c���Jx�����J��8%?�����8}2����\R����x����bN@������	&vM�q���v-XIIS.)�b��UU��>���2��^�l&��5�7��>\C1N���rIY����i�=&�R8���Ae\=�T��o�������D���r(��I1���0�4��4�-��f�	]�\.�[O�vXIIS.)�b�\��?�Gx�B�����|����#)qZ�2(�{��(������P��5�A������pg�~b7n�l��"�g@n~&e?!��&���_��g7�w�%�P��������_Pk�Y�`3���%�k�v-:+)�`S��IQu��������4��k��u_�5�]X���kh���u_
I9��KQ}�	�!U�}�x�;c�b��u���l��"!�����q'#)���%�P��KQU����/������6�}�	V$����+)�`�%�P<=���|M��J��ZL8B�6�+vMR���v-m�HJ"�rI9������{������he�"T�����YBr�Vo=�����2_M)V.EU��������p�M0�o�Z�?\���$�)��C1�\��7�EM��a����S��$%����)�Q�vc�]Sb����f�W��|��f2/'7
D>?Q���D���r(��KQ5���S�1��%:�B�����5����z�59�"�rI9��I1�����7e0���l&���,	\���h%%�fJ�q)�;�~W	_PK�y?z��`6)�����p�vFR��K��x?\�^[S�RU_���1��Z�fs�$����@����3�\R�'s)����������=�L0�k�AG	�y+)�`�%�P,�K�`�S=�LZ����@=�JJ"-rI9����9�`�J��C��F=�fp�jlN6�y�Mr�go=����$2/��C�9.E�y���ae0�j%��f��]�2Z�p�%#)�`S��KQ5��"1���NB�Wn��N��?�k��@o=���YI�����A��3��j��>�U���`��6��N	��z�i�Ng$%L���[�RT�y�=����	]���\m�]����[/s��jS���{�RT����c���������&8����v�IFR��K��x\���G���Y�~�SB��n6���	����U+)�`�%�P��KQ5�����B�������`b�$�/�k?y����YL)�9������j���$Y\V���J��e�8��{��@d����(!����yq)��������GBJI��_II�E.)�b�\���H�`�0�Z�i8��3`3���	v������VR��K��=����T�l�%�������4�������Ei7��#�/(EM�{�h����`3�����@��@4g$%�y(iZA�r)�����)�j�B��o��M�J�F��ZO���=m�7JbI%7J�(�gE���2�b��4�p�a3���IF����%+)�`�%�P��<��	����uj��y��~�������2�������$2/��C�?�(�������/�������M��]�����������a�*��C�?�(����M�_Pk��je�{1�k�K#{�i�N+)�`6S��KQU�������v�6�W�Ij��|�����D0��r(�g�����=�j�r��Y��+�f2�!��j�W���IHP��K���lh����)���������H�\R��(J���s�~J4;�b��U�5��ho=��n%%�BR��,��j��S�L���	3���7��4��q
�������HJ"�_�JS88�[������jz�`=�L0�k^"e��m�3�EU!)�b�R�
v��1����yG���`�"���_�5+)�`�%�P�/.E������&�2(_�8���S�5ImwD�����\R�#�Q������*��c�1�{1��z����@H.����q%#)���%�P��K�T�BT	'Z�gs�$���'��>\{��$�)��C���UU�o �&�2�N�/�T	�5�O�Yi��(.V	rIY+�����s{���	%/Hpglp�c�S�Me�J�F��G ���D���r(��K����hq\��)����+����H�\R��������B����ZM>��	>�����e+)�`�%�PL'�bT��kJ������8��	�;�z�i��3���\R��s)fM0w?�1Tr��v�7!��������!�&��������2�L)6.E������G@��Zgs"����������D0��r(^��jJt��U�2���:�d3%�]�������IIS.)������������ct���Ae�=�L�q $e��@[2����\R�'0)\8��tjs��Rr�II�E.)�b9�(J���6P�����C���s�k�����+)�`�%�P��KQ5%z�wM���D+�M�6S��5�|a-�Eg$%�bJ��QT�������AgY��?�����|������@���
/�SH���..���=.��`W�R
C�����8-
I�=s(���N���Z�Q��N=�D7]������k�YIIS.)��vr)�`�wM����J��__�^����<����������$2/��Cq��(J3�>���
�lI
6L�Z���>\����T0�)�����@�eLeP��l*�M�7r��z��b%%L����������<�A���4�>��f�	]�����kh��^J"�rI9}�R����{�MU���y	�?\gHj����@��{��@�d$%�y���g�R4��C6�,�d$�k�II�E.)�b8�(J����a�~��N6L��`v���v�����\R���U����kJe0��E6L��d$��k�II��R,L���
�pzLe0�I�-�m;�5�]~���k�LFR��K����g(*;��[u����1��N�z����@HF������� #$�(�gE���p���/�����l&�YLn�����k�3���\R�����^G�{�����{����$X��[/t�nq�BR��<CQ�C�}��
��Q�����n;�5� ��z���'#)�`VS��I�P}4�����`���t����&�����v�[IIS.)�b�QT����]S~A-
&�Hol&��5�H����A&z)�`�%�P,�KQ����s�������9�%��u=�.���%�P��Ei�?��`���[`3���IFm�p�%#)�`�%�Pl;�����W[6�(�����z���w<
v���F�����=��_rnt���T0�o eo�I�����A��3���sK:�#�~r��f�&�I�&(�{�i���uz)�`�%�P��E�v"�/9ipH<f�~�s���v���@F��t �d$%�y���{�oQ��`���R�TJ�!iZ@�8�(J�����\?������d��];�yo=�Z����\RE��UGa�}PS~@�
f�����K\+�k�DX��T0�)����~��
����MZ�o$�yI��[WCHP</.E���{jP���d�M��]�z!�\2	�\R��U�^\@��A�?I�B�$UP���d$%L����s)�������`��T��C��df-m��VR��K���6.E�V���#�Y�`3���I
�T?\k�HJ*���b�R\�����L6i�R�����+)���%�P�7���g�{
�+��f�]��*�JB��a�'��C�Js�����re0�w�UQ�fF�&���O��+$#)�`�%�P�O.E���kp4�2�<|v=�L0�k���g�p-YIIS.)���s)���^�{��j����f��]�\O�p�qFRR�l��bR����;E���+��
�f�����|���Q:�a%%�y�����R4�)k����K))�j�+)���%�P��KQUS��Sw0���vz��`b�$S�-|��*�dXSbI�[��(
f~��j����E�I���)B�&�z�[O��iv�*wv��n1����SO���\W����)�l�l�3&\��[O����k��L	����������v��v�`���lR�b��.q�}��[II��Rl\��3%�����?m8��+�gG��d�I�F����@g$%�y�������~�sd=�LZ���
��B)
kJ,i\@��s�=��r�~n���f��]L\��������w3��}�Q<tw3>��N�����o������7r�<>\kHJ�	tB�m���RT��*�����Z���l&��5�H 8��r8#)�`�%�P�KQ?�=�i���`3A�.�����`�"eQ,s�=��re07/=�T0�o�Z�>\����D0��r(��IQw�Mv�vU�P��J@�����l���\��[O�:g$%�`I����GQ}�)�������J0���l�`��q�_^�dp3�����wH�N�����VR��\R����h0d�6��I�R2���^(�j�Q-��P�:������_`T�?F�:�0��pU=�L��������$%��jJ�r)���6��B�K���l*�U�7r��z������+$�P��<��![l��PC�'95�L0�k�!����kIi���%�(�gE���]�BC������f��]�L6�����FS�������E���WN�z�~p��l_PK3_w=�L��k���u']�������J�|Q�;���tPmz���`)%s%���������
]��	��W���CM�����G6�&�I�����H������}|��G��p��B�k��\-.��f2�!(W{�i���	����
I�=�(jf����7j}MY6���4�)	�5eo=������D0��r(n�I1�;���x���e?�`3���EA��[O��[IIS.)��~0)���������
�*f>�2x��^�#���P��d��^�����+�HJ���K��x8&��T�l�`B�� ��f�	]�l*���]Cc�|�HAY�Ea0�}��C�����f��X���tfJ��?��2�������"���_t��nR��X������(J���F���M�&��o�O��������_�����l����o��3��;��~�����g�R\4C	^6��SLn$e�R)�&�	I����(�����P3�q����&�6���k�JJ"�rI9�����?��0���`�w���X�`3����%�~�)�KIe��R�\�����Ag�:�t#m�l�5��-��k���MS.)�b��(J��>�C�i��F�9$�`�H�I6���HvP�������&���9q)&m��3o0v�z�� b�$=�u�\2	�\R���RT�����3FP��|������`B�����w��ssFR��K��x�\����|/�'������f��]������a%%�fJ��Q������R;��?U���:x���+���Z�����^�&�e�y>�W�����%��C�y�
�8���I�R�������H�\R���(
��0X������`3���I~Bk�]C'z���rI9k��(
���=J=��3o���z����@H���#G2����\R�v0)����P���J����?��E!)�������~�tc(o������p�K\��v�vFRR�K��X��jKl��P�k���I
6�c�	
��z��b%%L�����GQ��4�AM	��~uOI
6L���*��']�.IIS.)�bfQ����qUUBL���X�2��l&�0Q�2����L�VF+$�P��<����8�|����|R=��MN>!\�P���]���$�)��C�?�(�f����3J=��3�2���D�U,D �$�#%IIe��RlL�I�53
N��P�u	i�U+�5%i�)��Dkx�a�4)�( ���A���$������G�`�+��\���)!�d���?��H�\R�������J�;���+�kD�M���h�5����z���FS\���n���-�z�����2��c�0�A�����d3�]�L.�ZO����d8&��C�?�(������Z_PK����Z6Y��]���j���k�JJ"�rI9�3����hF#+�S�)%������������]��YL�,��fDh���RU���e�����u���^�"���z:�IId^.)�b�Q4G�0�6�(,�d$�k�II�E.)�b�Q4XZ����I�R�����?��H�\R������z
��"���-[R�����7r��z�5tw�^J"�rI9��Ei0��)P�[JMj��`b�$�"J�p�'#)�`VS��KQ?�=�ji�58l�0��[6��*����x���D���r(��KQ5�~
6
c(�	���l&��5����>\�VR��K������|��A�������o�+���������@l�������%#)q��2(�{�Q\���m�l"-������$%�����>GQ�C���P�*�l���#���-��f��(	H��m%%�4S��Kq����?I
6��&�I�?%%���������f����)1��"�gp"�����A�pd=��;�K~R�L�	�HJ��K��x�9������UU�3��Y��<5����d�,������$2/��C��9��`��~C��p�U�������f?)���y�p�$��y��+�3��x���r(����H�2������!���l&��5�ko=��i%%L����q)���Kz��_P�~f���������m�	���t R2�����������r~,5WMU�_�o�C��A����z�o�Z�h��n%%��%�P����{�w�A-
fk$g�f�	];%�I����HJ"�rI9S�R��U�!O]g<8��0�D��l&�8����8#)���%�P��I���v��6G�b)%�������DZ��r(^��j���ja(�I�}�	6�\�5��U?\kVRR���+������jJ
>n�h�7�|���Y�{���\�Q$�DG��VRo�\R�'q)�?������VP�ls#��`yo��%�����a�r�Q�v���A1��\W]6L��d"���]�HJ"�rI9�>GQ���"�Fr-~K6#9�Z�sj�p����
f3���U�Z{��`B��i�fB
����w�v��M'
1����z:�fR��N#�7����G1�O��;%����2	���_II�E.)������p��Y{��Pe�b�x���`3�������T ��FR��K����\�����l&-X�] �����DZ��r(;��Wuc�MvT0f����$������T0�)�����}}�;�*�?��;������������%'s�3D���`���A_	�y�{�5��{�v�
���`���	&������$�"��C1�9����K��������,J�x��f2�!����f8��%�(��K1����%�RU[�6xr"����95��;��I����h�N�T������Q/9�z����{��'���=�L��k��l���v����
f1�X�OU0�����Z�|����Y�x#�~��]���R��K����y�*�u�c"������F��7��.� �k=�Z��U�]�
?�������y��t�^6D,��w���?��H�\R��<CQ�Cn�CB(���g����&�]���t�pVR��K����yU��x���0�1���	&t��t'�����S�RR���+��?T�|�J@���ag�
:�r���2/&7
D�?q[IId^.)�b��
�����IK�IY�_II�E.)�bM\��Q�Q=$�2��o�l&��5��r;?\+VR��K���N&�S5��nPSB�C��
3����T����Z�zmnwj���f/:��z2{>9#)�����A��3�b6HK��M���2K�l%%��fJ��Q�vc��CPQ���w��/j�;�=z��w�I�F���8�O/%��%�P��<��*g^�H�<�d�~.a��BE���@���d NT���@IP�3���|=���>���z��`b�$��>\C��n�$M(�I19U0�w��������'��z����@$���?>N[�KId^.)��?���i�N��-��i �,����#)���%�P<�Ea��O7��m���K��
�yng����0 �=���d@����z�)����*_%�;�PK�.=�T0�o�Z�>\��HJ"�rI9�����5%�!USu�
:c�":�T]��	`6+�v+E�~��FC-}�c�����(�Q������y��HJ�M�K��#����y|� H@�7d��kSm>�����APc���`3���d+Oo=��j%%�z�%�PL�KQ�[)m�~B��y����&��F�����z)�`�%�P��EEg�{H��%
NM�,F-�:5�L�q $%}����p�K�VP�L�������M��J�FR^�T��.-X�m����(��k�1�AMy'=�L0�k���N��VR��K��x'.E�tu���C�����	&v��\�����b�"Y��H�{}�Ro�\R���QT���?����`3A�.���4�K�3b3���(
��<8�
C����[p(���Y�&���2�Z���=��/���Ei0{E0��q���y�C3����`b����z��d%%�BR��<��o�~���������������M��`���oz���gO�������u8#)��K.)�����(��R��iY,e�J�%
+(V&E���k�WC�_p���<�M0�o�����k���D0��r(�gE���+���~���SR���&���[O����t0��r(�4GQQS�2��q��� ����~�z���{1�Q �������D���r(�'��j�sV�c(����$5�;�a� ��5�@��z���JJ"�rI9��Ei0�w�����>�|����S�n�@�C
���`3�>��do=�����$^/�����GQU��������!��f��]�T�����5+)�`�%�P��,��
��>��!��K���Mn�'\\C����k����$�)��C�?�(��*���K��385	�P��z�P��(LW��P����f/K������XII�^rI9�3��.����c(���]�l&��5�(��z�������YL).E�\�C������I��A�\z���)�(����(�IId^.)�b�PL�;��`g���`�=9�i��7���_�i��S���\R�������(���1��U�{�I
6L��d)B��=�HJ"�rI9��R��*���*�NM�,6���mz����@l�������`#�^J"�rI9�����vX�!������?�f�v������29���H����V9�o�BR��<������>vuj�����:���`�'!(=z��@dM�68]�������Qs��5?mC�T�ah����X?A~�`y���;];�����k���D0��r(�'���5����W��{��
k�h�?1���y�`�${	z���Ug$%�z�%�P��<���f�
V�B���	&�g�f�	]N�Z#]��IIJ�����7U0��x�C����g��X�'n;3j�����Y�6�W��������-`7�z�%�P�������`"�������d4�bpI�qf=��;"�$����V���$����g�R�.q 2�U��VaI�C��(d������WOwx���#X����8u�AI2z����P�T�"{d���?���j������hi}0�����za)G������DZ��r(&���U����ON@|�KE6L�Z�|�J���d%%�bJ�p)�������ji0���
f���\���k`u�^J"�rI9����=b��!Uc��t�,�f��I
6�yI�zE:����$2/��C��\������O��[��q{=�L0�k�x#�n���i%%L������(
�{�=���Kd�`-����f2�!���l���R��K���l\��E6��Ag��6�5��f��]���J��]2��
f5�X�
����M��J�FR����$�"��C��s�����
J5���k�;<	���	������H~�j�X@=�n��K��X�EEM�3��K�e�zA����l��{"����z:��m�&$�z���Yw�
fB�������Mt���]0��[O����$�)��Cq��(
�y�*B��}��h����`3�����@T:�����2_M)V.E�\�y�;c���~��l*�U�7rm�?\�7���aXR��a/��=GQ���g���C����	&vM0�[O��XIIS.)����UUBxou!��U�������N
6�y����z2�!4�*KP��3�����CT	���	&vMR%���k�c�a8� ��C�����J��j3&X�<6L���$������T0�)������������l
O����H(EA�_��K |x�l��jR�Q�~�'������%��C�?�(��-��9���RR���WRi�K��3��j�+�a(��5��n��|��Ij�~��Z����\R����x��@�����$WFS���$t����)F���IIS.)�b�QT�u�=��u��rN
6D�������*�L�(��C�?�P��i�tC(�$Wl�Ih��i�`�B���dY-���_�����JJ�(���AMy������RJ
�_��HJ"-rI9�3�bPM����(���`T�z��`�N��_�����l��������z:{5II�^rI9�3����SAK�����R2-S�_II�E.)�b�s��Xl��P�-��}�E�C��Gp����E�#8q@�d�S���d���$����u�RT}
����������f��]�%����V�[���(V.�C]���XuAx���7���z��V�VIB�����@K���\�4-�����wZN��l&-K����#)qZ�2(�{fQ�
zm��B���>7�/��tc���w���t�����D0��r(n'����H����f���|a��WI)}�@��FS�G��?�6^h�pR=�)��`�f�
^/�8.�|q �%�h�����2�L)�9��`�o%�PY��f>��8��#�.4�18o�<=�����x�����fx��BR���RT�!���7j�\���j�l2�@�&�K���]�VR��K���3����8�������Z�s��pl&�c�8x#�������G�X�}�3p)����{����f�Z�Yt�����dB�S����'#)���%�P��j��3���F��95�L0�k��St�y+)�`�%�P��IQw����U�R
����bO������~'��.���X
gOr�bo=��f%%�z�%�PL��jtX�1�j���R-����0:/��`3��.X~�[O���HJ��K��xy.E������f
,�dtxo%%��������Z�V'�}Ai����A��S��d���~�����|5�X�Uy�`;�R}���{�KEP��4�'�w�J�Fyn: uwFR��\R�������a�u�U��1T���������5#V?1�T����E8������z:{�����%��C��\��
�&8RJ��m�+)���%�Pl�Ei76�C�`6��	&v-H\k�-`7�fJ�q)Fm��O����=� ��*�&��z��.���
I�=�P��mph���O4m����_��?l�l�3���U��d@Z���x��r(n��j��
����Z�=��f��],X���]{���D0��r(��KQ���������Pa�W��'5�L�q �oz��@ty��$2/��C��L��S��@��Z�A/�M6L��)�	���k�ML,�
�~�R<U�|�O@i�w��G_NN��B�S�����4�����(V.E��0on�@-
��&�l�$\�����vms�HJ"�rI9��I1l�`��B-
fHz��`B��`MLo=��n%%L���!q)������I�R�������$�"��C�?�P�vc�]Sb��NCZ6L����bo=��U�>�*$�P��<���=�����O7d�
2��l&�8Y�������2�L)6&E�	�yk�`~@-
f~�`S�lR��k����5+)�`�%�P��<�����T	PK�ye=�L0�k���_�I�v��3V	rI9�3�bRW	��4���l&��%�\���*�L�(��C�?�(�j��}h�RV��g���V�C6���HNr����XII�rI9�3��fK>��J�P��!��j]��>��3#���^�%5�����'�N�k=��#&#)��K.)�bfQ��u	G�jm0�l&����$������T0�)������8�w�P����|7��l*�E�7
D�>Q���D���r(��KQ5#���3�P����(vM2Jk�v��d$%L���-�Q����Bm�s1��������f��j�rn���8�[?��e3��b��7�yo=�sKFR�7Y!)���g�����-�H!�`��[�GRi�K���ms���{;�
�Y�`3��������+)�`VS�u��4��{�1���U�����u�zEP%l��q��l���R�Q���#{5II�^rI9��KQ5
��J��7�vx�~����yp@��z2 �;#)�w@.)����w��xx��	���A�������z����@H����������c+!����?�U��`+�R���m������Y��w�]6�z��	���'�7g$%�z�%�P<w.E�4j|C@����`3���I��g�p-%#)�`6S��I�PM���B3e0
�l*�M�7r-<�]VR��K��.E]�����2�)�Y6L���w.������a83�%�(�<GQQS�R5#�G�@^5�M�e�	�~�����l�������Q��d�R���x���r(����������PK��=�L0�k�_�||�v;#)�`�%�P��EE��{H�eT9��,j��%5�L�q $����@�=IId^.)����U�y�,B��A0�l&��5��n���kh1�i�cI��Ei0��c~B)�}���������Me�H�F����@��E�R��K��x_\��*ap��2X+��2��PE�5�t�?\C��g����8GQ�k��B�����`3����@�x��k����\R���UU���y�JS%��T	u���dB�Z��@����R��K��X7.E��58�C|i�h9S����kQ�S����C�I]����y�����N��h�~������w��z��w@Ln�Z�i�np'�^J"�rI9�����w�_kU��s�,��}��]z���p �`S^o=������WH�����EQw��=XM��t���v��T�S����\3�e�"V$��TSJ�`Y��j���������6�X��T���`[�n��u�c�`1H9	��C��S�M1�����v�`�z�rZIIt�rI9�3��n{L���Tz�F+���]�+���W�X��K������P��v��NY���@�*au�����C���G�Z+U�������z�"f�
o,o�f��R��l�g	���`�o=�g�+II�,�%�P��,����sL|b���>��yv����5����z���JJ"�rI9�3��f�p��9�J�s�3�2_�l&�8I�J�;g$%��jJ�r)fU��c���5�����#�����M�U�7
���t@n+)�w@.)�b�Q�`���P8g�������\���v�&#)�`�%�P��<��*��!U����?��`)X
`��n�B�N����Vn7\
���C�?�(�����`��Z�^+�]6L��`1So=�Z����\R����x����<J@��}�y��alz����@H�N��������T��)�6GQ����Ju����_�"�����=��;��x���ZOd?��$������GQ������PK���l&��5����z�5����L�����GQ���\�F@��|;��l&�8�k����@����$2/��C�?�(&���{�8��X�tz��`B���X��z���JJ"�rI9�3���
�{ e0m�8=�L0�k�1����kh�Z2���K����y����R��dp��B5]}��vm7�3�K�~�����'� ����^���x���r(��KQ��������P�5��f�}��dL_#��G�m����\R��u�{H�:����������e�S��@����q9#)���%�Pl�Kq�\Bv�l&-XJ�@��^%�����k8�
�j�{�?j����V����@@�@��M���o��k��5�9C/%�jJ��QTT	��>T��^��������N
6��*�b��@�K�R��K����\���&�`�3�Z��"�I6L��`)Bo=�Z����\R�=q)�j���1
Cm�����7��4�l&�0�;>{��@�]B��5�
I9�s��0���E	(�*��N
6L���'���k�6L��D0��r(��KQU%��yeP%���	&vM����k�JJ*���bcRT��q���a��J���
�����Me�I�F�8��@����R��K��x>\��5���h	(���8X��.=���rz��/�8 ��kWo=�x 4�wKz,����e?9-��1���51��$%������R����c1�_�P2g��	f�����k��B��D0��r(f���=Y����o�D��bm��S��dB�S�ZO�:#)��S��KQ5��;5 �i�_�l*�E�7r��h������\R���RT����)��PK�yG=�L0�k���?\z��*$�P�#�bTW	��TM��-�d�4��wj����@�����q;#)���%�P|<�bP��i��C��h����	&t��\�����9�d��,VRo�\R�R�
�
�[6��*�IY����H�\R�zs)�Fr�
f
Fr-��f�	]��aNK�kS���f�j2�V.����Q�%�z�A��
�O����\��M\XE�&A����A4�i5BR�����GQ��8��}A-
������J \������]VR��K����y��C�v�g��C#������#)���%�P��,�I��<�/���ZLp�as�
vMr�Ko=��v��,���jBjp+;uj+t���~��+���2_�x�@�ZO�#�����\R������:p
v-~A-
��I
6L��`����v-ZIIS.)�bfQ48��:}R���J)9������$�"��C�?�(�j��}��~����	&vM�����v�JFR��K����y���=��AkR���tJ\�:�l�XM)V.E���=8I�ji0���
f���\���t�F�	
�RH����y���RJj���`)[%{��HJ"-rI9��Ei76�?���Sbu�wMy{e�0��e��!V0 ^r�So=����$�������Cq��kG`&�1)%�T�Ji��X.)�b�QT���GIc(���jz��`b�$U����k�II��RlsCc��mPS�OR�M�I�F.�Z/t�������3��j��38mBm���������A���S$���d8 �C�z���<>II�rI9�3���
�W	z���`)%W	%%����%p)z�����K)����WRi�K��X.E��gp�����D?�����v���db�|�m�#���D���r(67GQ����vj��Y���\�Z�p��E0���
��Kq����]I
6��"�H�[�GR��($eP������U��xB������MF �k�����t�l�HJ"�rI9����^W�OU�ep_f�~I��{=�L�q �E{��@dg$%�y����,���{���q�<��Li�V�|.� 	 �.U�x��H���53��J�����qen����J������g�M`D����������s�@��.$k�����Y;��D�9.i��6"����)�]�[(^ck��.���Y�C��z<kt�������|�8B������y	0�@glNz�.��=���!�[��D<?.i�9[zJ���ezJX�������5���\�c�g�EM�ee^"�5{>�.�-k
8h��.���Y���}����D�9.i�������=X�[@)���}���D�K�2 ���|Hx0��A��,��4�U�:(;D%��xhq��iH`���B}��W���XyQ���H��*���P]B�V��.���-4\/YAHJ����� ���R&����P8y��I;��K��M���8�E[�2m�{��<���-���Hy�K��x�VDG2�
�1_B���VVY���H����W�g�!)c�K��x����%��I�O�1D��q������!��3������.%��qI[��q#�<%�%\��0'�r���-�J/Y+RRb�L����2mq��C���2�����<�L��3d<�F�="�!�-I�x~\��t�!�z����I����
���x�u�Z��er��#��1�%%%R��� f��H��XK=�����"�x�,�*7�]�C�<��b��G4��F������x�Z�,�]�xc�H�[��%�%����`G��Y����z<k���U�p(�[��������Q��
�Iw������n������e!��� �x���5�n!)��K���.���d�z+*
3����Z�Zz����3fEL}������
��~��q�|$M������-N"�n?�=��]���h�'�m�=�.BR"�5.i�v�"��QM���5�1wO�cL8k[x�W�gm��1���-��oE$5$���>*P�}������1�`=��
10�}_=nh9����I[�iE$�:&?�@(���<��s��_v���� vd����Q��EJJ��%mA��!�fH�^��p(�{]��N���z<��"�bBRb�������^���9��V��_�>��	�e�<�)k�����@�m�qI[��m���
�aY"���=X�1�0�S�>W�g-II�s\�DZI]�[�0�K�=Oz�u�W�7����]��z����wi����sa�)�qI[��m��h�F��X������$%��qI[��M��nO��,%�%�B�cL0k#z�W�g���	���%5��q�����P�.���{�����|��d�����V���D<?.i���
������E���+/=t����:#=XO
��[�5��RR"50.i���	q'����H(���r�`=�����\����|*A�1���-���6D���\xEhH��xx��vz������O;n��II�x~\����"������e�(�=X�1����mv_=�5#%%b�qI[���8j��To$�@��=X�1����Bsz��q�%mWw��
	�Bn��H%8���p���x6@O���r#>,yCY������*�4�)k���W))c�K��X�VD����w_CQF���3�i��`=��
10~_=n�[Mk�V�!��t�o��I3��a;8����B��y��dm�5�}�x��EHJ����� ��q��K��P�s�i[��z�	gm`���z<kYJJ����� nk#�#��>��.E��>�\8�s�~
EhH��rV��2=XOy��sv�{������+�"�>�Q�?,y�C��������y4�S���%k����1�%mA��>�Qc�'�!�"u0=�Iw��a;�8��
l���Ff�6�{#{��W�z�t���Hy�K��hB+"��9�<���7�I�������B�����))c�K��hm+"���Y�I��"o{����z����
���=9�}I�t��f���G�w����Hy�K����VD�����,����������+/Y�RRb�,����43~��L!��K�`���Q��vW��}�iTM*�l��xod��_����I�����-��jD������%� "=X�1������_��II�s\���G��p��<�{�4��>�O��A��!WzXx��%/�f����z*���tft/6/RR"�<.ibtm�n!�b��I0p(�z��n!M����h3p����+�B�S^����nU������"$%R^��� {+"ib,?|D�����B�cL8k�o���������1�%mA<�VD�.��g�.�r�z�YRbnI���q�u	���D/h����
���>O���Y+RR"����:Z���r���R��*���q���-���!c�����<B
��f!��<l���t�������K�x~\��l�G=���J��,+=X�1���4\e}����D�9.ibY�G��p�jXmQ�E�=�z�	fmY�P�K�.))1cfQ���HYmq-���B�����Qy���:�D1��q_=f�;sBR��'H����w�N�|��������Fz�������������EHJ����� �������1�P�����r�c�Y�0��z<k����1�%mA��!�1�O]^C�s�9X�1��
<t�W�g-!)c�K��x�nC�~��;�a�'�@�cD0K���Y���ei��"� i���qp�\���%�S�D�cL8k#
��������]����	1�!����	��(#[��_f�O$k+������D�9.i���
���YF���)��`=���6�p}�����D�9.i�����S�#$���k�c���������x4��#��5���3r��� ���v4)*�2"������'I��e\���w�F��Ot�P;z�22;p�F�>W�g�JI�3�"�VD��V��������<��Yy�\=����D�9.i���
��S�#$in~_c�����|0��<l������G
�C�����I[��M��������	��2:����=�z�	fmd������mRR"�������H�����P��<�4 �!��i@`C���?W��!)��K��x�nC$����a0C	��^����p�F�"?W�g
���
���K��XZIS�{y0&�	Lr%hq������Ff�����"%%b�qI[���H��2�C����]B��4��3����t��!F��qC�-I�x~\��[-����"H(���������-����A��
���H��X\��1�cB�<����@�����S0k~���}�x�.))ac$m@���q���fH(����
����>���@���Y+AHJ����� �K+"���GH�����1Ha<���z<��"����f�	z��q �>�Qc>|���o_�-��^��i4�S���%kQJJ����� nG+"i�������[(;�O��8k#'�W�g�
BR"���q�����C�<�`8�0<3p����4�-�5m�"x��k�h���"
4~Z�d?X�������D�2.i�]�	;`�=��2����.���,	6z��6!�VD�<�{�=-��2���8���%kNJJ����� ��Q`��C+�d�<A��Y�a���[�%mA��qt���*�����IQ�$k_?�W�g-!)c�K��l"�������)K��~G�F��H��,	6z��� ��qp���C����@�=X�1����{�Z�����C�Rb�,���������%�SW �2f�����z��.%%b�qI[��Q��;�1S�������8KJ�-��� ��q#=�xW?�����/`VO�c�Y�F�a/��5�nc�K��x�VD����@�`�?�u��'Xm�u����y��5�W'�����	z���;���u+�)�����wB�U3����U�BF���a��ax�<&�	�E<f��7�G��>����<�-`AdQ�<� �E�0�j�0IM�0$U_�=�0��a�<��g��6V���n��"�D���W�	��U>bCY��&�	��"���	���U3LT4LE3
s�����|�>������.E�m������-��H��"n=]!���
kx7��j��}>���[�D��aD���p��1����[�D��D���8�
���1QM�0�(b�T=������2�9XB6�e}�K�o_��(�V��/�*x�����2���M�0�jn�
��"n3
c�
�����&h#���fs/���'#c���/��Q$��&�,� �f��o^5��j��9D�����
���5QM�0�(�5�0Y�0��-�,�|��-f��� H��"�ebA�M�0Lm�3�|�[�D��aD{�l��
�aecXB6�}>���[�D��D���8�
���1QM�0�(�1�0��a�4��]�n��DE��.����a7u>���[�6�-PA�T}E����0���4B��$i�7�-`A8Q��oL��V�X��d�XB6��|A�����HZW�5����D����
s)�[��2�[�2�-PA�T}Et���p��a���&�	fE�f��f�A�>����oyI���&VX�A1�,x�gf5��j��9D{f���rX��es��l���|�"�_��(�V�����<I�WD�L,x���Y�m���a6Q�m�a��ax�4�
cD�L�8}��[n��s�n	�DE3��7L�,�g���[��n�E������� ��a.��m|a���HZ�%,�I�W��L,����Y�m���a6Q�m�a��a6����V���n��"���
�4����n9&�,�C��Y��a���� IZ�%OtXY����c�"���k���}�]\&�	���+b\ffS7���D5A�l���L�}���i&�	��"���q���U�MT4�E�xn����E���������w��Q$��rLtX�(�1� .}�����.V���n"�"��q,����ql�|����x�%X�������&_���HZ�fG �fR���T}E<�"be�C�0A� .}���-�D��q�"^3"��W�<QM�0Y1O4���&+�����wj���~��J��l���?��_��O?����k�����?W������}���}�����������Q:���.�a	�����&���G�����F u�"I�W��PD�s���,���w)�]�>_���k�X
P��T}E���m��aVs��&h�Mq�i�o�Ms�oy/����oyI���&VX�A�gJ��D���dNTE�d����(��n�&�,�K��YY�0�j��j�����y�a��o��8��M��I�F>���qVC2�*x������,x�o�YA����%LtXA��+����o/������N�_#�����E���������O��?��g����������[(Fob���Y�h���.}>���1�Wc15���D/E��0Y�0�j��j�����y�a��oV5�2QM�0$U_�2�0��a�<��g��6V���n��"����
�����&h'��f&��i���e$Ik���!�xt r���'��[Q5���>E��-y�[�����ybA�E�0Y� ���G��rK�&�*����e�@�>��`
��Id���|N��"i�7�-`A8QD7� ��a�fA�|����#�C��L�*���k�]������E�:�O`)X+(s�&3�Y��
����_~�k���_O��'��_��_6m>\��wN�|R�����aMf��n#����o�
-J�%F��^�����������M��
��7
K�F����4�}>��u���wB�V��Su%#���a.��a���|Y��buK��� �(b�X��oV5�e���aH��"��L�l��aVs��&h�Mq�i�o^5�D5A�QD3�0N�0�j��j��q��n�a��ax��
D�L����U���&h�C��Ap�6�����`	�����.E�m����|�:���|F�o��s�|F�/��Q$��F[�x7�n�$U_�0������U���&h�Cqf���wh�f���wh�f���wh$I�j����<I�W�}�X��~����6QM�0�(b����m���e���l�s�|F�/��9M�C��"i]���j�C��F]'��I�����7yw�'.�{�E�:�a�����b	��g}������1I��g��6M>��g4��>&)��F�`	��4�.}�C�/��]�|v���HZuKv!tKR��T}E�Kb�<����c��P���n�A��h����>������0I�����-���.]x�`����l�;���&���G����\�����AHM��z�"^����X�4EQ�XLMv>���Q$�����n�
���+�[�G��PO��������T�|F�o��s�|F�/��9M�C����+w���;4��>����}������1I��g��6M>��g4��>���;��4�^���5�^���5�A���5�A��4�A��4�A��4�A��4�A��4�������/��Q$�&>C~��RjBs�$U_CVD�j���&+D����$m�3�|���[��0X
B�����QD��^�F�o����II\���%X�c5fx7��^{A1t r���X+(��U�����;4��>���w,�|Y�oS�#IZ�f�6q4�l�����6q�>��ax�4�
cD�L�8}��4��9V���n"�"�ly���Y�c���aQ�c�a��!���&�	�E�fF���Y�<QM�0Y1O4��������LT2��H"��L��O0��MT4�&���������=��|m�������0I�?=K�.>��w���K:��1�#���.��/%�����`��a=����?�(]~�`��b	��w-�|I�{����SSRjH��"^�"be�M�0Lm�3�|�&���3�|A���V{�X���D����7���D5A����L�\���U���&h�K��@�>���^�+P5��s��D5A�dQ�<�0i�7����S�}Xq�'��.%){�1��j�����GR�1m���a��ax<������[�D���D]"� 	{X�9U������|�>������.E����Q$�F��L�����+b^:
�a�v��U�����Q$��b&�,#�h�G7}���X{N��X������%X�#��������k/�"E��0��ax�<&�	�E<f��7��9�f}�K��,�|Y�oS�c������m�|N�O�C+����|�
Eam(���-�P�C�� ro�T����H�������^GK���Q�n�2���c����B�����Zz����,�_������J:���&^�P�%��C}���K`K�BJf	���i����W�a	���I��K�.>����(��c�o'�����'�&x
�����H>w��_I���n��(m�4�k��}`	��w��Q$�=�{�!5���D�v�m�6�m��a.��m|���G��r��LtT$U_����4���m�^D�Md�(�(v>���i�9}>��u�9B�mRc�Et����my�OS��f��&�����`	��!kc��,Rj��w�"���a.}�����.V���n"�"�D�U�v�ZA#c�LY��-��CR�q[���k}�^�P���X/�O;����HZ���� !5��3��F�2��7��,����4�}���w����~M�vp@�D��Z�7��y���a�(b�h�}�7LVAw���$i��}��� �Mq�:�W��X&��U�u�i&�	��"���q�����^���`]|��vK �Ej%5I�w���X��7L�,�K��`u�5�-`A\���������U3OT4LE�
c}�d��l�|L�6�}�wIG_Y�z%9\
�P�����;_��s�|�>_�����M���w)��E��"i�����q1AHM�7#���hE��0��a�<��g��6V���nS5�M"��p��
��&�K��hI����V#���X��Xh�Xr�"��;�g�i�v��15���>E��-y�[�����ybA�E�0Y� ���G��r��&�*����n�@\�
��~�*c��5����U
�(����'{�|A��i��|A����;4��>����}>LR�o�����������Q$�o��KJM�7#�����"be�o�YA��i��|A�����$����g�`]|!d=�e�h&�WI�w�����0a�7LV,�����$����n�
���+b�i��7�X;!�y�&;����HZ��MtXN�u#�NG���H����t��w��Vc�����w�"���a.}�����0I�?=�K�.������1I��g��6M>��g4��>E��n�n$��I�W�+����U���&h�C��&��~�X;!���&;_���HZ�%OtXY1O,�c�7�&����������3�c#�E�K~�������X��f�,��g4��>�c��0�����af���yWs��@Z�~�������[�>���w.�|���_J�K�>T��/���u���BjB��������X��f�,���I��9�X�u�9B����>g&����	[��%��x�{1h����wh�e}����2����,���
������/�15M�g��2QM�0$U_�e�a6u�0��MT4�&������5/��62�k�j��j��j��1��f�a��ax<�����&���4�.}�C�/��]�|i����|�:���|�
���|����y�K����y�K����y�K����y�K��?��U7�2�����Uu�"���8�x!�_3���?n���V��&4q�|�:I���y{7f�R�=����y�@���;j�%�7�&I�;4q�|N��h�}>��u����;���� �:�?;�X�)���f�G���&h�C��i�K�0<m���|�"_Y���&����$i#����4��>����|N�O��`���O���J���A�,���.B��[*��-I}�ER��dE�/�q���z��~������z��{������l�|4Ik��vnP�-`Al��=�0��0X{d���l�s�|Ik���n��"�n������X����7��En��%X_ ���y�3!5��;DE��0��a����|�"����!����oc	���Ijwn>���o{
I��|��/�������F����:����+��+�}�8������|�>��Z
��j�E�:
�a�N���"�����
�E�D�l��aX����jB�!����-���SW�=,eCYnobm��RH<q�;q�k�>
�	zsE�+�}���i&�	��"���q����h#_��s�|�>_�����M���w)���>_�����v�m�&�����I"�3;�]�CcV�LT4�E�������n���a�(��@t����3'c�������|�>������.E>���eM�M��I�F>���i�9}>����3��?��3��?��3��?��3��?��3��?�����?�����?�����?�����?��#IZ��c�l4!BR����_kZ��'��&�f������&h�K��i��o^5�D5A�dQ�<�0n�7�G�6u>&I��>����KC�dQ�����s`q�}`	�c'I�WD�:�?�vXo-�y6�&;���4�.}>��u5\�,�K��Y�Y�0�bA�E�/s��/�I�WD�L,���Y�m���a6Q�m�a��a6����M>����{�����|�>������.E����eM�M��I�F>���i�9}>����4�A��4�A��4�A��4�Q��4�Q��5�Q��5�Q��5�Q��5�Q��5�Q���I��7���%X�EY���<>[GV��$����"�W���aX�<��jB�!���x,3
���Y�m���a6Q��At�6���U�0K�F>��g4��>���;���&���wh�e}�K��\���&���G�����3��PCAR����P��
����g�h9X�g���#�!��f�v��f����"�;���u�r�~����n)?W?IJ�-��� ���������>��-�4�[g)e�,�����+�����=?���{�#���XyeQ���H:����`(������/2��������z<kVJJ����� ���7�1C=�����>�yG�H����Pz")�V�J`K�#%_/\���<��s���oy��D*y\���wb��
�`=n�#����'I��e\���w�!
c6����3o����p��@�>W�g
����	K���=��]|?
�.!=��A� ��B��y�a���i��|E,�����<
W~c�+��u���{������))c�K��x�nC�<�u{��P����r��=s�c�Y3�Y�����!)ac"�Z:���m��d��1�BQp0$�����B��%\k����
<h�W�{���)�qI[������,�J2f��}8�k�k��`=�|�ZK���}���c��!%b�qI[��m��9d`���4iFd��1H�?#r��B��y�#����QC|������-���6D���kc�����������-�s�x�����1�(biD\�1��K�C��q��Jz���Cy]�����Z����;<���m��+����2�����Gm�;(���;"�c@��!�/f�C��q�r`��}���D�2.i���
�4]��z�Cm�q!7���d���8��F��L�,���d����T2h�m����Gmnv))�J�������������W����q���-�aiD�I�����>j�����L8�D��y���l���qC8������%�9S#�%=���p�C��<�����A�Ui4��A>W��.RR"50.i���	���}���>�}��_C���8��@o��s�3����AHM��U�����}v�4��#Q5����D5A�DQ������%tWu�4N��
����?�y!�G���|I����+�|I��Z��(�Vc����uJ�	
�$U_���H;����b����(s�!�8�o.���o����|����0�����B�K|X�����Ec;"�������715���>���W��(���P&VX�E�L,����(D���H�Vn�`�[�� ������Ia�
�k�����n���E�����&�?��U������HZ����� NQ�sfA$}����&�	&�"���)��I�#h^���&���G�����O���I��"�}b�g�o^5�D5A�XQD;�0^�0Vs�� IZ�%NtXQ�g��{eu��M�0��V���&h�S��i��o�6�}���WV}������1I��g��vM>��g5����.��YB6���|Q�/����|E�/�����?�`@?H������g?����~��?�[>4C����P�7��B��Kp{U:`����o�K����Byn���JO���.,!�vm>��ue�vr���?R�vQ�z�S�2��7��v���a�(��i�o�9�F}>��w��a���j8	��
�E<����0��IO�.��,!��>E��-e�[��(�����
�_��w]eS!+5�u���aH��"��L����aVs��&h�]q�i�o�w5'|�}�[����K�eo���,���<!d]x�����R[�(bTD�s�&jD��;5��>_R��V}>LR��o������p�Y�`]|;!d5Zo�0Z�GS�q����a��a�fAD}>���8�-`ADQ���'��m"���r�������XSdelYB6�%}>����������`Y'Q���X��&)����M�]��$iU
�>���'��������0X��d���l���|V�/��Q$��!N����(b�Y���ax�<'�	�E<g&��W�4QM�0I��k�^��c
���=TMn>���M�]��I�F>���k�y}>���hf����I��"?q�6Q�0^� N}����s�[��8E����
��f��&h�$��s������ c�������|E�oW�c��������|^��j�E}>��w��EM���wj����������������������a�u���YB6�y}>�����&���5��>���W���"�_��I7��������������KJX������]�|��~��H�Y��Y��.��|I�9G��� �&4�JR���D���=r�d��F�d�K�|�&_��K�|a��+�|�:*i�G�a'�fR��������X��
���l���|V�/��y�j��,�(�g��o��YI��duK��� �(b�YE�0I� ���W4�vu�����}b5@wI��s���*'b���V9����TD;QM�0V�v#N(��a{=oz}o�&��&����7�(��F$�G�Z��w�X�.���(v�S��"im��`D��H��#����a��ax�L�
�D�L�}���Y&�	��"���9V}��[����1I��g��v�j8��j�
���+�ag��7��~���a�(��i��2f5�D5A�DQ�8�0�O�Lm��(;X��4�-`A$Q��e��C��e���a�(����S���W�s��&d������������=��l��������OT4�.���4��7��v���a�(��i�o�6�E}>��w��E�j8'VX��(�9����ax�L�
�D�L�}���Y&�	��"����V}���y���s���W�s�.��!��<�&;����HZ��NtXV��,�o�YQ����%NtXQ��e��;����7����P���Vd�F�����NM��������W4�vu>&I��>�������&_����|����y�K����y�K����y������y������y������y������y������y������y����?TR���sa	�������G���X*�����R�;#���XVE��0��a�<��g��vM>��g5��>���;��"�hvN���E<g�I�0�Z���H��n)�DE,�
",����I�U�_������Iz�?B����|;K�>\�����~R���(U�(�~�!V�����5���YV���n��"���
���/�|'K�.�HY��w��H�)�x*"V�I��95���%V���n��"������yWst�������J��NL�MR_��9B����{Us���,���vB��-���U� �(�UD���
c5"��yM�S�/�V�9���?E����
sjD��K�n)�DE,��G;�
��6����|�:I��-�>�-PA�T}E���a�
�����&h+�hg���WM?QM�0^�w ����� v�x���|�>E��-�D��q�"�3"��W�4QM�0I1�4L�7LRA�U��h���|$I�j����<I�W���1�pkx
�
gy�S������+���%X�%������Y��k��"�nD�����R�^��^���v��EV#�d#
��)�x*"V�I���U3MT4LEL3
S�
�GP���M�]��I�F>���Ij��<K�.>�����&���5��>���W���"�]���&����$i#����HZu���]�#h��"Z��XF����
��o(�fCa�
��u5��,�S�g��qk'��aN���|E��"i��2�-`AQ�2� ��o��XnW�C%��|�%X�NYU���j�BOR��YE��0^�0�j�'���z�)��������Mm������������_���������K��������������������o��V��~�<�����?Y���(�+������7���wj�}��Z
eb5�_D������a�bA�]��kv�^��G%����{�`]|���v�	�.�/,I�WD�+�D}�x��8���&_��;Y�!M����(b�Y�E�0I� ����.)8��������������������?������?��O?�������?������O?��o��������������������<�����%��./SF��>�f����� ?q0���K"�["k4���c@z'#��#�;~�S�/j�%}�S����%E����M�]��I�F>���k�y}>����������������#IZu�1M������+bL���P0�Y&�	��"���9�;������������������������������*)�6�Ga	�����U��h���|L�6�Y}�]����YM����5�N}������4��������]���S��w���.������4��������]���K��w���.������4�����A��OM}H+<��-e���^�����%IZM���}b�!5�w$U_����}P�n�2��j��y}>����(���'VX�Q1�,�S�0�j��
s�"�3
��
��f��&h�$��f���W�2QM�0E����>`)cO2,�j����|
�>?����+����#~�������������?��������R��+�k:���Q$����'�#�PIR�1��Ce�7��,�S�/������ NQ�sfA$}����&�	&�"���)���U�LT4LE��tR��Nx��`���aH��"���
����=A��"���}f\�'�	fE�g������|^��j�E}>��w��EM���wj�}����o�t�G��_�G���������~H���zx0���S�4.V�]V
�|�6_���V�V�����RR�W��o��x��,�&8�YQ���
@���0H�dw�X���|Q��k���|Q�/����|E��"i=����8`Q�������X�bdS^C��_������?���N�q�5��%}��?>��[K������=J�_�]]:�l5�Y}�]����YM����5�N}�����X��������%E�m��{�tp�X>!�jR��R��W�|����}RjkI��"n�"be�o�]sl��|V�/��y�j��,�(�;�a����&��l�K�|Ik�$�[�TA$Q���X��&)����M�]��I�F>���k�y}>����<�h����5tC"������s�a�v"�&������E)�������L������`�%Q����o��%B����q>�>��m��_n��}b	��gV}>��������SJM��I��"���{y�AZ'�<U�������|^��j�E}>��w��EM���wj�}���gW}>��������B
I�WD����|�bw?������|V��"i�;�-`AXQD��hHO��^�����X�"��
M;_���HZ3�3!5�����Q�2��o��YI��duK��� �(b�@�^e��ZfQ�&7�[��(�Vnq�D�@AR������������K(Fobm��&�8v>��G��6�}5��ABj��gEm"�����2�?P5���>E��-q�[�����qfA���yW���~��.]����K�>_R���>_�����H�V��'������+��'���7��Y��I��-~�[������1���C������XSe��YB6���|Q�/��Q$�/�^�R[�(bjG��a�V�#X�aK�6����Q$����n�
���+bX;�����2��Q5���>�������&_����|�>_��K�|I��:M��REL���Og��N��W���%�{Iw\Y�u�B���q}7����j���+b\+����a�h#����Y�b'�,+�hg��7�&�71�������["�-R�8�T}G�����#�[��CF��^���j��9E�n��v��^��y3�{�7q�5q����DS7"a��b�s/O��s���t4Q�k�c!$Jjy:I�w�����0��o�6���|L�6�Y}�]����Y�j?��j�4������9�E}�x��8��0I�?�9K�.�S����%E�s��+�|�:���|V��"iu7:-�n$��I�W��v z�L��gZ�P�{����VfOY4q�|Q��"im��nL+�&X{Q1v r�C>��Ef2�&;_���HZ�%MtXI1�#�u�'�
�u����|���G��r��NtT$U_�ubA\��a���'�	fE��G��P���Cq�����:���D�����(������AHM���(�WD��
�5�����|I��d��4���O����{�����2�<Q5�����G��rKZ'�*����i�XiW7���D5A�����L�X}���i'�	��"�nD��K��T�)��iyxRp@���]�
��k�Sd	���	!k��W�'15�����Q�2��o^5��j��9E���I��95G��������W4�vu>&I��>������,�h�����!e/��}"�����2�Q5����%X_$���r�"�����;���X&���,����X�R&�,�"�X�G���z~	��yv�ZA���������|$I+c�������P��T}E,�"be�o^5�D5A�XQD;�0^�0�j��j�����������=��|�����eL��
E�L�����U���&h�S��i��o^5�D5A�$Q������]��d>�C�$���l���������P0����_���_�Ok���7��AK�U���j�����K]5A�����ZHE������h#����Y�b'�,+�hg��7��,����5�N}>D��p�%�`]|'!d]�i���"5�%Q���X��&)����N���D�@AR�q]'�������|H;W��%d#����HZW�'T�*U�^�+"V������q��EM���wj�}��Z�eb��ZE,�i�>=�x{	���
�\6o���|�:���|V�o����|V�/��yM�S�/j�%}�S����a�2�(p�+K�.�BY5.����$)5�����+��*"V���
���F>������NtXV�v#v�Iz^��^�����<�#���Ec��6���DB�Z�s���aNQ�s�a��ax<��W���"�Y���&����$i#����5��>�����|^�O��`���O��g4�F���J��;�a��`�����k�D����hJ����k�#����5��>�����|^������|I����+�|��Z���i������i������i���Q�?��s���h5/������EJLh��$�+�/�u�r~����n)?W?IJ�-��� �����/o{"��b5����z�	g-d�s�h�>�
I�s\���w��,�n��B��H��xOR~��$�h����\�c�g�E���o�<�h+y�G��4�D�|=$��C��WZ��z�6�>`��������D<?.i���
�4C�K�%����13=X�1��������� $%f�,��[u0�GHRg\��`�B���|.�`]�������z��/BR"�����������kc��V~c�@�cL0k�:�����Y�RR"�������Hj_�Uw	o�8�K�cL8k��}�x�� $%lL��
��~�!Zj����C:����(L���u[��:<�b�m��3�-������%mA��!F�1}e��P��,9X�1��������y@�m4&$��p �V��d�s������4q�m2�,������z<k�"$%b�qI[��=��]<Bn����n�1H���7������!���W�b�������%mA��!z�1MmL8�@�`�B�cL8k#]�����))c�K��x�nB�W�1C�%������c�Y��@�>W�g-����9.i���q���a�CQ�-��x���w�B��y�~�ny1D������-�n�C���>x
eVcB�-��8kf�Z����WHJ��I1�!���]j'���I���~or�����A�U^i4������=h:��!�K����VD����	��_����,�@�6�>��z<kYJJ����� ��h)K ��=��`(�rO��v'Q���v�-�x������@����������+$%R^��� F��H�<�����������p�F�c}��	I)8+K�������NH(C�A�;�� ��zI���#�����=7���G^!)�������4��P�i��O]��@�H�d�B���	���2��@�����<_�w-BR"�5.i�y6"�S���%0�zz�c�Y#s�W����WHJ����� ^�������X_C�3A��A�!��6r�N�%kVJJ����� &��I�����	%�V0C�1Qf� ��8��.o/Y�����1�%mA�["��G�Hz������|������!F&_r�
��WHJ��E��!�i0v�X�P����w��	���#���W�gm��1���-��jE������B�}�����.=�����?�����k�����70(�W�{/!)��"H����w"�{��V<����-����u��p�F>����Z��1���-���6D��s�?��`(��z�)��z����X�z_=j,��K�x~\���w����z0Cm�~�?,K����	���J�S�A��A�s��A.))�������H��R��o��>�y'��L��y�n�7DX!)1�gQ���Hz_�s�C���>�����	em����z<k~4����,����Qc>,b�C�V�T��!B���>La���(������^�����G]wy�K��x�nC$������H����,1B-�.p�q���`�,*��5HtRR"50.i���	���_��/GB��8�F�cL0kf��}�x�����R"�������H~:GHCZ#~<|r
S<�zh"U��P�#Oi��G
q�AHJ��E��"�& ��E�p(������2f�������Y���D�9.i���
����Q�����g�1������>�\=�5��M���1�%mA��!��
�#$����}��I�q�@��y������
�AZ�]�I
���
�����X�P��������Ho��z4k�"%%b�qI[��m��I���]�[(Vc^�z�	gm���\=�5�I�s\���w"�+Up�t����a;��	,��R ��<h7���s��!� $%��$��Zz�t��u�%��{�2��D�2.ib:�G����p(�M�����z�	gm�f�/Y�@���%u���!�ZzJ0��v	��I�g�������X���@�S^��F���{�
AHJ���%mA,�������������4\��O�vA��o�{G����p(�w�W�����C��@���� f� �� ��Ft)������|p�y�����UL�?v�P������h�'C�'n�d������%mA\�VDR�����b5���z�	gm������,�����aa@�B+"i�zz8��-�1wK�cL8kK������1G�1���-��mE$�^G�@z�����)���N�r���v4��!��"3�u{~\�D��"�����9�[(^cz�c�a������))1cQ���Hj_��y�`��P�}��Q`��^�`]�/���a�C{���D<?.i��Z�_��Z�E^�"R���~���[�%mAt��4�����B�N�����*fxd���� ���{2�w�A�*%%R��� z��H���p��[(J�z^��-��`=��
1�<�C�EHJ����� ������<lC�x��@�cL8k#��qy����D�9.ib\�G����
���aY�;,E��(x�+������u��	���9!)��J�����<_o,����������F�=e�8^�����1�%mA<�V�H2��`��P��<==X�1����i>�K�N))c�K��x�FD���e�O�DBQ�i�=�	��\�����!������8i�.%��qI[/��H�)�{��P�	�~�d�-���<���������1�%mALk+�'����5�13=X�1�����M�%kAJJ��Y17"�vQ-k}��k(Vc�����y4�S����5�T���1�%mA�g+"u�	!wR����1H!0�P���K�
1��]n�mBR"�����VDR����S����e������/8kf`I�}�x�����1	�6 ~���H�K���w�P�����q_�+B��:�VC�1�#�xt�����J1rO�I[��m���{�@	E�����1�����J�d����Z�� p:�����Vz��Jm>���}����wOV�5%A���w�%�<���r�c�Y�#Y�/Y+RRb������Q�)f��P�q����B�v�[��`]�������z�f_��D<?.i���
��N��� ��}��z�	gm��\=�5h!����%mA��!�1�cB���<��V�z�������I����Y���D�9.i���
�4�c��T_C����lZ-�e�`C�<�|�5�]!)��K��x��A�|�U�4�c�Zhi�x:t�Z/�td���s��A���X
Q���������w�2�k!R|r_�$)��K��x�nC$�!�����P�.!��W����	`C��O����
�!)��K��x�nC$�qp���
����������p������������=	�� ���Io���g8iy��O�������2
	l������q�x4�-6�`�3�����M�E�{�>�J�!9z���Y�K��z4kZ&_n��n���6D���X�����P�#�3��������Y������DS���N���w�P�]i@����V��P^�r:K��8<,K��W
��Mh��;������a
Rn��'�X ei�m���fXMowR����$(��LAzN��E`���I6���c���?���c!����xO�������x@R
����z��w"��~�O�AB�o	q%�F��l	�dm`����������g��C�q|EL�q�����Ep(�g�`lf����x6��Cd6�!+%%��qI[�iE$=����P��~���=���Y���d�KI�s\����"����>		%��p�w��.0�u&�!F���_q.d�~�gQ���8����C78���0�2f���������[�6&A��o��-ib�|x���o_t~[O�c:�lL8kv��K_N���f��D�9.i��#�DR�z�'� �������;�
��c0F1�6�/��������%mA�r��HZ&}>|D������m=�z�	gm`b7}9@��Z	BR"������x"�M����-�1�F�cL8k���)U��UJJ����� ~9Ft��nW}�k(^cz�c�Y�>9}9����)��� ib�C��� i��z�������z�uy���{2��S�jC0�u{~\��/��!��.�a��[(VcB����1��{�����e))c�K����H<������z�����������(%��qI[�&��88�����C��
�#�'u	����|��k��~������_e��a�����������?���������%��?��O��������?|�O��?���Z��q=�zJ���&,��I���SBR"%<.i��c�D�;��������������O���������������>�����3��~��/��-x��/�?����?��w.���������������?��w��T����!��K�var����������s������������������2���_��$���`=�3,GK_�L��y!)�
�����|0�*��D��X�uD�4KJ�-/��Y�h��5��Z�$�\���?K��q=��<�F�=e����u���K�R"�����I|0"iS����:J�y��v�	�cL8k#������e��D�9.i����`D�Z���%J`�t��������B�/'�Y��y�i<X������<��%A~8��-�K=/��A����2����� }9\�6��]J����� ~=�F$MF����P�+tl������Ho��p�*keBRb�����Q���\�	���<�I�/'�)J��e\���g��!�c`���7�M%������W+���|u�����1�%mA�z��H��/�A���?�����z�u�<f�=�C���c����EHJ��I�����	O ������,/�a
��2C�z���C4\��Yy_�M^!)��K����s��G�Y�����_���C�z�����������:kFJJ����� ���4���Y����"n��y>
x>���x6D1D~1�BRb�����q�u	�a0~	�jL�P��`]����������:ke�1���-��='
C�)���z����r���r����[�%mA���e��c��0���zJ�8��`=���6�p}9�����JI�s\����0�!�1M�S��6��'����`=����L�|94�����.%b�qI[{��;"�	!7RO�^�`S��������!F�/�����!)1�Q������X�`0���r���rHZ���=���-��=�C4�a,?c`(���:��'X�1�0�S���dVg-KI�s\�����!��)����|	�jL����`=���6�:9�����!)c�K�������	=%<B
�jC�9��1"���)�/g~udIpV{\����� ��'�-����P���Ns�	�cL0k�H{����:kq�1���-��= C$����`��P��L�`=���fF��^�vJI�3�"�VD�Ym��'s"������q�D�2.i�o��iO �~�C�<���Iz������c���8u�2��6~���1�>D�x?5��rw�n������'=�z<��4\_�����EHJ����� f��(�R:3�'X�[`)G�|�Z�(%��qI[���Hz�C=���f��3Cz���������e��))1cfQ���H�)���)�Bq�@g�8�S���
L��/'��Y;����1	�6 ��lE��!�g����:��di����~0Kr7I[���h�i��[7��D���]Vd/]8k#G�W�f������1�%mA�l+"�H�7z���R����O�q���-����Hz1���PV������p��H��K�����1�(biE$=��P?���"�����'������<_F�=�\/���;�r'�$mA4W#�#��vy��P����B��NdV��������]!)c�K��hc+"i�����C���(�������2�����mRR"�����VDG2�����P���;=X�1��
�X����-���\I[���(0��1SdV�rd�7,��D�2.ibXZ�����4�F��p�)&�CZ��z<��x��H/�`���|EL������>lv�������2�0�S�����"%%b�qI[���(0�~xz���R��.~���[�%mA<|��0���'0�%w	� "�psz������O���z��D<?.i�i�G=��n8��s�-#�2�Qp�F2��%k�"$%b�qI[������{��%p�^�2=X�1����w_=��KJJ��Y1�"n$c��Kx�j�t��u3��{�Z:_�V����1�%mALg+�N�)�R�MN�`=F��4��#��,	����1�VD����?���P=e������H�U,�5�!)c�K��Xl+"����W��"���~Y�#)��q%p�b������Z��4&E�w���!�&��U��o�]���������c���!���m��<,����.��������(�_$����z�	e�=�c����s�����DS+"�?<lH���������i4�S���%kNJJ����� nG#�JZSb�%��F�8���2#&��ud8��K�b�1���-���C$�������pL!0C��y�##�1�!��I�x~\�DcZI�k|�h�-�1-���9���6��m����]�&8�0.i�][i#�����P�������p�F��m~��BRb������P�p�����/��`]F��������,Y9#�K����VD����p���z�c�Y�Y��%ky�1���-�>4"��������P����$=�z�	fmi�>W�f�X��D�9.i���
��S{�S�������z�	gm��s�x�� $%b�qI[��m���!I�X��#`
'��B��y�n����"$%��"�XZz�zu*�s;&e��s��R9��K��x��A�>C�vr?��.!��Xk��^��S�A�������9� $%R��� ���7j�{^�]���cD�g�d�s��Y"�_x>���J����kQ���5dL��2A
���)a)G����q���-�i�C����@�P��%��K8<k
dhL�2]h;r���AR���qI[���H�@��v����)�����x4�2D�
q�EHJ��I1�"~�h���i_a)G�r�J)����2 ����%\����4��@���L�
gm��������6&A��o���[Vh���E��/��~���[�%mA\M#��ucG�����V��t/�]������]=��#I�s\��mmE$�S��SOz�����)v�gz�����G�qC�m��|E��������3��P���N��	�e�<�)k���5#%%b�qI[�����4��Kx�jL����`=���6�����5��D�9.i�	��a�v	��W����=�z�f),�����%#�K��hm+"�MNz������
mT�Ev���6��}�x��"$%b�qI[���HZI�>~�kLhq���xX��H�
���JI���"�VD�Ymp���d�RF�=I��YR"n���_}������@�P�Sk�R����!�<�����C|1�	BR"���1�F�H����~��b5&�!h�y��6��}�x�������I[�kEx?�2O ��#�����q���-����H{y���-�1���Q�	��H{~./Y�RR"����\Z���k��;X��g�%%��$��Z�?5\������%��{��:hR����0'�5����kQ�����@��#�y���������1�x�R�R��Y�rF��1�6�������#�B�z8�	�cL(k������K��M��R"���1�VD����2���#=sYiR����N rYC�9��5��5m�������z�	K9����YRbn������6��m�C�{J�����lK�k?
3�����qCG�<A��o��W��
|#��c���\f����$%��qI[��ql�\���J�P�O ��r�c�Yh�����v�+$%b�qI[7��hH���sAB��jo���1&���)�����))c�K����VDG2�jc���'�7���������}�x�� $%b�qI[���H}AFH�q%��?� E�|^��z<"�"��X�EHJ��Y17"n�_Ho���rK��$�=gI��e\�D{�!�c�FJH(R����KX-��\���� �����>��K�����-�.�"Zj�{�2��n�Cy����9X��aC��������EHJ����� z��(�S����-��#
���IR��x��`�c�g�E���o�����k(�`=��p�R�YRbn)���q#���{J8�d��w�v5^�`]�/�����z����t)��K��x�nC�$����
�i�v@��e��A�6����z<ki�1���-���6�@2fy0&J�}==X�1���4\����V��D�9.i���	������C��Z�]B��4��������!F����5�����!H��x�nC$����H(��	����b8k#o�?W�g�X��D�9.i���
�4%�_�|	�k�D�cL8k#��)�d���3fEL���y���]�[(Vc�����i4�S�������D�9.ib>-uJx�8�i+����y�)K��fI������VD�l�����P���h���Y
gm`��}�h�Mn�sD�����w"�a��
��b5����u���D�}�x�����1�%mA\�VD/��L��XJ?"e�%%��,���G���~�C�@�o'=X�1�h���m�K�� $%b�qI[��1R�@��)�����[7D��?�wh���6��F��z�jO�D$]���Hz���g�H(��vc��z�	gm�I����9))c�K��hl+����V=9��-���"���R�uA�D��!�c��)�P;���������-/Y�AHJ��E��!���W0�3P���zJw��uy���{2��pC�UJJ����� ��q��
��&�}��1&���	t_��KI�s\�D[w�1]�%�������z�	gmdv9������D�9.ibp���z��GH���{���z�gi`��}��Y��r����J��p�<����"@M_R��>�C������������%]�q1�,y$��~����qI[���(���=X�[�h�')�c���[�%mA<�VD�����Z��p(�>���`=���6��\�%k��GA��K��-��oE���l�@G���'�,��POf4K�k�%mAL�qt��7��CE�&V���h�f��j�Cd{���h�8�3�/IRR"50.ib^����u��,e�%%��,��[I=eXzJ0yZ
!IsA�a��O�DIx��5�X�"�::8�'XW%��xO6/'n�pHI�T���-���C5f�+�S+�<���Yb �8d1��t�}��!R��<A��o��Iw����,�F����c0F�60]p_=��h!)c�K����VD��h|�j�-�1�=��������}�x�����1�%mA��FD�c����2�R�R���t_�$)��K���/}����Q��p���S�#�JZht<l�(=]����z����-tO���m�+�$��Z��Z���%��{����D�2.i�9ZI=����"j#���������Xk������ ������0�u����-���"�����.�a'Y�B`��z���a�'C8�b��I�x~\�DgZ���4~
�`=n���0���IR"n�������Wa��'np(��'�9X�1���L���g�\�����Es#�N�)OS��p(�E�&'eF��\���vr_=�5��D�9.i�����SB#�N�)��}�a
�e?&z����Xs_=n�k�����-���6D�������-��#
���'I��e\���w"�����S;8�����r�c�Y�/�\=��,%%b�qI[��m��)�k}�)�PQ��%����Z�Z��v�AHJ��E�4"����iH\���P�u��uy���{2���qC�EHJ����� ���Ib_���^�'hq��y�gm�t�/Y;��D�9.ib����)�+�]����y�$C��d�oA1rw���9I�x��.��5"ZR��v��C	�<�����p�F�e��g-;�D�c3�� ����%��O��P��\v��Y�I.8k3@���YRR��$H����w"i�+�u��"��{>xZ�'s�b�0b��b�3I�y>�"�VD�A�aoP0��Av=�����F�=em=��e`�1���1�%mA\�VDR��>��C�Or�
Z�D&���
��W�g�JI�s\����"����Pw	p(K�`��z����c�^�
l�o�JV��YP^���v�W�z�,���Hy�K��h�VDRCR>�z�kLh�����!Y�#Y�/Y�����K:��~��[I
I����hH,������dm�nm���� $%b�qI[���H��!=i��<lqS�c]���<l���E���
�!)��K���B+"��^y�T�-�1=X"������v��d�HI�s\�DoI��.���/�X���aAf>
�Z����fm�N �K��te@[+"�p�8�����z����B����(biE�I#d���5�1#�h+�2�,��������AHJ����� ���I�="=X�[`)���W?IJ�-��� ������0����)OG�cL8k#���{�Z��1���-��kD���������2��*�N�r���z'��!��^���oW���@4��=�)p��M=X���,�tAi��`�7.i����'���mWud�?�����m��?�4���j��uA�#��c��I��4��Q�M��{��r(����#'��o5M�Z�>������1��r(�KFQk�k`L��S�h���8j������]^R��K���"�b�?!�����O(C�0�|���y=������5��:��6���^���8x�����[��$%~��2(�{�Q���t�!���1!�bY�����$����C�?K(j��wk^*;�3���8jY����%%e��J�0)��
X������=o�+`����uj���]v0��U�x#�m��mMNR��^R���R4����}&5����c0�I����(�����{IIS/)���������PS�y��&1&������?������1��r(;��j^K�3�:��<�`�FiU������bD������h�)����j�1�LbL5M�u�����$%e��J�r)Z�O]�e`���������"j�F%}�d��g�:��"���@1�\�_ 	��>_ XJMz��II�E/)�b�Q4m���f�P�����V��+1e`�CChnt���
1����zI9���������C�?�|�oa��I����FQ�������q��K�M���yM��{B9l���r��I����I�~���V�����\)6.ES�����(C��=?��������<��x#C�FO�X�������r(�g���'{��d����q/l���0j�&�����ZNNR��K����yMK�����Tc�����$��Q��v���Q���$��%�'P��<��m���Z��2g	���g���>�g�����}�')	��%�P���i��<���Tc�`�GM���@G�<����1��r(���x�������
��0�����^�a��_E�2�:z,��Qox��$��%�P����$��T,�������-I�=�(�>v��-��n�)�k=�PS\P1�����0��#���6ZNp�M����@q�2�J��m����o�u��I����X#��'���$%aL������h����c�j~�r�Pq��R�LDMQ��GOG����0�^R�maR<M��}�/�8��.k�8j���Z��ZNRR���+�����!�����`"#V-�(J�m�����r(�7���;*��O7��_�����`c��i��DG-��$%aL���G�R4m���a5g'��8�t��!���������zIIS/)��yp)��n�%��&q�R��G�GRn�K��W.E�I���3CE��L8CF�����3���
4D�d��}�NRR�o���j����3��_��c�i�FQK�G�Jr��0�^R��p)������0�r�����*�|���iV�s��:����3(���h���� K���d	����g~��B�6^'m��')	��%�P�N.ESf��y!���^��&1&���^�>z:j�����^I9��K�a�Ak�gK�Y]~�_II�E/)��d�����0�r�zP�Z���Q�T=�#j����1�+���h���;��P�B�����EDM�%P.:jWNR��K��X..E��!M�H���3f�P�T�L�ylM�N��@���3H��X#�b6"]�C��a����5���p�4�k���Q�^R��K���v.ES��U�Y����������V`L5En�GOG�')�1
�2(�{�Q<�Y�!M��=h��Y��GK��%3&qj�hC�{r���|s���M��=84�5���c�i�FQ[����^R��K���<<�K�����l��I��7�r�%%����k�R4�Q��wN��L��3��|�o���2$$h2��?=���N;�����S�x����{/)��K/)��vr)�/-I�f��K�(2��WJ��SbIM������G�}����S�&1&��&�:�������1��r(AFQ��w�����(v0�1a�Mn�=5�k��2fq�X�M��3���e�)�d�pb:/;���E�72�y}�zIIx^/)��y�(*=_�@1�C��LbL5M�#���$����C1FE�1�w������`��r�2h�[v��2�.!%�p�s�#�=��}=��;9II�^zI9�3��j�K(��Zj~]B��LbL5���}�t�����1��r(�gESBR���������M�^u����=��������������Y�����^M�IJ����+��)!���7���t�v0�1�o�����]^R��K����yM�)j}���a��Nv0�1q�4����Qm��;��r(�gEs��gHS���31�����s$3�����>@}��!�vb��%�P���Zc�S`(�i�v������^�7��6��j��^����{e��h�g��x���r(��K������^Ps���LbL�U�FFmkr��2fs���w�1����nP}�`"c6-�(j�����%%aL�����RL&c��6��>K <��E��L�yl��E��H�IJ��zI9[fR4�i��6��!��,!T��s���~�>z:j-9I��i��A��3��e�f[��1!��,!/�L`L"j���>z2j��%%aL������M�<�Y��_���`�GMQ�GOG�NR��K���EKN	g�l���
f�p�M^����M7��k`��iC<�IJ����b�R4-r-u`L5C/o�Ld���Em�>����O������%��4����(���=?��'��&�<6��&���4��')	��%�P�#��)3^�m�(���@�u>��QS����Q�Z4�1��3(����������.�|.v0�1a�4}���Q���$����C�\�M����Y��!K���<_�`�cCh���~\������s0S}@��^�U��Y���v��/��] �	5���L�T-�(j���Z���0�^R�x3)&�������/���L�$��Q�\��GOG
\L�8�Na��C1%.Es�g�d�����dY8$$.�\e@B����1��UI9���x���.�'�����&1&���'�Z?��F3K:����(j���Y�2�B����oG�^��%;T]hO4�Ta�eM���h���O���H/)�b�Q��] O@9T��Ld���E�~>��zIIS/)����(j������2�����j��^�3�PS_�''3������=��{%9II�^zI9���8�@>��&q�R��V����p�^R�r�(��v��1(��P���s���������C�S7;���B�[5
���I���:U�������C�n\��o���*��r�ZHf0�1q�4?�-|D�JNR��K�����b�:<%�_Ps�Y�`c��-�o�V>��xII��R,\���[|��K@Y�R%<?��
`?H&���0�b����4D�IJ�y�����y��]K��	fHBJ��L�II�E/)�bfQ4������e��%��;��������>
��A4����i��df'~��r(�gE�ZB|���	5�����\�-��)J������$%aL�����G��-�����+�����l>		6����7z����]J��zI9�3��C��kG��i����t����#))�W��K����g0��W�q3���E�7��o�t�N/)	c�%�P��,��^Q�}�.e����?��\�&�x���r����������������Gq�n�w;��-s������$����C�?�(�����i����y��&1&��b�������eu�
e��C�?K(j�98|�N���nX}8��i����QC���
���(VE�1��4P�5�������w0��<_�x#C�FO�$���I�	��������e�T^u
������aI�J�&y�A4����������;���C�?�(F�Z���y��2�#�G�=�t���I<
eM}��!��$%�y����YBQ��A*��l��v0�1q�4�����Q�����1��r(�g	E�1G�0��C�^�~����-��$�6�f��7z� �������J��(��y[��{��
�H��^����<��x#C���	E�1!���(��K������P�nU���!��Y>��#j����1��r(���hJH��=��i�����+*TL>�����v~�')	��%�Pl'��)3~m�0����;lv0�1q��X}�d����v)�1
�2(�{fQ�5pz�)0����_��`c��i����Q�^R��K���.ES���o�&���h���\��P=h#��W��I^/��S��B{�
m��z��+���hJH�����Tc��r���5�:V=��KJ��zI9��Gq���)�{�1�CB���z	���(j�x��m�#j)8IIS/)��e
Y�!7[o�2hC�Y��;���&�<6�bc���6DKNR��K����\����:(y�P����c	f0�1q��M}�d����t���i�c�R4]�U�4C�e1�����s=�%`�CC,����Gp���|u�X�MFu��C9d	�m�j�FQ;���=�IJ��zI9�[FQk�A�3�2�<�����"(�e�����g�D�km���h��Pl�\G-�z11�[M+"m��
C��������B�:�f�N��lu��Y}��An/)�w@/)�b:�M�mp�*�r�������Q�|���#j-8IIS/)�b^��?mx��|��a�Yl����$�������4D��IJ����b�R\M�|��!�������&2f����v=QCB��	I�	��K�4�}���r��l�GM�z�����<v)	c�%�P����>K�3�n)���c0#��~�s3�����f3�9iC,Gp����^R���Q������rX�.
���>W���yI�l��q�>r%����W�l���h=Bx�!��&1"�����m����5p)���u0#��a-���K	���0j��C�:j�����Y\).��d�w�u���}����PS��v��D�@��������v)�w@/)�b���k���m�~�^�E�?�?!���~aCD���GO�')��
�2(�{�Q4M��20&�2}�m��.����,G2�	�}� �J}��A�]�fx��3(�g	E��=?���Y�����uHDI���G������AR��,���!��d��C��6;���0jI��=5�K����,�MFQk�:0&�2e	�2�Pr2���E��_�l��2o>�W�����=��}INR��^R��,���|~�^j~���g;���8j�*�>z:jh�2�r$�P��<���d���P��%=���`c��)z	���Q���$��%��*��'~5�3G�=X�B��a���s��9$`�#C|����=����$<���C�?K(*���L�������OBM}bHf0�;�
��r��'
r$/)�w@/)�b�QL&c�F}B�5fIf0�1q��&j�#jwr��2fq�Xd
Y�!����
&c�����.;���E�72�o��!�-8IIx^/)�b�Q4-[����/����1��$��Q�,6�FOG�@R:.[`I�	�3��i��|��	e�����kOf0���!4������H�IJ��zI9�3��i�%��d��V���{��I�	��j6�~�'�A�]J��zI9�3��)}���g��%�h�d��p�4Y�o�t�V/))cVW�UFQk��]�a������}��>��Z��!~��
q$')	��%�P���Z���d�6�J��I������*�#j%8IIS/)�bI2�Zc
�!�fJH�:���r������|6��A6��W=h��59II�zI9�!�h���w���b0�
�6L�yl�nW[?q')	��%�Pl+��)!I��g�P��R�g=
GM����G��`f'7fs��d��|�A@e��=��_�+�_J�D�oZ��!��iC��$%��AR��<���8Z�`��Kue�v0�1��)���������$����Cq�\���5
�1������F���5En�GOG-{IIS/)��zr)�v���.j�zZ�P�����FDM���GOG�INR��K���m2��������k�*�8�����D.�g��bq���4�Z�H��=���Cq\��
�kP ��vc������]����KJ����b�R4e	����O���<P���|�Y�x���G������zI9�KF��%���%���B�����uF;�����f���!n�8�.%�y���g�R4���)0��"WD����"��f(�Q���$����C1�\��E��|g	�\��=?��$Ty����Pk����8�������r(��K�����B�a�,U;���8j���T?�V����1�+���M���q
����Q�b\|�Y�x��������$����C1�\��E�g{g	�a��B���g�GM�t���m�IJ��zI9�$�h�)�ijG��Pa��}��$�����v��a�8��s�AR���R4�=���!}}P5a�I_q�4���~D�xIIS/)���2)&S%W	�,B����������*����4D�,.=�6D	�IJ����b�R4���A�2�P$V;���M�7�Zy>���l%�"1�����Rt���h3,�\@H����G�GRn�K��X���v��P9eC���'��Q�$\�����%%aL����dR��%�2��C�{�B�;t�����	����������
Q�����I�=K(*=_-�0�������$�e����bY����Z=����1��r(�g	E�1G�0Tt0f��I���5QkQ�^RR�l��������L����I��II�E/)�b�P�Nc�K���5�D3�L%�m����r�����zm9��$���7��{����kkp��x���r(�gE��i����j����I����X/�����{IIS/)�b�Q4m����_PS�ylv0�1q��E������$%aL�����G�|n���{���d�p�C=C0�I<
������6DNR��K����y-�G����k�b�Gm�D��Q��:II��R,\��d���%|BM5f��`"c-�(j���Q�����1��r(�gE{��f�5�<�n��Y8��PSf0���!4�����x�������r(�g��d�:0&�r����LbL5��o�t�����1��r(�gE�"�/�d	*���}�:<������ks�:����z��	^/��M���=��%{II�^zI9�3��i�_���!����v0���������v{IIS/)�b�Q�����?���I��6GMS��=5p X�NlL�����G�a-�����g-K���.�VJ�,i�@�2��il=����S��n������$��������6�zzIIx^/)�b]�M��_ao�A�5f��I�	��k�j��Z���2fs���7�1�wN�5���������x����#j����x�AR��p)Z;�3�����LbD%EYS�)JF4H����YBQ9Cn���B���j|\����)������m[p��0�^R���R4}Gm��Z���q��	`c���]�>z:j����1��r(�������;��-XJE={�II�E/)��d��Xz�`(��o+v0�1q�4Y�V>�:�����Y\)E��=�f=�0���,��h;�A���0�b����4��������r(��������}���N��h�F�T,����Q[��$����C��2�Zc�,CY��������&�<6�b}���6��y8��a��C���������,AH��P��WJ�W�a��C�?K(jg�2���P9eDed�ON���I�b��Z	NRR���+�b6�
�����z��`"cV-�(j���Z���0�^R�t�(*�y���A���S"�'����gvf�����\���+���{� 	��X�J�X��%%1w�%�P�W.E���18��������`��F-kv�����KJ����b�R4t���������g���M�7���|D
��?Lm��3�u�wE�����UIgDh�lM�gp��.�&�<��f��dm�����r(���hj4s��b(���z��$��Q�l���#j�KJ��zI9���Eq������e��m�+)	��%�Pl����j)�`��J�h=�o�$%t�E�o���YBQ�����@0�y����o����S<m�����!v�!����C<�IJ��jIY��=��8�-�m�����Q!�r����[��r(.���r�����B���\�LbL��������=8IIS/)����m����h>�2�}���"�X�u,�����.$`��zo=������$%�z�%�P�.E�,a_�`�`)5?���WRn�K����2��2-��B9d	{��I�����	�����-8I���������j��y�\y>�lZ�Q���#jh�kw\y��.(����[���`�����%%����g�R4m�������G	�y��|<�L�yl�Sa�x~b;����r(��I���tz�c(S!R�qM�2�����iKf0�;���G.��]rz1G����t^>!^p�����G���(o�5��Y�LbL���Z���F�Y��JGIk�A7�/>�Wq
T��@�HM����Jf0���o$�o�$%������E�vh=�db(�,��-��O��vj~B���V����
X�}��,��4�Y�r�>}�d�GM���=�+$')	c�%�P��<�������r
ZpcYBY�`�cCh~B��
��������r(�g����QP-W����RF�G�%%���J�r)�r�kp�C�V����.t�*�Kt0�B��*����zU-��{���^INR��^R�z3)&SY�=h���>�Z��I�	��4�l-�Q�AcW���1��r(���hZ��'���fs	�l,�5��)*�����E/)�1
�2(�{�Q�_��,����)%��������$����CqY�M����)1���78CfS����h�3/�W��I^/���h��h�=+����zAI�����rYQEZ�|���x#)����$����Cq}d��������l�l,�|�QS|����QCg��cN�%=&P�2������Y�rH_wT��}�W5Mn��Q��IJ��zI9�SF��S�������,��O-�f�xB�y�GO�')	��%�P���1���28�������J�$�DQ��E�t���%%aL���g`R\L��eg	ju0&���I�	��h>Q���=9II��R,2�Zc�c������x�_���+��D�/Z��!��a���Rk���������	j��(�,��=�Z��e0�C(��������GM������Z]����1��r(���h>�_���uX�d!�m~=��w;�����N	}��!@���� )�b��M[aup�C9ln\�-����Q���_�G�n/)	c�%�P�.E��Z�Y�r(��j2�I����Y���G�&����R�\��5K�3���C���,2�����<�&72�}��hgp����^R���Rt�qxR2�I����,�?���$����C�I2��ilpTB9��Z
�&�>-�p�4������%/)	c�%�P,��i�����C�v��v����`�cCh����a�;9IIx^/)�b]�-�0�e���k�f�GM��Q�.����1�+���M�|��#���:Z�c�i�FQk�G�N/)	c�%�Pl������>��	5��k@�\��.�R��v(6�����]�IJlL�����%�9%�!��?���r��������w��^%��n����YBQ9C.���B���^��&1&���w������v��$�P���Zc��gb�s�6��76��$��Q;{�}�t�6/)	c�%�P�VE�1���	(s��=��X���Qx�/r��c{�^�r��{O��GO{��96D4H���?\���s
c~@M5��6�}"QS�����Q[����1��r(�K1���>��	5��'����ZHDM���GOGmNR��K��x�L�q���7;��-P���U���#)	��%�P���=�D��������d	9e
v0���!4	W
�@[}��
�r(���hZ�Z����!�L%��$��Q�$\���Q+^RR�,���i�t[9%�rX}�h�7�����i�&�'��-�IJ��zI9����!K�3d2��m�=C�aa��v0���!�f��7z�)9IIx^/)�b�Qt�)o��&��K�I�~��#)	��%�P����i�Lc�aG��s���>��f��7z:j����1��r(�gE����p@@Ec�>
���EM��G�&����R�\���������L��������"vx�PRXPeU^}^���y������%%�z�%�P,7��)!����?�����*��D�4idMQ�����1��r(���h�r��!M���&c��!�i�L�ylM"��:���� )�b;�M	��>��	5������$��QS����OGm��� )���g�L{���@�'�\c��0�1a����QkQK�IJ����b�R��;g�L��GL������my�`"�7-����a����$<���Cqy�M�����
������9��$��QS�����Q;/)	c�%�P\3�����y������j�
TJ�$��Q[�}�t���$%aL������h�^�3�b:s>�����>s�7;�������}��!��$%�y������hZ�:G������&1&��������Z���0�^R�#p)����u�%|@�5f	f0�1q�4��Q���58II��R,L�k�f	p�\M��1�'c��a����`"�-����a����$<���C���M��qp��j�1cf0�1q�{�}�t�n/)	c�%�P��K���;���������GM�������5��_��QL;���Vz<Cn���4h�Yl�O�ny��I<
�)������Hgr����^R��p)���48|�5��5��$��Q�������hcVW��K�����5P	�u3���U�7��uD�	NR��K��x�2��,���"�<hqY8\����&�<4����>z�4eK��+$�P����H,�S`(������>[a8j�}������%%aL������h����Mj~��V�R��R�MDMQ�GOG-')	c�%�P,���!K�3�iI�4D�,�Z���`�CC�B��hC\���]J����b�Q�sp�C�js��m�@9,[T��>�� ����|�NR��^R��p)���a��r�k���p�uZ��I<�
�IZ�0DINR��K���2��-!��P����!����QS����������4H�����E�4���� K�P�:d��s~����v0�d�
q*jb��IC�����+�1H����yM��=hC����m�Wt,�t9�FDM���GOG�JNR��K����yM��=8N����1�LbL���Z����%%e��J�r)�v������Y��C��}��`"�W-������xP��c������G������a���g��J9|:�QS,.���Q��IJ��zI9���������t��)�y��4��w�8�`�wD���GO�q��NH�&P��<��,z��k��PA���sMf0���!4����IC�=9IIx^/)�b�Q4%$eP ��6c6;���8j�&j�#j����1�+���hJH���0��zZ|�`"c6-�(j���QC����$�P����,���g)��$F�Q��r��+�d����^_P.��G��f��jV���r�|��$��RfM���II�E/)�b�P��{���!��6;���8j���7z:j����1��r(�g	E�1�;��P�.������`�cChr���iC����1]�K����yM��u��C9����:��3?5�j�o�t�jr��2fq�X�M��mp�A���G�\v0�1��"��w���Y�D��-xII�uzI9K�R4�����a(����v0�1q�4�k�?�����$����C��\���N��k��#f1�o���d�xB�����6����$<���C�-\��J�68Y��p�j�GMs�����/))cVW��I�t�@� K�P���#�v0�1�o�>z*j]^')�1
�2(�{�Q4��3���<���F��_�y,)���'��[���
1����zI9���8���X;��-���H���+)	��%�P\&ES_���4�5���j�Fm���m�G�./)	c�%�P�V.�l2f
oc~@�5f��I�����N��5���.%e��J�1)n�K*��YV[�r&c��!���dy�i�F�������$<���Cq��1�����K����`c��)�����E/)	c�%�P<2�b4�~g	j~��q�v0�1q���}�t���$%aL���������D�u0c~@M5fW0�1a�vE)j=�uMNR��K��7EC�
�zB)��$F�QRlo��+����o��C1.E���>�J@�,v0�1q�M��G�v/))cW��K�43�sJ5����Ld���E�7z:j)8IIS/)�b�Q�6 fH�j���1bq���x\���p���
q(�����h�IJ��zI9�(��4���	��D��&1&��f�����m����1��r(�;��iIt;�Y�:��>��C�,v0���!4����a�#8IIx^/)���p)&����A1��P,������XF����?�#jOr��2fu�Xe���cB(�,��v0�1�o�rD�M�}��V����>z5��6�k �Y����lMv0��q�4�5i���'���C�&E�k��
J@��-�{�vHO�"�v��$�6�������$�����`Rth�}t����]���������#)�[�2(�{�P�Nc��a��{����D�=Z"j�
�>z:j�F3$\��&�m���Q�?��3������j���L�y�C�JG�@�8�p4fu�X�����+�����-U�7��7�?��p�^R��,�����@!�C��sC��>��q�4m�����%/)	c�%�P��<����x�9��!���_,p�h�!��P������x�������r(�g��k�����$n�R*V����HJ�-zI9�UFQ9C����B��lv0�1q�NM���a������b�R4����(����}��-�>�lZ�Q�~���vxIIS/)���0)fSNy�wN���nt��I�	��5YQ�Q��NlL���1s)��b�ijcL���C��N;���QMnd���ICDt(&;��zI9�3��i�=N�~AM5f��LbL5Mn����Q[��$����C�?�(:,�_!��$n�RjV���#)	��%�P����i�|���|~j<C�����,��x8_u(������$���{������Jr��z��+����P�q_�&rK���������$����C�?K(j���1P�P���`�GMS��=��%%aL�����G���)m�,�j�1��`c��)�����QK[p��0�^R��s)�*�����Tc��&1&��f!�.Q�����1��r(��Iq1�y�?���L~�,�j
f0���!�y��x���<_])V.ESMq�,C9,��;��D��Z�Q��MG-��$%aL�����Q4L�x�������LbD%E.�G���_�j��A��3��i�59C(��yp4G�������&x�AV�Oh=m��%%��%�P\.E�"W.�,C�y{���{
�gf�����u����$���"��'�w��IJ���K����\����kp�Bm���-��$��Q��&j�#j����1�+���hJH��=�c(s=���j�4D��.�6�&n�L�z5-��{�C{�^��������Cq{���=3��-XJ�O���JJ�-zI9���h����o0��}�x����e����bS������%%aL����)��5f|g	j7�����M[4��!����w���s��I^/��]�2qn���IJ���K��xn\���8��� w�3���}�$%����1p)�6�����������UD�4���Q{����1�+�"��5���0��jz�0U�?�����9���e�^E�7�^�>�w'')��K/)�b���W������j��RQ��Go�R��N��E�0�>z5�T�>���0���e0�@M}.8=�����i����ZY����1��r(^;�b�f	��6���A�;��t��	`�CC����{�0DJNR��K��x/\��
�2���P�\7*�<}�p�4+@w����%%e��J�r)�r�R�Y�rXO{P9��u4D�4�M�����$����C��e
Y�!�
��<}�p�4;�%i��X,���C�$.E�wT���P����I����Y���z$')	c�%�P��b4m��A�<�rX�j����*5�e}�t�����1��r(��K��V�wN��V����>+O8j�e��>�v'))c6W��K����gHS)y���,�7-K�$3���.���^}��!������7H�����E��*��\v0�����S�G�GRn�K����%��������N��h�GM���GOGm���0�^R����hZ�l��S~A����+Oi��`�cC(�e��iC������d��C�?�(�V���������vT��\V���)�e������$%aL�����G���������\cV;���8jY�JF���$%e��J�2)�n�H�}��j�1T��cV-�(j���Q;����1��r(�gE{N�fH��8��h0��. $s��'����B��@[}��~|F�F�?�(�_�O���\�AH�X����#)	��%�P�����e	��@-�4�-��@9|W%����th�Y4����I�,BK���w?�\^7�4A���?���1�G���������X8��M	$Z�O�]lMC�>z��KJ����b�R4���a0�C(�y??H��c���E�7z2jk��S/)�bfQ\�����
j���p265�L�5`���7���L�zA�������i�]HJ�},�1�b�Q�&c���b(�6��+$�O�G5M�>z:j��~��c0�@(�-�8A��������Dq`�g��)1�\)��#)	��%�P����,�t����������h
J�v�-h�]��=m��%%�y����YBQk��]�a���7�>tD�4���|D�JNRR�,���u���!M+��:��!����nC���P
�RE�|8a�y�k���^����"�b���O��C/)�b�2����}F��0M����������s�f�c@��.�9<�=��$o2����<��'m~,^R�7� )���gE�"��>��	5�����`cQS|H���Q�h~���i�e�Q���p�4��{2�,bp�|��I<
�����
�����+���8�>�w2���R�x#)����$����Cq�e����hC�?`����`c��)v
����U/)	c�%�P���)�<�AN�e�����C�;�y�.�6�!4��~��8��$%�y������h:����������X�`c��i����QwG-���r(+��i���7A�5&�L.����m������^RR�l���CNy��7�������|�JJ�-zI9�GFQ;���s#�NkN�gH�%����|�!��,���a����$<���C1f.E��v<?�j~?��N;���8j�f}�d����$����C1�L��~qp��j�13*~������i�GOG-yIIS/)�b���@.T��}�@�����
%%����W�Q�Nc���>�9%�!��.T&�}���!4W�0�����<_\).E����
~�!����}��D�,Z�Q����Z�����1��r(���L�ip.C9���X��I�����7��?�vxIIS/)���MYBz_��	e����m�eOf0���!G���iC��$%�y���e�R4���A�$�P�\;���8j�Z���Q�!8IIS/)�b]�MK�yp�C9,����`c��i�k����%%e��J�2).��5��s#���>�$`"cV-�(j�������$����C��\���5��a��9��`� DDM�����Q+4;���][��WC���{��g*@���}j~���D;�`2&��(��������$����C�?�(��K7�u��I��\u�}�&)����.����G��f��j^��q]�����3���XJE��G�����!�:�b�P�d'������t{�,���3�������7z�Wp���|u�X�M������Tc��Ld���E�7z:j����1��r(�gE�������j�1�d�GM�%�=����$����C�?�(:4��N�u���K�iZ�G�GRn�K����%
9%�=�L����7(f���`�xB��=i�;')	��%�P��<����{ph�j�1�LbL�M�����?v�����Kq~M��;��-M�7��7�?��p�^R����h�4�����_S|�	`c��)
n����=�IJ��zI9�3�����=5}u?�������u��$0���!v�G�o��!�=8IIx^/)�b�P�sphC�oWw��LbL5���o�t�N/)	c�%�P��<���O~g	�!}}�LbL5Mn�=����$����C�?�(��}����A�o��!3~�.���cCh����IC�%8IIy��R,\�����r��Dn)Z�����+)	��%�P,���v�P��z�v0�1a���r�Q���$����C�FE�1�wN����n�GM��������7v)	c�%�Pl;���c�zsA�W<�����0���!}��!P���W�DHz�)�{�Q4����C�*9s���D��&j��Z
^RR���+��)}��;K�P����F7�K�D��Z�Q���#j���]J��zI9��K�t�G���P��"p2>�g�7��Y&�<6�"m���
q{IIx^/)���������E�0�[���*�>�?��p�^R���R45�����j����]}�'$��X]����V��$����Cq_e��la�S"(�;ot7��s� �����>z2j
�]�4H���d
��!�i��
�~c�KKnt���s"aE�E=m���$<���C�x�rJt��L�,�&�:�_II�E/)���e�����9�r�)Q#��v�b+���]v^�wD����� %9E�x��g�O.�l���������mt)-!������7E���zI9�����a����`�L����JJ�-zI9s�Q����0h��V�a���,��i�|s!���u��2fq�X��1�G�?�����7����(��>���$��%='P�..�h2�����PE�0�1q�4w����#9e�%�P��������r./�`2F,���<<M�s=!6����>z��jg'��^R�g�RtX�����gUK�Y�-�_II�E/)�bY�7�4�>bN@9,��z�������Y].�#j����1�+�����7}n�$��|�����$����C��\��/�%��@����s��8IDM�A��G���j�7N$�Pl�K���~O�0���	��Lp
��7� J}��(���F4H����YBQ;C�A���o�<�f��D�s}�t�Zp��0�^R�e�R4}�����PS���d�GM��GOFm]��$����Cq
\����u��_Ps�Y�LbL�C���=9II��R,\���S�2�<����`1'��.;���E�72�v}�	NR��K���]L���O�Z��P���re��Oq�4�����Q�^R��K���G.���-�����e���R��G�GRn�K��x�\����m�������!O����	5��:'�I^/�=E�N=��-')��K/)���p)����Bec�d�G-k�V?�v{II��R�L����x��y�j�1#��|��eGMs�j=����$����C1�\��[V�i�e5��`2�,���<)��$���P�]�������$%�y�����G�����#���b�'�&1&��b'����Z���0�^R�����M���Y�r�7�A�`o>�f��i.�����v'')	c�%�P����,���{3��
&c��a�]���\OHB�7�=i�cNRR�o�������c����/��k��	���fo�7z:j��q�KzN���%��L�,C����M����S7��:tE�L�za�i��~�'�w��$%�z�%�P��,��j2��`��Tc�����v8j��������^R��K��XN.��d��=�c(��u��|��#��IH���#9IIS/)�b���w�3��\�Y�1d�P��ZOJ�$����k��a���$<���C�&��T�v�S`(�
=��h���GMs�W=��%%e��J�p)��-�:� ���{~~RP���R(��_�>z�qMNRb�$eP��,������*5?K(� ���PD�?�}�t���$%aL���K�Q�sp�B9\
U��
�K�p�47&���Q{h)�Qk���/(�w@=�����F���+������X��s�%EML�2J���4�-���y}�8jn�Q��"2�i�&
�1TtxP����BD��&j�#j�KJ����b�R4�������5������>��Z�Q���#jOr��0�^R��fR��,����"�-�0��nk���
��@���4D��������r(�K��%�A�<�r��N���-D�4?�����KJ��zI9��K��%��� T2W�B�;��Q�������+1��iC��$%�y���q�R4��\�6Tjs0f��I����i����]�q���IY��is��c(S����
�:��P`Z�s�a�&Cz>r&')�w@/)�bzd
Y����
���� �RV����E)��2H������v����P����0�1q���}�t�P+�{�r(^'��i����P�97*\���ODMS�rot���%%aL������hZ��������Y��iE�4��q�7y�L�z���������IJ���K�����������=���H�]�!�������R\).E�"�=8N������`"c-�(j���Z���0&�t�@�\\�����+�6&�2�V��7��=��Bxjt����&y���4�]5��{�����4M�X#���{�3(��P�n
�H�>��q�4������]^R��K���v.E��_����Lc�����eQS�Z���Q+�IJlL�����y�Y�!MYB4�,����%3�`2&��	��'
Q��$%�y�����G���Ug ��Y�`c���A�����Gc-(�b�R4e	���1!�a������������<_�x#C�FO} �~�&I9�3��)K��6T�!K����%��i~B�'�V��$%aL�����G��%��q
��_K��n�Fm����FOGm���0�^R����h*���;�1���	��C�p,v0���!4?�����@�u�c����C�?K(j=?hC�����3���8j���������$%e��J��(*���) �n��h�{��������L�T-�� ����+��cB���C�?�(��4c��r�6h,�Y8��D�6���i&��T���6���$<���C�?�(��=��@C�/�����I����(�����V��$����C�?�(Z�+��A��|�z�XL,�+��^sh;[�j��^�{���}���.�Wqwl;k��C�?�(:d	e?�O�������F�GRRni����v{��r�.8=�d	8j�������=����-�3f�P.��>z5��WV	��J���)P��p����l��L�zACh�����@���`
�r(�g��d�<0&�rHH�3��$��Q��Z�FOG-{IIS/)�b�Q<L�|�"�������h
�><}�h�!4�e�0D	NR��K��X6.ES�����AE�r��`c��EM�g
t�P[p���1��r(�������nCE@m��o��)U"j�&j�#j����1�+���h���1:��%`���=�P��L�����]���N�y�����R4��l�`2FPi~��B��I����Q��'��.N�K��i��A��3��i+l{7"��g	mA5�>
[��)~B����m^R��K����2�Zc���}B������^/���	I[;�����S�Z������IJ���K���.\���dcB��`LT5�\Z�Q���U:j{���2fu�X��)!���>��sC5�y�1f������Q�����1��r(n7��j��ij;{��{2�,��j{��I<�
�85�GO�NNR��K���'.ES����1!��]�v������FDM�%�GOG�xIIS/)��qp)�v��e�%���7l;A����F��4N��'�����a
�r(����!K@3�L�����1f��Tw6;�����u��}"%'))�7W��K�T�|�S`(��]+/�i�FQ��G�./)	c�%�P���i��x����jLt)�LbL5Mn��G�jp��0�^R����5K�3��I�u���phR����O�blM�>z��"���I�AR�|r)����q
5�j��;���j���������Z���0�^R�k�R4�:��P��J��	�#��iRLB��|�C��IJ��zI9���hZ?��`2FP�C���%��I�	�����GOF
�
}86)6H��X�MU�qp�C9d	��	���E�7��s}Dm���0�^R���Q��}+�Y���s�
u��I<�
�8y�GO"')	��%�P,�K��~�`2�PEb���LbL5MU�?������1��r(��Iq3m���q�/���D�1���8j���}�d���%%aL���m�Rt�8E�$`�`)5�������[�+���h:	��wXP�O���I���Qs �:O����"����FO[����uI�)��gE�",NL	std�b1������H�2DR�7z�Or����^R����8��z�<���r��R������HJ�-zI9����v�Z�P�|c�?0�1q�VE����d�����1��r(�g���-�&q���HY�JJ�-��b�QTNcy|^}@rJ<C:$z��q�I��!4Y�o��!Pj������r(�g	E���A1T�oLX9�gc��eE�~��������1��r(�gE��yp�C9��p����)a�M��=��KJ��zI9�3��-Kx_��	5��p���I_q�4��o�t��Y��1}�K����%
9%�!���LbD���R�F):��R�\��b�k�IB�a�1�t|cV-�(j���Q���$%aL�����G�t�������j�+��$��Q�Q����Z���0��C�?�(���rv0�[��FR�F�GRn��(�gE�������rH���&1&��&+����:}:&~zI9�������:�j?�&1"��f��7ze�W����(6E�y�TC��P)Q��N����Q��2������[r��0�^R��,��5����r���&1&��&=��#j����1��r(���h:�v�wN��V��i�GM�%������#���KzN��NECN�g��7K�&1"��"���WF���� )���gE���3���5��*#�.�D�e}�d��	����K���&��:����$nY���R���w|���/j�1����Q>�5��DoY/;���E�7�r��JJ�-_�j����M���Qs��j��)�k��Sn�&�<6�&���G�P����S�%�P�"���U�eGW�eU��R���G�GRn�K����\��/���j�UGy9P��UGD���=����$����C�X�mi������Y�`c��������5/))cVW��K����m��B��=%������Y�x���7����f�Um������h��3�i��n��,����L�ylMn��!��$%�y���1�(��!�L�L�$�7�H�t����[�$�N,�f5z~5��Us~���W;���8j�2�>zZ��KJ��zI9�*��|
jx����c'7;���8j�/����U�x�.%e��J�q)�����t�k���Y8|G]O2��<��x#C\��!"Bs\@���	��K����v0�[������%%����w�R4-��A���?��<�LbL�Eqj����Z���0�^R���R4-����)1���N��`c��i���5pg�]J��zI9����[sJ<C�*���������d�xBS:Sm��'')	��%�P��K����;��-XJMz^�_II��CR��2h?���R�p�t(o�Ld���I��)O/)	c�%�Pl����5��9%��ec^8q��l�EQS�g�o�t���$%6�AR��������� �0��	����.�L0�P|d��S���:IIx^/)��rr)�&c�P�?v�uf0�1q�_}�t�6/)	c�%�P\7.�h2foc~@M5����\�������������1��r(n�K�z�1Cf#��'��C�(eM��6J�����baR4�z�:���P�O���e�h�FQ������e���1��r(���)�\���PS�y��������J����:�n��0�^R�#r):$z��`�`)}�J)��2IgP<wE�4���@��,9%�!���k+K�$�����}��! ��(�t�@1.2�Z��/�!�r�X�`c��i�X?�v''))cVW��Kq3��	�r�t3���U�7��o�t�����1��r(�g��e�kN�&q�RQ�G�GRn�K����Y���"�il]9%���f��t������0���!N���o��!�%8IIx^/)�b�P�z�}�
�0��LbL5�L�=5tn�t����r(�gE��z
�	���1[0�I����Y�������%%e��J�1)F�5��!��i�FR�F�GRn�K����yMk6k}��_P����������}G����`��{O��[2��
5q���zI9K�Rt([�����VBJMMW=�JJ�-zI9���x���wC�!�l��,���8j���mQ�^R��K���6&�dZy��w��5��[@ee�'}�QK�����������4H�����GqupK��	�BH�j�,6)
�9��q��-�z����lm_?�j~N�-�L����Em�����[��I9��K��S������r[Q��O�"j��������%%aL���k�R�&c�wN�e�i���������K��
�5�����:^)@H�L���2�Z���d�������&1&����k=5��0���5H���/2�Jc����!}��j}�I_q�4��^����5�RR���+��)}=�w��e���2�}��������?q���=���C��yc0�������7���`c��EM��>z:j��mt��� )����mY���0�r�"||�5�Oh<>�V��$����C1\��,�\Y��tKk0�I����h��GOF���NlL���i�Q4��x�4��������C��-5;���IMnh��a��::��6H����M�\��(�rX��O0�����x����#j����1��r(��K��G{�w��������Le�r0�I<�
�8��GO�')	��%�P�2���E<�1����l�O;���8j�������$%aL�����������`�rX�z@�_\}�`�4]�����%/)	c�%�P|6.E�"W|�Y��!K���Le+!��$���P�����
�')	��%�P,�K��~���1���Y)v0�1q�4�K��QK[r��2fq�X�M�\ip�B�:����������#�VA�b����
�i�GO$')�w@/)�b���Z��I�������WRn�K������!��3�i�,Z�b����c��/�{�0�bo���4D�IJ�y�����yM�k��P�+��e��	&c"j�}�t�V/)	c�%�P\V.ES���wN	�Z��K��I����
��>������h��J��(�8C���my�l����+���7�7-������(�IJ��zI9�3��a2�����Tcn�&1&��&�����Z���0�^R����hj%xm�,B9���i�GM���FOF�B��c����C�?�(�����0m�^�����1�w?������
q(�F��iC\�IJ��zI9�3��)}��o0�C�z;���8j���7z:j����1��r(�gES�z�w���Nc;���8j�&j����v�������b�Q4d	x�4e���!"f1�zq��W��|����=m����$<���C�?�(�����o0�i��.�y��4��w E;���9U}��AP��C3L���+"I
�Q�?��3m�=��ej~=���d�xGMQ��GOF���WD��C�?�(�6���q
�p��~-v0�1���(j���QC�$�q�K�L���%����Y�2Wa��r�2hC���3�{��&3�������:����+Kr��z��+�����%��L����I��II�E/)�b�P�Nc����]��$;���0j�^�}�t�6/)	c�%�P���Zc�w�����=a���h��
UA���a�������E�����(���jr��x���r(��K��ES�_PS�YW;���8j�����Q��KJ��zI9�������f��K���j�+))�4W��K��3���,C�+������;���M�72D{>�')	��%�Pl�b6e�u��C�?�{���]N���e���>z:jwr�� )���gES;�:8N�5���i����K����Z���0�^R���R4}��e�%|@M5����$��QS|	���QkKp��0�^R�u�R4���3����cv0�q�}��(�Q/)��d�3����J!8L�0�1Q����Q+QK�IJ����b�Q�sp�C9|���Ld���Em�>�vyIIS/)��~q)�>vZ}�����{�!]=�L������q�C��$%�y���G�R�d	O��b����sOf0�1q���}�T���NR��K��x�L��{��n��	5���H�$��Q[��}�t�����1��r(��Kq7�}D��r�)�5��$��Q������'9II��R�2�����!MY��&c��!KH�L����"��!�=8IIx^/)�b��W������V��'(��Y�����$����C1'E�4�n�H@m&���OBM}�#��$�6�fW�:>�����;���C�:��G�	�[��>�2x� ���{��I<�
��'�W�+��q��� )���r)f�1�-�0������O&1&�������G�6/))c6W��Kq5�}������x�G����i�FQ{����4��'O~�Y
����<\����`2�PYB�v0��q�4?�%D
m�l�Y�^R��e������j��������t5E�|=�-xIIS/)�b=�w����>��	e�iC��jq�&��I<
�k
U��a�	����K���6.E���v�'c5?3>��&�����"�����v')�1
�2(�{�Q4-rme`L���`���Z�D�}D�xII��Rl\��E�=��(C�=��.�\;���M�72�o��!vT���.� )�b�Q4e	{zO��!KXQ����~FDM��=���$����C�?�(���k`L��%l�LbL5�O�o�t�./)	c�%�P��<��d���n��%@���w��}��I<
q*����iC�SD��.�AR����h*%?��d��/r�Z�;]���)V�������u��0�^R����hJ_����!}=�LbL5Mn�=��%%e��J�p)����}D�����Cx�!3>/;���E�72�o��!����13�K����yM���&c�p����s����r�>z2j���$����C�?�(���sp�C9��i��I��������8��KJ��zI9�3���$������%`���n���L�yl�]�}��!�!��w��AR��,���|L�����)N�1��;P�`�w$kRi���KJ���+����'�����������S=�v0���od���iC��1��K����yM�N|����Tc�h'%�,���i��~����')	c�%�P��<����88N�5���a�GM���=��%%aL�����G����e�% �l�Z���Kue��I<
�5�Xe�
�P����T���C��\���8
��}A�5&��}�q ����J��*2rl�OH������w;�c��i�FR����$����C�>2��ilp�C�o�u�	`c��)za���Q���$����C�eE�1�woB��9%�|�
�<hC�@������z�p"^>YB�Z�����I��	����AR��<��z�<8N���/r�e��	�IDM��GOG-yIIS/)���q)����~�O���\�LbL5�
P=�;9IIS/)����g����>\��e��C���`�xB����4��'))�W��K���u
�S`���M�v��D�,Z�Q���#j����1��r(n��i��z�xF@�/�{��I���������������1��r(��K�z'$1C�VD�A�2�b~�X<�`�xBQA�GO��IJ��zI9��Iq5-r���j�VX<;���0j�f�\>��zIIS/)���p)�����%`(s�:�����j�x���~�[�KIy��R�\����{��C9��E�I������fq)�Q+�IJ��zI9���h*��)���3%;���8j��.���������K��������)}}�A���g��7���|��$����,.��6����KIx^/)�b>d��4-�P������'}�Q��v���+8IIS/)���r)���������`c��%M��G�/))c6W��I����i�,C9����D�lZ�Q���#j�� ���1��r(����!��3�n��-��e��C����	w�"1lM��iC���$<���C��2�Zc�`(���r��$��Q�����#j�KJ��zI9���hJ_���0T������gu��I<�
�Y?���!��$%�y���ucR<L�q4-�P�y��ST��p	@l�&y�A4���I���KJ��K�����i���;�1�����LbL5����G�rr��2fq�Xd
Y�!O���M� �s��H
�Lpo6��X.��'
���$%��AR��<����68N���on�Ue�.�D�+�}�t�6/)	c�%�P��<����6�C�����������.�&�!�
}��!��$%�y����YBQ��A�2��k=m�LbL5M#�>z:j������AR����h)�)ap�C��D;)>�������52j]^'))c6W��Kq3�}<e�Z����o�v�.��k�0�bS���6����$<���C�?K(j=�nCE@9��G��I������~����J��c����C�?�(f�1���*9,r�(WN.e?8jI��=��%%aL����YBQi�%�e�Z'<��X��Puf$���+nv0���������'����$%�z�%�P��<���d���P������ctD�g�����]^R��K����y����[�	��`���`c��eM��G�&����R,L��Z��gHS��������.��&���������X��(�^�I9�3��)}]����z��LbL5�b�o�t�����1��r(�g�h2��Vo�Z�Lx�!��d�xB���=m�+9IIx^/)�b�PTz~[��*��6���&1�8j�Q�~�'��
����0�^R����h�������"�S�LbL5�
�o�t�v/))cVW��K�����o�&���h�������`"�W-����0DLNR��K��Xn&���o���d��j��I�	�����GOG�')	c�%�P��K�4�����a�lG2�I�����N�AGm_��$����C�\�����}<�Z�W���&3���0j�������������4H�����G�\�gHS�����P,6�7;����!6�!��!��$%���J�q)���:0��Tc.O2�����x��-�G�����1��r(.��)K8�A��5��kNf0�1q�k�}�d��%9IIS/)����7���x���W���Lf0�a�6E9k�2J~�I9�SFQ;C���P9����$��Q�$\�����$����Cq��MU,���
���/!!��$��QS4����v{IIS/)���MU,���O(C��=<_�L�yl��1D�0DMNRR�/������y��Dn)Z�����WRn�K��x^2���<?���+y��&1&���(��'�v�A�f0&�t�e����P�k�rB��>����)
�����%/)	c�%�PL������;��P�5���wX��h5��+9a��u^>q'')	��%�P����;*n��B%cV;���8jI�JG-n�IJ����beR4�/qp��j�1/����U�7��uD����0�^R���R��#��b�p9�AH����_II�E/)����M9eL�����S��am�A�p���<6�f��9>��������r(>���)��O7�r�)�j�GM�p���Z
�IJ��zI9���hZM�c��t�)�X;}rJ�S�p����KJ����b�R4����%`(se4��Cf\Q1���cCh���|�HNR��K��X.ESf��31�C���LbL5Mn��G�Jp��0�^R���m���(��_�q�d\^DDMQ�GOG�yI��i��A��3��)}�� K���j����	fL"j�:�>z2j&�~�&I9����%�D3��*�<h�
Y��U,��3����QQ��GO�
NR��K����y7�4;��-X�M#e�+))�4W�MFQ;�

c�������D�lZ�Q�~����xIIS/)�b�P���sJe�������{���QH��&�.m��H����3�&e!�Z�����L%,1�3��'=����!{�m��!�>���-
I9��E���Nk^�8=���&�p��`����������1��r(�gEUe��9����c���GM��=������$�)��C�=�(z�1�w�������`#��Q��v�����/�0}�K����y�9%^!U��W�5/fa����m�WlIn���4��;#))�gS��I1�*�����/�����l��Y����3z:j('I�[�X�e�����J_������3=��1q�um�t��gZ��xI�	��EE��W��'L�s��q�um��(��������G(
W����C��\�9o2i-BDMRw�����=���1��r(���Rcv��"������xg	�FC��E62�E��5H�0��������b�R4��/�rK����|F�#)	��%�Pl�#��X��2�R�������3G=����!$�]��(VR��K���#���X w�a(���x=��1q�$�]�t�����0�\R���U_����)1�Aet]�`#��Q��
��#j�)����P��M�X�1���n�B�n+�������nk�N
6�yl�nk���������)������s�`����z�[6d�*��D����Z��S!)���gEU�Z\'K�P���kIz�cQ�vm�d���FR��K����1��,�����t��b�3�k=�l��������6DtFR��K���L��*}-��}j~�zm�l��0j� �k���vZIIS.)���q)��p�N6�,�`����GRn�K���;.EU���9%�R���+���o�4[-���e�����I�+��(�^��W�3���^��bfR�T��sTC��-����5 (�m����@��������9�Rs@.)��?���>�������w�bw*�w���6��]�P3�@���#����7��)�7y��$f�\R�#p)j�?��:s�J�h�K�h,�6T�Y�/*��Q���}1	o������,py��V����HJb��K��v.�]����^j�Y�+.z�c��	����QC������BR��p)����1&�2��Q!������&�g��#j�JJ����baRTu�.���>��3�ow�bc�"��E-]t���IIS.)�b��(jrJ�B/�'�>l^<q�$oeg�F���S.)���U/��{o��2�)/�1&��$���G����a�S�%�P�<�bP��A���>���I��s�F�����!6HP�����3���rI9��K��<��4�"%�lUM����3$�<6�d���Q���|5�X�
����U�M�����v�����[��r(��I1��D��YY �*!���<�����0�?+�SS��?��� W��KN.fob��cbe+)��C.)�b=�U����w�5s�v{T�
����&i%�FOFm��n��
I�<�(�O��e��
,c�����6�II�E.)�b{�QT�4���I�j�p��h��0�E62�A�A��AP�V:�@1�Xx�E�w�<���,�t�d1����^Q
6��"���=i�D#)	��%�Pl�#��|W�P�����o�J{a �b����E=������:�����HJbz�%�Pl�,��S������P����W�S�8j�#�m�t�J4��0�\R�����JH�N�8����U6bL5�Fu=��YIIS.)�b{�Q<T�|_��	��������l���Qb��a��IIy��R�c�����1�������S2f�����������$�)��C�=�(����sVCd	!��F���&�	}FOG-[IIS.)�b{�(4fX:Y�Rg	����������xB�����4DX�&5D|�T_P&�K=����_j��m�a�������:���0j����=��JJ��rI9�3���4�oE��R�����l�����xBP��FO�)�KIx^.)�b{�QT�:���C|;<Qb��|;�Q�|X{FOF-�h$%e�lJ1s)���b� C��]�l��0j�OR����)���X���E�1�W|B)��yo�A�z��CCx���g��!��_������r(���B��N�$e�%dT9�m�5�Oh����5IIS.)�b��(J��)��P�ie���GM�T����VR��K��X�1�Rc��. ��Y�����K��I	t'X
���}A�iN��'���FO{�F#)��UL).EU���)y���j�z����Y�x������	����C,�>�b��U	��nFO@��b���u��z��cC�6z��I�=���A���E��;}p ����)y>QY�A��x=����4�i��
R��$��\R��s)��k���PS���z�c��	�6z2j����$�)��Cq]�����
y���F���tH�T�Q:�XM)�1����C�?F�78��1������Z�FR��K����c����C����r�w�p]4�b��,�}�������_�=}xt[�KIL/���{�RTU���j����Q�e4�vHDM�a�����=���1��r(��KQ�mqw��������`#��br���G�����1��r(��*!��w����&Wpz�c��%�PpQ��R��K���EEN	WH��r9d=��q�VI��4J���)�<FQ�B�Nc!�J_s�@>��� }��lhd)^� ��
������K��O.��U�9=��[���	m�?��p�\R��(J�������������A���		Z����?��]62�����z�;w�{�YIIL/���������[:�j~/�|-z�c��	�������VR��K��x-\��M����B-�u�����~����h��%��Xl�]E62�����U>�X����[1�X�(*��[�����F��tQ21�\R���RT���s�0������~.���t��9F5������l�'
R�h$%1��r(�����j�.Ci�[u��9����������lI�O��A��FRs@.)�b�L����
��7����C��`������f�b�l���!IIx^.)�b]�(*<��M�������u�V=����!$����iC$��z�JAY+���2���Oj~^h66pS 5A��FOG-;#)�1�2(�y�QTe	��Y1!��@,���|)���`�1a��D=i�e�����\R�������w�3����f���1&�������Q;��$�)��C�=�(�*c�o�$��3��;5��1q��>m�t�N�fw8����@�=�PT�t�R��Kg1�,�o��}���xB�o�FObE_&�jj,��&Pl�#��|�P����};f�P�v&cA��t�	3���Ff2��h&���O�G2����b�(4��:�DPA��m��<����xPf�����4�h�'
���HJb�%�Pl�#5�>��ji{�'X��I6�yl�&�3z���!���%�Pl�<��W�-w����*Y�����i��s �J�h��	$JR�g��A��II������GQ��c�|h���,�T{Q�|�yF/����&����y��t�|�s ��6����GM������*�2�3���C�=�(��-��cL�tY������@_vm��b�H�f���)�HJjdS��KQ�C�}g|@)4�vg���F��<��x=C<�'
�=-����Qew����:A���/5�h�_���F�����T��URJ�����0j�1��������&��x2h�b��2��~�w��<��"Y>���d�B�%�Pl�<��/������P���T<+��)���`#sD�
�=i�c����rI9�3�����z��$���kL���6�p�$�����Eg$%e�bJ�p)���K6��"��IY�_II�E.)�b��(*rJ�{��
����
Y|���F<�
!�����5IIx^.)�b�L�^��:E�j�b\(*�u��}]^���52�A$7t7�H�������g�T�<�(��9��9|Bi~b�����Nk�i��3y�N
��^�r������� ��)b��m������[5���j�I@,�rI9���������#
���;(�1&�Z|k�'�Wg$%aL��������
��m��6k�4��,���U���F<�
!x�i��
��������r(��Kq����pN
6�,��Ph���$�"��C�p\�����9�����1Q1I0� �%Q�Q������M)f&�������*	(�
���I�jc�,��E-�Q��HJ��X�m�pr)��f�
�� O��-_,�z>=����!$	W�!���fWANH�'P��KQ�%����/���L�����J"j�m��D-ZIIS.)�b������]D��#BJAqN���$�"��C�\�u�S��^�O(E�W�d�z���d�

�$��g�0�����<_L).E�>��i�����J���2f����v]t��-IIS.)��uq)*cvNda(����]�$�&����G�����1��r(��KQuT�|�T	���y��A���9���%������%g$%aL�����QT��h��NUwu�a;Oe���xB��TV���FR��K��XV.EU�pu�Ma(���R�l��8j�m�R?��ZII��R�\��Cv��^S�`���N
6d�*��E��Q�&~�;��%]�������
��`�^�vs���o��sgT�
��Bb���������HJ�y�����3��j�����P�Oa��Y�+
5u,A�_�)��A����7g$%1��r(�g��^����|#��l��8JQ�g��(�Q.)�b{fQ\U_��N�9��7������Fm]Qk�n�Q;����1��r(n��j������P��1�l��8j�$j�#j����1�)�����/���wB)���c���K6��"���=i���������r(���AN�cT���K)I����HJ�-rI9}�(]!;�:!�f�S��f�S��m����QC�V����t�@��\��-��9��T�r�����j��t:������@@;j��w����h@.���Z"�7��������-��%X�4�b{��������i*��E������KI6�yhA[�?��
qXIIx^.)�b{�QT������_PS�yN1&��$�yFOG
���ab'��C�=�(��y���7����F����QzF/���3�\R�����������J�%��Y�����4�N62�A$i�3z� u����rI9�3��7����l�-PJ/��yF�#))�dS�y��t�\6�����S6d�,��E-�Qg��R��K���O.E�^��^�P9fA��&��Q�$`%|D�D#)	c�%�P,a���e&z�����z�#�(I*��.��a�\R���Q���s�N�j���=��1q��y=�?�I�����A���E�1_��	�C}�z�X<?l����"1D�0�����|1�X�W��_�)�}�1�K6d�"��Em�>��>���1��r(.��W�v��5��+��9L����	^2����U+)	c�%�P\#���z�e�k�I�!������GRn�K����1��elY;9��8��VH����?L��CH^2����X&���\R��������O7�Z
�Y�`#�����Q�QC��jh�jJ�r)�*c�cB(������`�S��I.D
uR�������@��c����,C���y���:�:� !9�ldza�I~��D{o
�HJbz�%�P<�bT%$kzC$$��E��F-J~����d%%aL�����RT%$��^�1�ABQ�L�IHp�$	I�>�vG#)	c�%�P��b�f	x�Te	��Y�!�,!9=����!$?�����vg$%�y����1)&����x�j�1Q�_��`���'4���VRR���3���S���Y��Tc���/�d	8j������Z�FR��K��x�\��,����&��Y�!�,�
z��cCH~B�@b_�������r(^�G�p���}{�j�1oPMx8�J.��I����#j����1��r(�;���2���0��]���
��D5����!$��y�0���$</��C1/\��R��tceP���l��8j���\>�V����1�)����8�1��B�%PMx,6{	0j��m�d�����0�\R�r�Q�s{g	jSg	������_����6�a��r�Q62���$
��i�]�HJbz�%�P��oQ|�eu�Y�\i2Y�6�I�����A��3����:�o0��,a]v=��2��&i�FOG-[IIS.)���s)�?����l�-XJ�9�6�II�E.)����Q.c�����ksJ�B�=����!���6�����<_L).E���?�j���u�� ��H�zQ����Eg$%aL���������h���F���_T��URJ�x��]�c���Qs��Q�Dh�������F����k�����[��r(z?FQ:��;��P��O��_3�c���xB�����6(�:�+$�P<V.E�7��:5��[������:)��G���n��Q���j���L���{X��2f�������$�"��C1�\���9t��b(��2&=��1q�$	�3z:j�JJ��rI9�3��j�2���C$~���	,�`69%6�$�z��
��������Ql�<���q�,�� }=Q	�M`"j���=���eo��K'Pl�<��c��s�j�1/�1&��dw�=��JJ��rI9�3��a�S^Y6�(�!I����HJ�-��b�(]��;���R�yp�4�����l��Y��3�3z��\�aT�����GQ��;vZ�b(����^�lOQ���������$�)��C1&�`����z��@)��km�%%����e�RT�H�#�����.z�c��I~|�BG--VR��K��X�1�Rc���C����1f��F�|D
�
�����(�1��7�J�z������SnU���%!H���iC��HJ�y����Y���N�1�P���m�z�c��EAn�FOG�XIIS.)���U;O��� ���@���`#��Q��i�'�v�N��8�BR��s)�?G�R���F���1����<6���}=m����$</��Cq[�U���iH����1�l��8jQ����JJ����beRL���,�,C����2f������QCmo�a�*��Cq��Wm�W�4���'��GI�y��^%�/�
I9}�(\!�N�o5�3�v��5���D�{�m�d��	���)��C�8�(J��9b��^v��1�!&��Z�>�����gB�0�b��U����)���3��8���D�$��}D
�z3�����C1�1������9#f=��Q����Q��(�����M)f.E����$C����������x�������9#)	c�%�PL�E�1;��1�����`#��Q��	��#j�JJ��rI9����:�v�wN����<m��1&���M��?�����1��r(^;����d�B����N�x�����^�l������{�
��3����\R�{aR\���E6�(�"��q�_II���R,c��X��9�2x���l��E���Z�>��ZIIS.)�b��U�>����`�D=��1q�$�%~D�G#)	c�%�P,q��"��+��)w��,��+zi[l
��!$U:�";#)	��%�P��Iq�e	�C�_P3��;p?���%,8j� �k���V����TH�����GQ�%Z�N��������j������������#����1��r(.�K��%#0������H��R�n���EMN	OU{������O��'
&��9sZ���5�L�,����G(�{�3�1�������L��AN���7#`#n�Rn��k���p�\R�-�Q��,��Sb��[���#mrJ5I���Q�zv���K����cY����W;m�1���/z��cC�.��ICTT/����($�P���*}��C�*�D5��1q��$j�#j�JJ����b�RT����%@�}~��~������H�zQ;�����HJ��rI9�k��"K�+����{@UO6�Q��d�(���{�\R��(�V��u��c(�����`#��Q��d<�����5��0�\R�����U�|&�r���_mn�#�&I����Q;��$�)��C�=�(F�1S|A�
�'��os+�����6z:j)II��R�c�9%^!U�-��Y�!�u���[6��*���=i��a��$</��C�=�(�*c���~BM5�g�M���&�����Q���$�)��C�=�(�1�w��5����`#��Q��v����M`7lL�����G1��Y:+��Tc�M6b�[L���}D
�\1��SREB�Lg��7�z���hAuw���(��!�/,�WRF�K��X�E�
���
	�r��*���GM�p�LGmuVRR����E�1�wN���z���We����scFBM�^���
M�,��y����������K��XO&�0��;Twlv[��A��F�#)�[�2(�y�(]�rg�P��S��:�~�����������Ag���I�l.II���������u%<?�������>G"J���6za��
P�r(����Z!���	(���vv��	y�k��Z�ld`�$�A��AN+)�9PL)&�8����P^\m�R�x=)��WRn�K���]c��X~��j�f	p�����wc��
�=��F�����z���v�`#&$rI9��������G���M��G��6��Qt�i�����$�)��C�{&E�me�~���/���<P5a2�O�QK���c�����$�)��C�X�(*��B�V�T�gs[%���Q�Q2���K��X�(
WH�v~�!�����i�j~�LP5���S�A}���I���JJb�%�P7��ANQ�_��)����+�_II�E.)�bL\��-Q�9��"K@+dt���|��#`#�G����"��HJ��rI9�1FQ������P�M��s��WGBM���`#sDP��FO�X��$��\R�s�RT}u;������Wr��E5��1q�eNm�t��h$%aL�����R��,���\�xw��,���W���xBr�J=m��/����E1�Q��s�C���t�������gT�
��,���>i��%II�����9FQ��c��r��nqG�0�|�A6�yl��D�H�HJ��rI9s�RT%$�s�B��
�~V�z0j��kW�?�vYIIS.)�b��UF���e�����y�����&��U����h$%aL���u����
���c�ifa�A�N�<6��kW-�!�����<_L).EU���)��P��,�pY6p7��&�	m�������TH�����GQ�m�w�������X1��	������]�HJ��rI9��EE��WHU�Q�4-�,���kpj��cC~B��IC�M���<�t��<BQj��q
5���v=��1q�;@m�t�����1��r(���Rc�w����F�������4J��D4�����y�K��$���I���IIL/�����GQ������/���,z�c��m������VRR�,���*!9�{����jL����Y�x��=��������1��r(�g����
���wva�LGtj��cC�/������HJ��rI9�3�����S���������FM�!����Z���0�\R�������v��,B���U6bL5A�V=�\�KIS.)�b{�Q<�YZ!������
�{	M�`��
$/���iC��HJ����b�RT��\�ye���n=��1���g�t�n+)	c�%�Pl�<�?�g����%����|F�#)	��%�Pl�#��X}��J���WH��l���<6���3z�5IIx^.)�b{�(���iZ��A�����E�Rr�(��zFOF��HJ��rI9�3��j�����P9evz�c��I�g�t�����1��r(�gEU�p��,�j�1�l��8j��.�����HJ����b�R4��YP�m�fb)%����+)	��%�P,'���
�����N�;���e�B^6/;��7�hC��IIx^.)�b
L��F��sT�j�1��6bL5I��6z:j�����
I�<�(���rz��_PS���|�6�q��	������{��q�r(.��7p�XK&o ��^"e����[�)�2FQ�S��SUUh�4D�,�������!�)^��E�,�HJ��rI9��KQU�Y:����]�36bL5A]c=��JJ��rI9����zt�B��m�L���m�?��p�\R��s)�Jx��~�P�^,h���OO�<j>6�ylI���C���z)	��%�P�+����
j";6�,�$���WRRn���E�
�i����@P��d�����$=?���g$%aL�������*���#���
5V1&��$=��ZuVR��K�������R�wN��^vP/�d�7GM�T������ �MWH���1��7�B.�/9����0x�A}LF�F<�
!yH��!.g$%�y���i�RTm����/���<�l��8j�*�6z:j�JJ��rI9O��
�2l�-X�(�2�JJ�-��b�R�|ny�bgCP��vb�Bt��@P����
!i9�FO�E�HJ��rI9��KqUy�]D@���N4�t�'�&I���5PF���+$�P����2��1&�2��G�&#`#��Q�ld��#j����1��r(��K1���n[D@�����j����Ir��|D�:#)	c�%�P,����]���b~@��W�o��pGm��m���$[����X+))�S��KqSy����j�1�K�f����Ir�z}D-ZIIS.)�b����������ZCH)H���$%v�BR�?�<��j{7��P�������d{Gm�����QC�w��!�����GQ�)c]���+�2X1W�}s7y'�&YN���Q��n��rP�����Z1�w'wj~�\��l��rr��=������$�)��C�=�(F��1^DT���w�"�E2�|���x"I�?�*�;�+$eQ�L����n|O6�������m�?��p�\R���R����?�^��L��
	Y��=�CT��xb�=i���$</��C�.��ek���`#n�R
j���$%�����>FQ���/� ��
�����(��2,z��9�
"I����A��0��K��&�C[G�=�����F��tHr�g��(�������||@�x���Y��&z�P]��n�����9�n
�E����3z:j�JJ��rI9�3����i�:Y�2����#`#��Q���>�'����$GR��f�(��G��^{QO����C�`���K:G�F<����i������Z� �P�A�h5b�������E�Fh�"l�>��	5u�+�F�F���d��=5��^�DH�'Pl�#?mxZ�r��f
<�+���CD�!��!B4���|5�X�U	����P�)E�g?�\���&�k����Z���0�\R�����������'�Tc�	`#��Q��v9}D
�5�N��t�@1�1��,������;�1da�U�����DB�6��6�JcxS�BR�rp)���S`� }��l.�!�&������JJ��rI9�6FQj��
�*��'B�����sz��CC$���6z��eB�;����A���E����Y�!�*!	���s�
�@��
�� �� �6H�����@6����������
�%K�zR.���$�"��Cq9�(J��������Jb�Tm���Y�Q��[��ldza�	������+�HJbz�%�P\�����s����)����j�m����5^/j�NG-:+)	c�%�P�v.���\i_�`#n�R
v���$%�����2FQ���o�&��Y\!U;"���.��m�?Ps�����{/J�W>�wE#)��UL)&E��
k�Tuc(��4?l��E�����>����$�)��C�_\����i����`���z�c��Iv��HG--�HJ��rI9�8FQ�%�R���N�;�b~��|T��xB����6D�FR��K��<��j�+u
�!�AO�W=��1a�$
������VR���.(��KQ�����)PYB�z�c��I~Bc��ZqFRR����EE��WHU�pv��a���`C��R��!�M���HJ��rI9������:;�)0����3��F���&�Nt���+)	c�%�P<�����9��)P�v������]�l������u|�rFR��K��x\������XC�
9�N������ !�7=�����Z�m�k����rI9��KQ�mq����5�����F���&����#j�IIS.)�bvL����\!w�,!g=��a�v�Oh��(f	rIY�E�
�iC���~
���i�ODMRS����h$%aL�����RT��w�8�2(��A6bL5I5I
t���JJ��rI9k�RT���������A���_�Nw85���U�^�����6�wFRb�+$eP������?�;}�0�����e��
,�D�-�����mdo��A!)�b{�QT���;�o0����suN
6bL5��L=�BK)�Z^;?���6��^��f{���+BS�B�=��ur�
f��W���L/l�$1D�0D�FRR���3���JHr�8����vn�S�
3K�zQ{FOG����0�\R�����JHr}��a���i��l��8j���6z:j�IIS.)�b{����
�J�J�
f1����l����}�6z�}l>����r(�g��:�V:�)0���m���n��m8jAP��FOG-ZIIS.)�b{�QT}u+�;�1��~������~��d��=�����,RP�2FQ�%�RU�^;M�0���p���<_�x=C<�'
QQ�O�+SH����yU���q
e��Q�E����Q��=������$�)��C�=�P��s<���/�������������PS�W�z����'��FOyos.IIL/�����G����.�'��}I�6		�����=��JJ��rI9�3�bP�}O3e���h�.�$$8j�_�g�t�g$%e�jJ��Q�g	x�LN���Y�����u���<_�x=C<��
���
��+$�Pl�<�����cL5���y�\���:5�>�3z:j�JJ��rI9�3������l�,B��uf�<���"�&)��5Xh�nDN,��p�����U/�<�nC�����8�����U>x��^� �x=���� �����K��X6.EM�����i���j���l��8j�_������
S.)�bu\����
������X�`a�����|��""D#))�gS��IQ�=��x{B��.�/���8j���m�t������
I�<�(�����{�	(�����U�h��3���WS_K��
L/�{�R�6z�{�
�����K���.EUB��K�	��%���;5��1q��m�t�+)	c�%�P\w&�U��l��w	(��d��#`#��Q�t�n���v:#)	c�%�P�.Em_L�B��{n��Y��m3�|���xb�$�(�!�MNz))�S�e������gj~���_N
6d�"��Em�>��YIIS.)��~q)������w	��F��N
6bL5A�M=����$�)��C�G&�][��W�]�%��bY��C���<4��?e=m���$</��C��\��z�u�	�6����`#��Q������wVR��K��V.E�&���K@E���<�U;"��*fC�����W�z����'�8�FO{��FRR���R�\�{	�vj�!�T)^O�x�JJ�-rI9�=FQ��u
�1�����l��8j����>����$�)��C1%.E�)��X:Y�:�o���]���D�ty����@k�'
��r,�]��r(���������`#n�R
���$%�����6FQ�B��PP/�����GM��{����h$%aL�����RT����� ��Q-�M�>"j����Q;�����M)f&E�nzWF��m��a)%����$%������(]��w�P�*�B����/T�&����$\%|��hBC��]+�(j���G��f�O�d����%m��t�#���]��WRn�K��Xw.EUiI���PQ�e'�o�n�J}��P-V���
u�[��������<
^���I��	�Fg�BR�?�<���[�l`�'�<$R�_II���R�\�����9��������M�2"j�z�6z:j�t>�}f���z}�����e����_j��8��b7<vi�Y���D�g�?��0�\R�������W�d��
��%��n%���3zU�L�(��C�=�(�������K)�=}F�#)	��%�Pl�����~�;
1��
������E���g�t�j4��0�\R�����j�:�@1T00f���G-H����%p,g���H���?�l�@������Q��X��}2f����|F�#)	��%�Pl�<��f�p�\T�R�}&f1���FV�)�!um��!�h$%�y�����E��k����V��%XJIK�6�II�E.)�b{�(]�:��1����\;�P�����u�6/�� ���g��A�#z)�9 ��C�=�(n��'��m50b���Fi[%Q*�(���R,\��J���l�j�1�+����Y�x��=��������1��r(�g������z��@)w�+�3�II�E.)�b{�(]�:
	 ����Y�9%��7X1o��� ^��<��
����$��\R������9%��������,v���`#����l���6�uD#)	��%�P�+������P�30f���F�p�����E+))cVS��KQ�E���Y�2��_n=��1���rD
42�KIS.)�b���Y^!UI��i��Y���`#�����:�D���������r(���8o>�C6�,�`���^%�t�w���E
S=�����&z����;K���:�M60p�$�w������O���d����6FQ�%�imp�9�N6b�EL���I�d�����Cquc�+d�4r�PY�����I�@DM���f:j�E#))cfS�y�����#�*�����S6d�,��Em;?��ZIIS.)��v�Q��x��j~���=��1q�E�m�t�@������BR�=p)��f�R�%t9c��Oe������)���7m��!r4����\RE�s)�����>epP>�l��0j�S�m�t�����1��r(��*K(['K�P��1�l��8j�$j��Z�z�RR�,������t��b(�9x16�K�l��E��3D�>qZIIx^.)�b�x�?��|�`�R
��������S���,T'!k�!b}�����gr�#`#3���g�i����$f2�t�@1F.E�����`#n�RJ�������[��r(&?FQ��u�`(���s������GU?���� �-�s�0HvFQ#��W�t�u��"K����J����Y��U�l���Ab�J��k$%��jJ�2)�9�����&��R�����%%�����=FQ���[�P���~�W��GM����#j�JJ��rI9�������>tI@i���F�#��F<�
!����!�h$%�y�����R�|i����@M5f��`#��Q�T������9n�SbI��e�RL*c�{>b�� }���cl��0j�$���#j�JJ��rI9��R\U�|����k��`#��Q��v5D-F#))cfS�y��"��+�����[6p)%A��F/��]N���A���E�
���O7���OY���`+$5A��FOFmu�HJ��rI9��E�1��3	��e�e=�`#��Q�����Q[��$�)��C�=�(��-��}
���_V[�M6bL�]P�FOG
};���j�r(�gEuN	W�]����bY��;�e�%JB��=��
��������r(�gE�2f�B��6bL�C���j%%e�lJ1s)��D���%|@M5�?�`C��R�^����Q�P��nW����C�=�(z}��b�UY�v�c�b���r��<4�zi��
q:#)	��%�Pl�<�9e��`#n�RJ�g�?��p�\R������)����}@M5f\�`#��Q�����Q���$�)��C�=�(F�1��	(��2=��1q�$	�3z:j�&���rIY�EEN	W�C�����b�X���rj�!�)^���IC��IIx^.)�b{�Q4x9�l�-XJIz��^%�t��;�F�0�<z5����D��S���`���O�O�52p�$���Pt���N����Ql�<��7�tz��`)%���$%�����y��"��?��y�w~o ����:5����!$/��IC��IIy��R�L�A�����O�����l��U���Z�?��
Y[���(��K�`��$=��[���M��~%%����%q)�^
����'�"K�+�A�Z=����!$�\=>�N��tU.)�b=�U{������P�s��P���]D�	W=�cqFRbc*$eP�����1;��1��#puqz�c��I����Q���$�)��Cqq\���G��^�O����z�c�����������Q�/�����z��������O���1b����\�_II��KR��U:?�b~5�����������h��CDM�&�FOKY����1��r(n�KQ��:��1�������F���&y�w:j�YIIS.)���3)&U�Px�M@���~���FMrH=5��������~�RT���+dR}4
�{1�,��<�e��
!y����3���|1�X�
^v�	`Cn)R�����+)	��%�P<�1��e�s�C���QC������E-���e+)	c�%�P�G�jV3�NN�5�����F�������Z�t�"�X���0�\R����9%Z!w��)c��7f1������F<�
!(Dj��
�������r(��K�����F����)�����RM)�1��e���C��D���OBM����U��3�y$G#)�9 ��C����g3��Uf�:m�!��`��JN
6�yh�E�-s%��;#)	��%�P����wh��P��g�����Fm�����G��&�����O(�9 �G��?��	\S������
Z�����F<�$��F/��a�{���y�RT�%��F�����8�1&�����8:j����$�)��C��1�Rcv��b(�����3�������Z��C�.�g���	�O�j�L�N
62���w��[����3������b�RT��_��7���v=�`C��R�^��IG�Z��$�)��C��\���k������J����������
�(�
�����=m�=I	=������}�(�|�}&�R�Z\�r����o!{��G5������6H����XR?�b{�QT3�Kg��Pa�1�5��F���Q{FOF���HJ��rI9�3������i�����Q����x~��G��`#������3z��JJ����b�RTm[��y��R��{��Q����R��^Q|*����v����[��������bF_�j7���r(�g�M�����k,�;e��E4��w��e��B��{��Q�kdzA�E���#��+E��^_��Ql�<��|c�C6�,�!�����$�"��C�=�(�6 K���J��ylz�c��%A����Q+�S��Im�����EQwR�tj1���b@����"�Z��J=������$�)��C�=�(�O���2��U�&�DGI�=�F�0��K����U{	%�_
0��F/��
��iS�W�>S�S64�����g���*�P���3�\R���������D��7f
Q
6bL�M�g�t�V+)	c�%�Pl�<��M����>�2�vx�Q
6bL5���g�t�|4��0�\R�����>Q�WH����i�Y,�S&�S�ZA9�_��k�j�����H�g���������K����y5�t���@if2�����U�l������g��!Z����<_L)�1�R���Pq�1�K6d�"��E�=��q��i,i�@�=�P���A������6��0j�d�6����VR��K���#���2��x� }-(-_m�W5InW�G�*�&O����03�G��^�\�4;�~	��B���U6�y5�vA]��-�IIS.)�b]�����jj�����Y`S]��&��j��Z���2&�ts3(V&������������c��:G�u�L��gz��kq���W��u��FOzo����xz)$eP����T�|��P���}�j��C����/���� �`�m��
2����K���$.E��=��3�� u�d1�wY=���1��!��6��8#)	��%�P\.E�'��]MM@����l[T��GM���������T�Zo��F?�L��^�����G��FS����}F���zo���(I�p����d�gD!)������.��Bd	{���GM�����4�U?���D��f���3��w�n�
���*=�M����d	�����[��r(��KQ�]��o�$��:K@��0�TDz�d	���'����������r(�KQ�%����j�z����PS�@��ld`�H��$[II����a�RT�{�Y�?��3�r����95��v\��y��$�)��C1.L�A����a10"*�&Uu8Ja�D�H���	���;�P6�/�j��x�GdL����<AM�	Uz��f)^/j����i%%aL�����RT����
v�z{~~��r�"�`R�OBP��FO"G#)	��%�P<����q����[�Jy�_II�E.)�����������n�*�8:%�h��
:.7���i?�
"���FO�VRs@.)���r)�j���%}�����U;�a�L/��k�o��ldza����_&'�7��MO��zq��SH���o&E�F|KA�o6�����.um�?��p�\R���(J��N�?�2��RQ1I�����&��P���������o:��2���q���)]�S��z*R �y�G�P;������:��%�[6�?�2�����6DuFRb�+$eP�����:�;���p��uY�`�>��7^/j������JJ��rI9�3��jO&�/s$�������t\�[��������c�m��!@=�^J��rI9�3����P����P�KG�-95��b��&��h���v;#)	c�%�Pl�<��w�������K)��i�����[��r(�g�E���9+�5��~���Fm�$�FOG�XIIS.)�b{�QT�����SB(m�^�y�v���`#9%4���[=i�J��v
I9�����"L��I��e'�N
6���I����QK�HJ��rI9����[�;gE �������6xj��A62�A$}��i��������BR�����.���7��v=��q�${����Q2� ��C�=�(�>��[_PS�y����f/GM�������y8#)	c�%�Pl�,���.����P���|����P^U�zuZ������'z��6������/����h����vmVRk�\R����x��%�NE9���������
�F�a�����h��
����=/��C�=�(�
�������b�'��GM�Re�5p�H/%aL����3)�O���7��{�N�+��`1.�S��x"H�B�J�v�HJ��rI9����;gvw�`(cV=��1a��(j�#j����1�)����t+��\J��	=�T���NK��t<��&VE|��&�^������{��Z0��J$���(��KQ��uw����fssI6bL5���6z:j�JJlL����yU�q��Y�?��s9�`�$�&8�FOF-�s�z)	c�%�P\.E�Q,�B�vDr�%d�����N=w����������F�����6z�{������K���n\�����`#n�RJV�g�?��p�\R��<BQ��un��P�^ex�T�����'�^����mC�g6�G�K�e�{T���N�,eQ�\��,�t*t!����tn�,���:�S64��g���0hv����rI9��oQ����Y`r���Rp���^(��9���>0)�z��N��.����A�����`#��br=C;m��[IIx^.)����Q�z�S����;���1�!&��ZX>�vXIIS.)�bX�u}Zk��d����Wu�<\g'��a!F��U�ldzA��(�^!���h�pzAI���I19�1�}p(�$<�J�`�1GM�N�����n%%aL�����R�T�|�� ��I8���w:n):5����!��m��!&���\R���������T���t��vut��x�N��`#s E)^� ��
�,VRs@.)����U���>EC@y��=o��_�S��xB�(^��!�3����\R�k�(����	�TP��6�b��_��kld@�,�d��)VRRs��R�\�����v�}���Y�[J
��R����U,��DCM�����`C3�J�z6�o���e%%1���r(�7������.G���j�J�j��&i��FOG�:#)	c�%�P��KQ��W�U������0x�(�l�������!�#IIx^.)�b9�UY��>�O@�%����F���&�*S���E+)	c�%�P����������E��C�o���}�L/�l����9=�������b=��G^#)��RH����y�����#��jKi7xj�(z�����$�AJ�
�����K����{�1�]��C����*�:���_��/��z7�����E�m��!y��$</��Cq��U/��]hF@$$k���GM�k����������!$
(�gE���PI��C�������`#������m��!����ePH����yuYB�,�j��}G���'�&8��FOG-G#)	c�%�P�W.E]��)4�P���c������;&���l���3z� ����	�\R����������|O/����t�wT�
y�J�z�xFO�Dhv'[	I�	�3��j�?:�f�`1>�l��8j���5�$�v[IIS.)�b{�QT��wOe�����A�����^m��7����j����$��3z�{��FR�K.)�b{�Q4�C��l�-XJ��3�II�E.)�b{�(]�:��J�v�=�<�R���ET���s�6��@1��$��m�y���d�=i��G#)���%�'Pl�<���;e�Jw�<���6xe����ld@�HNY�������Ar��,��KQ��wne'�6�O�^��y���<��x=C<�'
���KIxK�O���yU�<�S������1&���
�=5��$�},i�@�=�(��y��K.�JN{�|2�c�w=����!����6z���_2�C!)�b{�QT�����k����NY"�g���s /z��9�
"Y���9�����K����Y����n�J@,����F�	�&9��FOG
t-L�;���	��n�g1(K��UO��w.|'�T�=�N���=-G0����U�x=���� �FF�Z:�"�Z��04���ql���W����/�u4��k��9���R��+)	��%�P��KQ������R��\�B�j8�k�w^62��\� m��AN�fw�����S�����������
C�OH�����IDM�����Q+�HJ��rI9��IqS���+��*���rM�0X���`#����$��RiC����RR���+��jW���%B�]��s_�u�F����
H��z��9����)"���&�=�#<�&�5��z�-�#n)��F�8W�-�JJ�-rI9����ze���N@�o���#��F���&�i�FOF
]����0�\R��`R��7����`#n�Rz�P���$�"��C�oc��X��C�>n��M0}�58A���� �/�m��A�����BR��q)�6�:�B)���2�?;�l������#�ZIIy>�R�L���8>�z�!�d)^O�p�JJ�-X�e�pr)��DK��Cl���1&��d�0:je���0�\R��U[��s��2xO(�=l~_q�$?>i����h���1��r(��I1���J�C�R�Mc����)yF7��5uz��ldzA�����|x�XIIL/�������*���[� TT�>���<	���pzE��g���L/�=�a�6z�{�bv����*���j����ge�V]�l��E����u}D����0�\R��bR�u'��;����1���({p�v�2����UN��7����7o�����h��>�t�@��\�^e�w�35����^6bL5I�n�Q�VR��K���=�bT�}��Z��s��������������F<�7�g��~�{��)	��%�P,+��*KX��b���R�l��8j�,�T:j�����YM)V.��2��@�j�1��2f����V���y+)	c�%�P�7�bR�}��'�Lc�rj�����	>����QK�HJlL����Y�^^!U����bY�?�q,Q6�cCHzJ����X]4����\R��������.�'��g	���l��8j���6z:j����1��r(���Rc�o�#�������S����u����
�v�2b5W��V��������m�������L�K����yU3y�:3B�g2�������4f� ���ldzA�m���=����FRR���R�c���;��P�7 ��vn��1���g�t�n+)	c�%�Pl�<�������)�������_�����1#��N/��`#�{O�������������K����YU�?��:��P�M��}oP�P�2i���3+����v�3+�{��@G=�����$��\R�����Z����^��+E��`#��Q�l�?�'���h$%aL�����E���}�.K$�T��}�T�P���X:�NGB)~b�`c�95��L�6��]�g�����JJb&�%�Pl�<���G�tB$?"�=�9H��&9H�FOGm���2f6����1��P�W��t�@p$�b������"��/�����$y�3z�{�JJbz�%�Pl�<��2��)�P�`�?�6�>�Z�,�����g%%aL�����GQ�����A�P��z^�!<��E6f$���uM�^�{����i�]�HJbz�%�Pl�<��w��)�P����tf2�0v�����F�6�dk�=i�8����K����YU����9�������+�~bb�$��n����.N
62����$�~FO{�����^��b�RT����M0�j�*u�E�a2x���lh����/� 	��I�o1rI9����E�p1���H�b(�W����mZB����%~"XIIx^.)�b�\��m���	��
���=oPUQ�w�)����TU�a��IIx^.)�b�\��w��st	A-N�������0�b�}"����F�2�"i��FO�����s@!)���gE���������
�Y�l��D�vI��G��3��2f5�X��u�x�T�����n�����T%�������
(��^U����r���+)��%��Cq��U/����:�.���W��:G�.�y��_�:���$����&����������y�����rI9�����?�6P�=6�(�*8	�F�#)	��%�P��1��e�^;���b��+��Z�����%�~�6j�7=��������~�h���h�7�bzaIgP��1�RcvJ�0��-�~��n�� !����F�6������Tg$%1��r(z��x���;����?1pz��N
6�yh�Cd�L"VRR���3�bT���NU��M�N����Kf1�>�p�:���>�=�em���ng$%1���r('���>�P:�0���tz�c��%��ft�
8����0�\R��U��J��
C��yK��q�J�Va�~��ldza�I��x/9#)��%��C1�c�����nj�Uh�N1HG�V�
��85��@YE�i�
RW$��O�t�@1-\��-���c��X���U��j��R=	5wz=����������������W1�X�U�S��u��#`C�,R�^���#j�JJ��rI9��KQ��.�N�(�R��`��?����`#����|l���"g$%�y���W�(��{oC���A����1a�VI�n���IIS.)����(J�Y:�DP�v�qy��6xJ��,�����^�{��� ���P?����^rI9����U��mPo��:5��1q�$�N�~D-9#))cVS��K1��yu���v���r����Y�x����#j����1��r(��KQ�%���	�M�%`�kjb����@��������$�pM���Ea�a�l���51)T�F����_t�+��:���HJ�����yu���-�JH�w�q��C��W��1��&.h��0)���;���i�]�HJbz�%�Pl�<��/�q�:�B��Xd�P�+a���z�J� ���%'���g���7o�b��%�Pl�,�M�����M�i,��s���$�"��C�=�P����Z{J[���0�<�1��F<�
!�=n��
1������r(�gE�y�*LJ�����W��,����� ���g��A��JJb�%�Pl�,����q��B)�}��h��{���h��
%����iC�h$%�y�����GQ����b�cV=��1q�I��G��3��2f5�X�U��{�A��E�v�}��2��}�B5�;Wa6fJU��;Ut�*���.��j��E���G.��KN.fo�xFO.���	�"�%�Pl���3��J�����[���x=)���HJ�-rI9�3���~����P��
������z���l����o���iC�h$%�y�����GQ�����j�1/�1&���������v3<���C�=�($zW�j��`)%Y�3�II�%�R�c��X�XBm�W�������PS��
���Y��3�3z� w4���rI9�3��:���WU�t�&X|��A6�yl��hC���7�CJ
I9s�RT���S��v�����<��=h��rj�=��sd���FO$E#)�9 ��C�=�(|$�E6�bb)%_Pj����[�)�����H�X!UIx�~r������.=�����c�6z��F�����BR�?�,�^U�;��j~)IZ@9���1q������������K_	I�	���(v����q�\)W�+)	��%�P\=���\!���c�c��S�@m���1a���L=�#IIS.)���r)�Kt�����&;M~0����U6�yl�Mb��a���f�cI�+��j1N��5�?�h��8l�Y�x��=�'������1��r(�gEUhz��������G����eF-H^v|�����$�)��C��1��,��aSy��
���xI�����l�R����c)�{�3m���������K��x�b�-a��n�+e�~%%����a�R�_��"*w�&�x���J�6�II�E.)�btc�?z����*�~_�N��i��9��`#s ��u
�i���II��lJ1s)��N�DOw���C�,�*wJ6{	���t~������\R�t�(�N�^u�o"���<�� ���E���3|D-G#)	c�%�P<�������	��X��b�/����s���������F�F���"yu�v�{W@R~����(^;���b|/Q
6�,�d���_II�E.)���p)F���q�2J�,���rK1�X�W�O���)���3����!c)^/j������$�)��C1_\���h�}m;M�����Fi�l��(��f��$��C�D.E�v�����v����`#��Q�%9s�t�n��P/%aL�����Q��sC���>��������w�����n%%6�BR�?�<���Swx��j����,���5���6z:jh�����BR�e���)�
����l��0J�I�T�Q������b�R���������{������E����z}D���
S.)��zq)�
���aep����l��0j�?m�d��b%%aL���[�RT�����Sb���[����F���&��FOG
}�9�>�($�P�=����G����P�k}r��]Q�0����ld@���a=m�b%%1��r(��KQ]���`��	`#F�Q��T�J�d��%eQ�\����,�,A�/���o4X|�	`C��R��!��6DA��p��K��x�\�����i�
�J�����6%�8j���6z:j�
S.)�bH<�~Q����1P5���=��1��\/j����]VR��K����YW���R�Y�R%$����
������95���Y%�������3���rI9�3�����s�C�;a�u3��q:=����!6�G�g��!�������r(�gE�,��z��`)%?���$%��lJ1s)�6v��� �n�)�:�`C��R�^����Q��z)	c�%�Pl�<���=��z��H�����(����oT0
!�&yFO��k$%�y�����GqS�}��j�1��1&����d=5o%%aL���ygR��b)�l�-PJQ�GY~%%����e�R�-c1��1��Y^!�����b�xU�CZ��o<	5w&=��L�6"������?n`I���j&/�=�1����|�M���^����iUE���&�������^���HJbz�%�P����Et�c"�4��\���F-	��6z:j�JJlL����y��@\���
���R��F�#)	��%�P\<��������,�J�%�r~
���z��cC>A����X����K!!�����x8UN���gP��
&���1Q����Q�Q;����1�)���8�����z�!�T)^O������[��r(n7���z1�wg�P��{���FM�������m%%aL���{�R������l�-XJA��6�II�E.)��?�W]6V�o J[��WHUm�Bg17���v������L/��M�Wrl������$��\R�c�RT}���o(�,!8=��1q�$?��}D-YIIS.)�bp\���-Y6�,e�H�uRJ����	��e�l�f���7�}��u%VH��8�z�!�g)^/J��E���rI9����l&d��f�J�Kv�R����[��r(���h�}��S���K)IM��WRn�K��x�L�^s�.�{��B��J��@���1a���*�6z2j����$�)��C�Z��������Ps�Y�`#��Q�,'W���a%%e�bJ�p)����rK������_II�E.)��}q)�����~%�P�zW������+G=����!A�h=mp�^J��rI9s�(��_:?�*,�`���F-HV������F�F�}���d���Q���|���Q�^�����������0jQ��Q����HJ��rI9�������3�!��{UEee���
GM��Q�G��3��2f5�X���M)��I�����,�/��WL��
�?�
�+U=i��YI�=���A��3��j1>�w��5����`�15A�m=�-IIS.)�b{�QT���+�����n�J���t�^�l�����2m��!.g$%�y���k�QNu��1�P�3�{�q���E���g�t�����1��r(���Bc���b����I���1a�In�n�����k$%aL����y��"K�+������/f����1�vt��}��^�ldzA�I.;o���wZIIM�bJ�0)�:c�����T/����0�w���_-����7����`C����G����\���zFON���|B�rI9�3��W��s
C��4�
6u}8j���6z:j�JJ��rI9�3�����|��}AM5f\�l��8j���g�t�N�f���%�(�gEu�B�B��N���8�<c���x���>�'
�Vg$%��jJ�2)����N�?�2X�8j06d�*��E�=��JJ��rI9�����q����[�J���GRn�K����yU�)�sJ�:b�:�^���?(EB���e��uD5�����z�����HJ��,i�@�=�(&�����?`�	vv��g�1&�Z������XE�0�W�t�3�bt���s��_PS�@_��MO�(�n�FOGm�FR��K����G(j~�+2�Af�sT��GI�6�,��af,��E1s)�2���C�~�;���PS�@9�lhd)^� ��0H����rI9�������xW��66�(�"h"�F�#)	��%�P��Kq��������u&��n�Jiw�Y!)�������k���@��5�yY�l��D�������]�
S.)���p)����K����t��,Vg�����"&�5D�0DrFRR���.3(.��]J�zE5��[��'�3�II�E.)�b{�(]�:��0��O��l��8j���-~D����0�\R�-r)��>\��Sb(�'F�yU�������K�����{=�����|�k�'�w�HJbz�%�P�=����^w�d���O�=(��6m�q�$=�����E+)	c�%�P�+���[1�������������i#v��#�����F��^�$������3���^��b�R4H��;����R�x=)��WRn�K��x�\��o��!E5��[���{T��$%����!q)��}���Ye����1&���M Q�VR��K��&�������Sb��r9���hR!��%�i��Z�FR��K���6����C�
���z�t�=~�������F<����3��hC���$</��C�t\��b��9��c���������A]I�Q
|m�o����{�S���Z��_2�P�� d�1q�NM��G�V/))cW��K���T�w��������C�/	�
��$`"�-����a�#9IIx^/)��}�(j=?������'��$��Q��B�����$����C��\��fup�C9�O�=��$��Q����#j�KJ��zI9�.��4f[Y���,y~5��m����#��:��u��I����Y�B{�]�IJbz�%�P���i�o��Z��(��d�GMsNT�G�/))cVW��K����������U����N��L�������h���K�'Pl�����W��@(���5�Y`�	�����i��GOE���$%6&!�j����Gq3��>��:MP�����:��`���0�b/���6H
NRs@/)�b�Q��;$<?����{0�I����x������bD�����E����Z��b���%�m��I�	��k^����Q[�v����`��C�?�(�������rxuop���q�4������E/))cVW�UFQk���K���@x��~��`z�(<	�>L4��o����I��h;���I9�3������n�H@��|Sp_I&1&������GOGm���0�^R����h�v��K��P�uz>��^kL/�2�zv0��:��F������`u,�7H����Y����5����K�3���HJ�-X�c����h�C��e��A(S���/Fu�1Ts�d�^Q� 9h�h�lGp�����b�Q�d	�����l�{za�~z�`"�7-������x�������r(�g��e?5�`��K�y��e�o�$����C�?�(F�2V��j�?!��Q�u�%Te�wH��M,�[�}�t(��|�v0�L���7��o�������$f�^R�����pDso�&q�Rs~��II�E/)�b�Q4�e���2�5��Of0�1q�5�}�t�n/)	cbI����E��~g}J0�I���\~���#))�W��Kq5-c�kt�n�)�
�8��`o����<_�x#C��a���cI5=�_k�QTz�8�n����&Y�q�4+U���'���F����k@@9nr����l�Q�w$/�oc��3���S����#)�[�2(�{�Q�n��&p!e�HY�JJ�-��b�R4�5>�Wt1�f>��/�gm\�(y�j�F�X�C<�IJ��zI9��K��}:�z��I�����l��WRn�K���&.ESi��
rYeZ�����sK$��90>���I�6�b����4�yxII�����������n�$pw���R�n������ul�]�qYro���IJb��%�P���y.�W�|��\q#��8\��WF���� )����(*W�y	�r�Kf�I����yi���Z�IJ��zI9���x�N���"�r�b�����b�Q;4������KJ��zI9���h�)��S��a���������K��<����>z�gp����^R��q)���2X�!�C���LbL5�+4�����$%aL���9p)�:���Wuc�b������4Q+Qk^RR�,�����+m�,�j�1�+��D�,Z�Q����\�O��',�6��u�(ZrJ�B��S���#f�����&�<6�&����!��$%�y���w�Rt��yP���S7����<�_II�K�&P|v.ESN�7�!Tt�y*��*��<��E��LY>��xIIS/)�bY�M9e~*��2g	��%:XE�lM�J��!����X����E�r)�r�<�
����z��D��Z�Q����������4M�XoE�1��!����W~����PS�@C�\�g�$iv�Z�0H	NRs@/)�bK\��5K��7��]��������'�3���4!!�\�7z��������H�M��>�(��kpkC����lv0�bLE�TDm�>�vzIIS/)���q)�����H��I��<��k��I<�
��X��!�6r�~��K���&�l���AoP�8������0jy�D��Q���$%e��J�p)���{p��j�1��&2f�����]Q���$����Cq��M�\w|g	_PS��G;���8j��n�QCg|�1}�K���GECN�W�4���n�G))�t��(��d��6��1}����<��P�w]��@�\��P�v���^��������\�`����(z��=it����{�H��x.2��uz�!9'�I����y;�U%�D/)�b�R4u�d!�b��x�)�������8L4�od�x�xII������R4m[�e�%|@M5fJv0�1q�4���'�����e�3&�t�@�?�(���B�����%fa��T����%v0��Jjr#��FO{�����^zI9�3��j�k��u�j�1��&1&���9d�������KIS/)�b�Q4�!�r5���AG6��aG�j�&�<6�f��7z��0�?�X�s�&��5���Bm���&2f�����=��%%a�/I�V���m=?���Y��a���7m��Ac!Tp���F��'#^>�>��f����4D[����K/)�b�P�sP���v������1q��"j����ng'6�^R�rr)��-Zz�e����n�g�GM���nQK��NlL���ucR��Y\!w�m��`#�(����-h���M���C�E�
9hC���M:��}�Mp�4�&�|D�%'))cW��K���u�A�<�������&2f��
��GOE���$%6�AR��<�����+�$������`cQS����Q;�fI��W�����Qo�\������B�������O������v(�"����=�IJ��zI9��Kq1��	��������$��QS�v}�t�����1��r(n��)KX�A����1'�I���5Q�t��58II��R�\��D�X!MY��n,�Y����=�B����?����������I��������$��^R���R4m[,���c(��C���O��	^	�������H�hh�r|�`I��G�QTz~=�1����.y��j�9������t�%�h��o��A��%%1��r(���)!Y��,'����9I�$��Q��K��G���$%aL���q�R�~��X!-e?��
c���?.�,�}��bCh��������$%���J�q)&�1��*9lW���K����QK����|D����0�^R��p)�����W�	(�������{L/�
�%9���0������[�L{o�IJbz�%�P��K������	(��y��T&1&���p�:?��zIIS/)��ur)�v����w1T�v6��wh$��|�O#QlM��>z��[��c#Q������h���`1�P���
�P9]�1j�����2�A�1��i���1!��(>�K��3~l�uB9$$��O�H"j���S��[ �,�P(�)8�}T�qz}�3�?��PB����2L����IY����p�^R�rq)��cP����h��s	���EMn�?��xIIS/)�b�\��\�����v��R�p��&�r����:F�0�>z5�������=�����Zv0���()9e�I��b��A��3��)�=��>�:|u/�7���X\6��!�P=m��%%�y����YBQ��A�3���Y�LbL�M�������	%�gP,2�Zc���K@�O_��
f0�1�o�������$%aL�����G1Z_�x�4���}�C���`�cCh����ICD��/���^R����hjR|�A�<��[i��� $`c�����<}�t�N/)	c�%�P��<�������.e>T��wX���`o���	<�
�Y�~��
q')	��%�P��<��m������<o;�d1�QS����QKKr��0�^R����hj�{��u
���A�7	���0j�f/�7z:j����1��r(�gES���_�%��_<^��`c��).���Q��IJ��zI9����!��+��gk^�LbD%�m�>ze��.�$�P��<��gi��
B���yp�&�� �5w�`��h�=h�h���%%5�+������t=�&rK���������$����C�?�(�r�����'�Tc�9��$��Q���FOGmNR��K����y��S�}j:����e��a:����7�SZ������O������GO{�|;�4H�����;n)��-s�,�_II�E/)�b��M���e�%@(��������z5�Fv
t��%8IIS/)�b
L���D�����2$$�����t��d��9��85{��|"%3;���+���h�)���E�p��)�O�Q"j�=�v}D����0�^R�vq)��W]�o�Bc�yS]�=hZv���s~���h�L/�=E"�GOz�m������%��N��3���.������j���D�=d"j�
�>z:j�KJ��zI9��Kq~/�mEixt��BH��.�G�GRn�K����yM'������.�����(O�i�K"jQ?q'))�WW��I���*=�"b����6Ld���Em���=������� )��vs)�:u>��Z�a��Q�_�Y1q�4���>��{IIS/)����M����� �C;��@%>�4q�4�&����}�.�|8v�4D���qp�3���31�����J�|�gQ���9����df'6�^R�s�R4�e+��Z_Ps���	����S�FG����|:��Rl\��o�n��eSD|p~/�1[P����������.��^�@1>2��D��������$`#�(}�����.Jv)	#�%�PL�K���4[�P��i�GM��7�Q{����1��r(��K��6\��P����`c��i�k����%%aL������hk%X�A��Vk�=���p�A�����B�����4D]�������r(��K�TRX�31������$��Q����#j99II��R,\����:�������
f0�1�o������%%aL�������������0��Pz~u�K(��N&�<4����]��!Zp����^R��MU,m�>C9d	u��I����y����Z;����1��r(��K�T��������-�&1&�����-QK^R��K���.ESK{�Y��\c�`�GM�����'8II��R�L��y�	���%Kx���������'���E����������u�{� )���g��d�w�Lj~��/�O�O�L"j�Wh=��%%aL���K�RL&c�/tc(�V����>�q�<�m���^��%����������K���m2��/����Y�����Sw��L�yl�5�>z�:��S ,�6���w�1��	(�}�]&1&��&?��G�v/))cW��K1����m@@����<'c-�(j������$����C�������
�M�o���82�s�����&m<��!������%�P<#��io]��P�	�}��AM
��a�G�B��I�6�fQ�;m���� '$�(��I�&c�On(��p�{*0�1���(j���QC������n�Ok
Q��,�n���'�?�?�B���b���K�$��Rj����R:.�X�<�b�QT��md	*Z����6��{��^A6���p0��K�D��j�F�������.~E�]A�����G�t0��cB(�]A��U&1&��f��7z:j����1��r(�gE�����#�	5���y�LbL5MB�=����$����C�?�(�w�
�Lg��9X��4��G������"i�x�FObG�p�_�_�����G�tv��;�P��1Q?
��D�M��G�����1�+���h�w���~BM5&�����1�o��|D�NNR��K��X&�l�0�+��U�sl���p����O�
�5���iC[p����^R���^���A�yuc)5�����HJ�-zI9�3�����x�!����?*\���GDM��������%%6�AR��<����x�(�P{0g	���C��c5��O�@h�]�G���6DJNR��K���.E�	����\c;���8j�&j�������1�+���h���u�/���\�d�h�FQ[����^R��K���^\�����-&3��-XJ�^I�II�E/)��e������j�_�}���O&1&���(�����v$')	c�%�P�wE�?�>]L��g��!��������$���Pl�����(�IJ��zI9��K�T�t.�`(�����&1&��&�:�G�����1�+���h�y�� K�P��y'3���U�7��y�Q�kr��0�^R���Q�d	h�\M5O�z/�����%�d�xb��Bc�0���$<���C1&.��_6?J`W���R*n�������[��r(�CFQ��
�b(��2�5�'��Q�$\y����%%aL���y�Q���aQ*Z��y����L�yl��vn���N���J�q)�v[���#��v[��&2���(j�CG-���v)	c�%�P�.E��h\�P��wNf0�1q�4g�w��Z���0�^R�;s)�����T$5�J�x�d�GMQB�GOG�INR��K����\��5��+��o�U�m.�,%����g�2J~�,5H��X6.E��|���P{�5��$��Q�l\�@G-��IJ��zI9k`R�5��K�_Ps��*�v��b�]Sp[�G�N/))cW��K�TS�����j����v�?;8j���v}D-k�������..���S�r����L�U"J���>ze����
�2(�{�PT�����*����~.p9v�@'���]��'�v-�IJ��zI9��K���~
��C(�������$��Q��n�����yIIS/)���q)�6���gh	��9��;������(j���QC�Q���AR�-p)������r�k�}�pH_7T�w������v������IJ����b�Rt�)��&rK���������$����Cq�d���=�b�N�������;�PS���`�9
r*���I���d���5H��xD.E�7
����s��I������~�7E���zI9�]FQ�B�~c���gD���R�ADMQ�GOG�Fh�9%���@1.2�Zc.
c(��5V;���8j���7z:j�KJ����b�QT�	��B�o�A�G���4L�����7z������zI9�3����3h���L	�3���@BM�y�d`�h����i�\^Rs@/)�b�Q4��>���c(������I����I#����jf?�c��C�?�(�o���!3�W;���8J���7ze�3c�����G�T,P��!��Wk��HI>��0jI��=�r'))c6W��K�T,P�@����A���ON���I�~��������K����y����;����j���`c��)n���QC������AR����5��+��KMg=�`#�()n���+��w�� )�b=����u��C9��
��e��F-k���Q�kp��0�^R��q)��)��(����,�`�GMq�������%%6�AR��<��}��9%�:�Y�`cQ;5Q+QC����h��J��(rJ�B�v����3bq���q0���od���0DNR��K���\\��s��F;��-XJE��G�����,!�:��e��X\�P�������$��QS����Qk����1��r(n;��������j�1�	`c��i�}������$����Cq_��g�x�4��m���X���I�$���X4Y�^?�'))�WW��K��%��b(��������Y�x���G�����1��r(7��e���e�%@(�^�|4�x����H����L�&�^�{��>z�{u~�KIL/���gbR\v��a��J�j�e��WRn�K��E�2v�15��)��&1&��f(�Q���$����C1�\����5��	������r��L/�����;�Z0�I���f+5�{�
�]Jjz5W��Kq~�~��L����I�����p�^R���(j����>����xe;���0j������QK^R��K��xe.��d���%`���%`��r�uL/�����k*���|��=�C�g��I�a1v�J��I�a15[$%�������o�h�P.k�>z5K�5�__����R�`cb)�F��WRRn)���n�pZ����exc�i�;�e��&�|���Q�C�OK��$<���C�^\���n��
�r8�m��j�9��Q��S�HG
��=�lb��C�E.ES"���MP�7�R8�L��"j���>z:j�����I�=�(f�1�w�����%@���>P�2�^(<_H�j���{.����^���Z���B�����r(.�K�4��6�u�4-S�:X����C'���/�>��A4m
��I��kr���zI9��K������	����D�+��3����`�cC(2�>z��������r(nYFQ��g�y5��!�g2�I�������GOG����0�^R���R4����;K�P���-��$��Q��=�����$%aL������hmN���������ph���`�xB����4�n����� )���M��1�����-���`c��i����#j�KJ����b�R4�����0��"��d�h�FQ��G���$%aL�����R�^�#VHSf|�����_>�R��I<�
�I�'
�>b��f�<�t����8��)et����(!��������$����C�?K(j���-���]<�.�G8jYQ��GOG����0�^R��,��5f~���t�-.�9�6(����^���������f��7z�{����c�J��,��K������
u:tL7�$r�t�Q;5����m������E��e���Q�?�?j��|��=����d�xGI����2J���X�}��,����u�C(�,�v0�1q�4��r|D�')	c�%�P,����tT�c(�m��&3���8j������QK�KJ��zI9�3��bJ���N�0���E�0�1a����>��%'))c6W�MF��S���|0
�]a�l����<��x#C���wp����^R��p)�?��!'3��-XJ���>�?��� )���gE��S�,���j���Z\rJ"j������Z���0�^R��dR\��S��aW�}J,���Y��WJ�����(����b|� PS���d�GM���GOF-O`'6�^R�-p)�� �}���'�A/=��t�|��I<���

Q>�������+���h�)��� �rh��wPw�4y�Q�t@����vyIIS/)��~q)��Xryg	�|��=?�2k>b2�I<�
�8����
Q�������r(�K��Oy
Zb(S�5��u���:�=��$sD�t��A��%%1��r(�;���U�u��}en=��*0GP�w��
��������
q%')	��%�P��������#�2�b����{
$��9P�L2�A�A*m�{������b�R4%$w|����p#�����pGM��������$%aL�����Q4d	p�<L��=hZY��>��wC�6�3*\�i�����j�GOz�Y��$��^R���M;������PS�y����ggGM�m|Q�����1��r(^�b2��p�4m�?��e���p4�v0���!N����~���KIx^/)����(j�9�N��L77�2X�Q����G�F5���Ql�����)Kr�����b�R4w>��7��-�6T������y�`"�7-����a���$<�%�(>�b4�-�y��3^P�g���Q��m��?�v{IIS/)�b�2�Zc>���U��U�����&�9"���!jr����^R�zr)��h����r8�o�LbL5��u����38IIS/)�b��Mw����B%SBR����D������2%$�U� I�����
r'3;�0H����YB��%`���E�Ac!�bw�<��L.		a�]c�F�m�IJ����b�R4��AY"���mq-�Ld�F�iu|�Zj#����
���{������Y���������^��Uf����9��$�"+�J��)Cty��$<���Cq�\�����V15���<����P��]�h��)�/����m^R��K����y������P�u���C�����O��
�y;�FO"')	��%�P��<����:X�Tth;{�&1&�Z�4J����6X�c/XB�u����h9��KB&����OB��%��$sD�����4��')�9P\)EK�=o�u��N8��!!9/;���E�72�o��!��$%�y�����Eq	&c��1!�CBQ���$$0j�&!����Z���0�^R����h9G��2� ��c�y�$�����(a���7z����$<���C�?K(j=�>Z ��	�@%4�_��2��rQ�0������6��%%1��r(�g��t���//P��1��	���0j�n�}�t�&����R�2��,�����f;�1d���\�L�y5��!~�'
��IJ��zI9�3��i2�����mq�`�GM���7z:j�KJ��zI9�3���e{_u�P��f{�����`z!n��s��$�zo�$�������$%1���r(�gESB���9P	IY�LbL5����Q���$����C��\��s��}y���v� <oz{�m0������R�L2���4;�}x�%')���\)6&ES�z,c~@M5fE����&����d=�c���0�^R��p)���}y��rHHZf0�1q�4o��?�v')	c�%�Pl�K�4g	p�4�:��^�1��Y�N;�����Wh=m�'9I�=o��A��������"VejxY�u��Wj�XP�����`���u=i�s
NRs@/)���q)�kF��M����������k��I<�
�H��iC��$%�y���k�R4%$���C%c�����4��Z�D�|D����2fq�X�M	������N�,aCE��O��vj^����F�^�p�8}�8�mW=S}l<�1���g���L�y5E�>z2j�LNR��K���G.ES�H�B(S����;<	eX��XL�^�W�._������M����{������K��x�\��o���b��K��b�G�GRn�K��x.\����4h��������$��Q��B�JG-m�IJ����b�R4e	iP��5��������0j���}�t�P��c{TB����h�KH���*�sJ����S&Tc�|rJh��I�R�0DNR��K�����)K���j�g��|��$��QS|s����ZF�M��g��r(��I��T1
�1��1/t��}�	��5Q�����^R��K��x�\�������O@Y�\
=��C�p�]d	�����xCC�C��IJ����b�Q�z~�*C9lr��Ld���E�~>�V����1��r(���m1\��Pu	Of0�1q�4��O��Z���0�^R�'s)���m�% ���U^������a��{��t��-8IIS/)�b9�sN�V����p
a��0���!4�g��a�+9IIx^/)�b��M����u
5��lw�&1&��f;����=^R��K���������r�'�a���_M��A���gu�uZ��I�WS�z����cr���^��b�R4J���j~	�n;��#�D��}�t������I�=�(�J ��^�1����Y�L�bQS�������i���$�P��<��,����g�X����!?+(���I<
�)6X��IC<{r����^R��,��5��:�2��|�����j���g[�`�9�
����GO�
NRs@/)�b�Q4����7��Ac!��!��Z2�I<�
�I~�'
Q��$%���J�q)��2(��P��m�g�`"c6-�(j���Q���$����C�?�(��Q����_PS�yd;���8j�[�}�t��u����� )�b�Q��Y^!MG4e�X�p���3��$������������IJ��zI9�3�����
����3nv0�1q��7}�d�j���0�^R����x��-��[�_PS��&�I�	�vh6�z55p��.%aL�����G�������hu��
�8<�*�����!N�!��!��$%���J�p)�6���@C��-������PS�@��`�9�&72�o��A���$��^R����x��4C�;�^{�h�FI�<��^%��R�h��r��>z5����&:�u�����LbL,��&�7�?��p�^R����h��j�y�p�,v0�1q�4�D���Q���$����C�?K(j�9��.�2Wa�;��=������bChr���iC�`f'�|u�X���=%�>�����Vs}�$%������Q���-��a��w�~�Lf0�1q������uy��$����C�&.��d����aK�M�GM�_����E/)	c�%�Pl�b4���fj�>e	�LbL5EV�GOG�NRbc$eP��,����W�d�	��u�#iq�<*�K.�+6DZ4�h�!�59IIy��Rl\������7��-��<v0�1�o������%%aL������x�����75K���&1&��b�����Z
NR��K���fEC��W�d�|,���Cf�����������a����$<���Cq;��)KX��1?��s��`c��e�t=�u���0�^R�}�R<L�|�j�1�`�GMQ:�GOG
���KIS/)���O������%JHyj�,%%���J�p)��D�w:����_�9�y��D�/Z��!����������r(��b6�okxB9l��h�E-k�j���Q�^R��K��#������rJ5�D���&1&���������>�`��0�^R��s)��W7^!M���wCD������$3�����?y�0DNNR��K���.E���v��5���&1&�Z�D�~D����2fu�X�S����Y�2������b|�v0����������b��~������$&4���@�N\�����i ����9�LbL5�2�t��39IIS/)��sp)f�1�31�C�RV;���0j��}�t�����1��r(��Kq3�y�@_Ps���`c��ivJ�����]J����b�RtH�*�:Y}?,�&���_II�E/)�b}�M���
��j�v���n����e;�����n�}��!��KJ��zI9[�Q�z�}k��2m-��%(���]���L��� ��}��Arp�������y������+��r3�`1&��(���7E���zI9�3��a��8�`1�P�+!����$��Q�t���'�v�"����� )�b�Q4e	���"�����_��aD�vM��G�V/))c6W��K�t*|���C�/j�����������������$�	%=����E������-K(���p��l�xB�
���6DINR��K����yM�f���E5c�p�l�QS�z���Qk^R��K����yM�qd	PS�yn�&1&��f[�7z2jq;�1��r(�g�d��
i*��N��E�_,Pc��I<����=mt�#�$�P��<���[J0�I���\5R����rKq�Xd����B$�r�)��`"c-�(j���Q{��$����C�?K(*���;��P��)�y����L�yl��MR�H!8IIx^/)�b�Q4���A'Y�r�k��I�	��4	�o�t������S�%�P��<��,!
n-b(���{	f0�1q�4�7���Q�^R��K����%��,�,C��,{�aS���&�<6�f��7z�(w��HHgP�2�J��A'Y�p&��v0�1�o�����eta��y�AR�����M�yp�C9�T��}Na���T�����^R��K��X����T��Y�2_!��w��+*��>�16�&m���!��$%�y�����R4��]�N��!}m�LbL5M��V:j����� )�b[�M����j�?!8lr�a��Lb�q�8x�����m^RR�l���)K��;K�P�5K�������`"�7-��}��!bp�{� )���gE�^�5�
����biK��	�IDM������ZMNR��K���d.ES�p�jA�e~���3��$��Q[��>z2jw���0�^R���R4���;K���d	������3�����?�}��!��$%�y������h����A���sv0�1q��������IJ��zI9���h�W�����3���8jY����%%e��J�0)�����q3��-E�7����JJ�-zI9�KFQ��=� ���2��p�\M�8��}��j��:�L2���4��i�=	E�q�KzL�xF.��E�-�vu)�&�T�������[��r(�]FQ��
.�a(��2�5�'��Q�$\i����%%aL���i�Q�������2�Z��@B���$sd�����)Gr�����b�Q4��p1�0b���F��|���bD�����R4�W��U�/����R0�I�����'p���E/)	c�%�P�������f0�[�����WRn�K��x2��e�~�����������g�^9�e{V;�dza�i��<+���&')�����C�Y���T���,���~�II���Rl2��elp�C���kz��uGP�kAux�O��
�����a���$��^R��p)�{�`�;d�53���8J���f[�\����C�fE�
9h�
���v��$��Q;4�����ZKNR��K���N.ES�����&�������!�&������Z[�����H�M��>�(��D���)���s��_1�����-�G�����3�^R�e�R���p��F�v0�q��&JU��h��J��(jW�A�Uu:��WT�w�>��Z�Q�~����$')	c�%�P���Zc��b�}�1�d�GmWD�7z:j�KJ��zI9������{�f*��^Ga��I��s`?�`�9�
���0�?y��$��^R��,�hH_�b����LbD%Mn��2J���^R�����i�,�B-�D���bL��h��>�V�����\)6.��b���,��2���<���h��>�16�&m���4��������r(�g�����^�1T�o���`c��%E�~������b�3�^R��,��5�50&�������`c��)���o�t�./)	c�%�P��<������%`���%`�o�=��F�L�yl�Ma���iC��$%�y�����G��x~=�1�r8���LbL5���o�d�Vtx��d��r(�gES����1������GM���FOG-zII��R,L�����^�,�j�1ot�;���0jY���FOGm;�1��r(�g���S���}�=l�`1�,��'��$����F����4��')	��%�P��<��M�m�j�1*��>�+��&�+�G�v/)	c�%�P,;���	~Eux��K�9���_II�E/)�b]�Mv���)��?��0d	h�\���l�80���!��������IJ����b�Q�z�
^������v0�1�o�vD�')	c�%�Pl7�������	����/!%3���8j���>z2j���t��LIz�)�{�Q�&c��,B-�9������e9������	�6��1�r|�	NRs@/)��rp)���-����{��C�O�uMf0���!��}��!*������4O���L���z�X�>�2�=��j������~��h�d�L/�=E���'�wd/)���\)6.E���1���6�L���|��\a�Y�?�Y6P~)M���yo{>����o~u��������h:�9����Pi���`c��i��=�Q;��$%aL���{fR�M���@C9������I�	��kV����Z���0�^R���R4�i>�w���k��=o�;���B;���[�����$�{O�_��h��-8IIL/������x���8(y�P�m���39���=�+����\k��&�n����S}��SNR�M/)�bL�����J�FCXJM�>�?��rKq�Xd
		\�m�b����p���$PT�������\P���
�zIIx^/)�b��m����%`(�WwFe7>w���i�k9~D�HNR��K���#�������Z�4hYd�"�{���=�/'�<4D������!@s������r(��������D�P�r����S����)��G�P����B�s���h:��� K���j�m�e�s5�!�s�Q�kr��0�^R���R��,��k�v)`[K&1"��7�(J%��d��0�^R���M7
����ZM{�yP�A�����:���`�9
�jR��<^Rs@/)�b=�M�kn�,C�Kq��Mg����Gn(<g�m��I����`�������$��^R��2)�
��A},�r�Cnh8U������Z��Z���2fs���m+��^���fs
����5E�q=�'9I��i��A�����!K�+�>?3^��&X!q�vE��G�����$�P��<�����U��_���)��$��QS����Q���$%aL�����G�����AM5�v��$��QS����Q;��$����C�?�(�/�M-;��-XJ��M�II�E/)�b�P�.c��C%c6;���8jI���������\)6E�?�>���?�V1��1���z���c��|����=i�g	NR��K����yM�����
���O���&1&��b������%%aL�����G�T����,C9�����I������~���v&')	c�%�P��<��}J�B:��i��I������~�WF�1]�K����%�+��
�:r�*�%`c������7z:j58IIS/)�b�PT�n�b(�}�\�`c��i6�~�'�V����1�+�"��5���)1��_��C�z]v0���od���iCl�IJ��zI9�3�������a(���Fg��O������~���v')	c�%�P��<���}ep�BE���g��I�	�5����Q+^R��K����yM[�u�
x��%Z;���8j�������U�`�.%aL�����G��%Z}����%����)�C�������Y])VE����v�!��DF�Z�Q�����c
�^R�z�(jW���>�L'�u�
�z�PS�@Kv0���|����6hId���zI9[�R4�{~~��;���MMn�>ze����
�2(�{�PT��m�>C�2�6�����3�mY�`�9@D�6���i�KJb�%�P\V.����f��K5R����rKs���M'��z��������/�o�cy�i�F�X�C\�IJ��zI9��I1[�G-a�lC��b�6Tw�]�Xp��������Z��IJ��zI9���������	5���i�GM�G�GOGm���0�^R���R�_���L�,��8�����$����C����i����A(��)b�t�)�`�xB�p���19IIx^/)��x7S�%����j�1A��LbL�o�a��G�Zp��2fq�X��x��Dn)Z�����+)	��%�P����\yY��2�r��`c��i���-����1��r(���8��w��L�,��
�����$����C1�2��el��P�b��V�����Z�`�CC,���k�0����$<���C�Z�M�����7�;�3���8j�&j�#jBs<���3(V&�u5��	�,}��u��H�������`�9�&72�}�Y��x�Rs@/)��}3)n��)���I�$n�Rn�b�>�?��p�t�@�I\������i�r}7�'X���{�+���r��$�{O�G�������!�4O�X.�l2f}g	j�~2{����VW���
�kv=��a��5	;����r(��K��o�`1�P[u���t@%��������v"4��S,i�A��(j���a��L�'��~��zg;4���c�����=�"�O$�Pl���ke���g�{��L�A"J�����%#$eP����h�����b���W�K��	VH"j�Wh=�}NR��K���D&��T���/�P��W�+:I9]N�p�N��T=��KJ��zI9�3����mO��C�?u�7�y��x���������ZJNR��K����%
9%^!MY��1d<_�`�cCD�!*m�#'))�WW��K���p�/�a(��~��re��~8j��w}�t�V/)	c�%�P��<��S��xg	�!}=��}�W5Mn�=�#9IIS/)�b�Q��Y^!���`1�,�7H��	`�cC(����iC��$%�y�����G�!��k2�I����$\������[��r(�UFQ��
.�A(��{{��|����i:����Qk^RR�l�������:�)!���{~�A���dy�i�F����4��&')	��%�P���Z����P9e�v0�1q�4	�o�t��eH��{I9�3�����\��P�����Lf0�1q��U}�t�/)	c�%�P��<��-�����?m�Y��C����|��aChz�����h�IJ��zI9�3����/��b���'��$��Q��v���Q���c5�����G���)�&q�RS���II���R,2��elpUC9���e��GM�p��#j�KJ��zI9������S|�9��!�D��������>m��!vM��>z�Or����^R������$n�Rj�����T.i���/j�1��������1�h��Oy�%��$��R*6����HJ������yM9e\�P���5���$��4Q�Q;����Y])VE�1�;��P���`�/�O���I�D��Z��!���99IIx^/)��r�(*=��V1����cMv0�1q�%�}�d����$����CqM\��=��b������Hf0�1q�7~����m^R��K���\����|��5����d�GM���GOG���	^>�������\�L�q���P����&�<�Z�D�}D�'))c6W��Iq5����(�rH_�i����0j�&�;:jW���0�^R���R4�����0���5��������.��!4��g�0����$<���C��\����k�lC9d	���I����y���#jwp��0�^R�x�(j�9�
���'�GB�`s9��Q�t�����V��$����C1m2�Jc�a�%@(�-k�yS��{�>�(<	I�&�^�{��u�����$��^R��M�f��U-������`c��i���|D����2fq�X�w���]��>�2�z~7�qx
o�}~��q]v0��R�y��h�=Gp���^zI9��K�tD�.�`(�#��H�>G48j�C�;~D-zIIS/)���M	�s��}�P���I�/ Q���=�G���$%aL������h�G�+�a��[
!��a��,v0���!��DYhC�58IIx^/)�bY�MG4epC9TT#y�T��i�oJ����%%e��J�r)��QJ|g	_PS�YQ�������ir�zD-&')	c�%�P�7�b�f	x�t�?k�&��SD�4�K-i�d:�*�n�_P.��G��f��������i��
���f��3D;��;I8j�Ob���Q������I�=�(�6�������s��`������H�����w���$�P����,�����:hq�Y��?;W8�\��C(6���iC<�IJ��zI9�3�b4��A�<�Z�Y�`c���E����%%e��J�r)�����e�C����vn�L�����7z�
��9~\����@�?K(j=?hZ������;���.�gD��K}�t�rp��0�^R����h�F��j�~�yv0�1q�;@}�t�n/)	c�%�P��,���8���0��
z>Y���087i�h!9$$��`����4	�o�����NR�K/)�b�Qt�?;���w)5��o�$%���J�q)��e�����r�"��|�5�+�7z:j�KJ��zI9�������kt*[��ySg�u�����z)��$�z/kN�~�'����IJbz�%�P��<���uy7"���zf��GM��������%%aL�����G1����F�	5��j��]��JDM���>z:jWp��0�^R����h�Z'VH����&1"��&m���%#�%�P���G��qX�e���P;Ow��I�����7�Z��������1�+����8p�s���2U����HJ�-zI9�3��aZ��M�(SN����vx�P�Ub0�I�6������L`'�zI9KdR45D_�:���Is<�L���-XT����{0�I�����t=��-xIIL/���u�R4�b���K��6�-�&1&���p�-Q�����1��r(��K1�c�B&����b�Y8�:���$����$�~�NNRR���+��:�SA1��	��-U�7�������n1H�����G������2�����K
f0�1��)za���Q+^R��K���$E�1�e�SB��9e\�`�GM�p���Q�M��^N��\��>z5�����mLC����9e��`�xGI�p��+���S$�P�VE����Bec�`�G-k��>�vyII��RlL��^�����K@����;��������x����G�*�fx���c�+)4D����p�3��`1�����#��$��QS�����Q;��$%aL���G�R�_��3��$n�R*�����HJ�-zI9�SFQ���/�P9e��LbL5M����E/)	c�%�P����;����M@9��	���>9%�����R�����$����C1EC�WH�W?�s,������b�x�����8��$%���J�p)�6����>���fT�����8j��._Q���$����C1_\��-���}<�!}�Pq������ir�+~D-')	c�%�P����!K�+�a���6X���~�{��I<
��$F=m����$<���C���M�qpU�j�1t�}�T���iJ<���Z\��$����C�Y�JK�[��)BJM1�S�JJ�-��b�Q�.c�ooP��%4���,��bQ���P�Rn;�hzA�i��rx�IJ4������Xn&���2���t���R������JJ�-zI9k�R4�����A�p���y���i������%%aL�����R4��u�%@��{�)lv0�����)6������58I��i��A��3���\����8
�gb�������.��!{�}��!rr����^R������R�`�`)�F��WRRn)�����Bk\�P�s��^v0�1�o������^R��K����%��|^����Y������E;�������>z��B@�+W&$�'P��<���%y���j�1wT.]j���i�d�FOF-��IJ��zI9�3���?�c��I����������HI�E/)�bfQ4}�g��+����zT;���0jI�~����Z���2fu�Xe��|����~���������`"�W-������@�?�c��C�?�(��)�A�U5��;E8�\����)����Q���$%aL����YBQk���a����t��$��Q��3�>z:j����1��r(�gE������/e�y���Q>��&�<6�f[�7z���uv�y�K����%�����1��^BF�>��!�����=�;$'))c6W�MFQk��5Pe���}���{����������@����=m�l���?I9�3���5K@�?�)���V1���;'3����g��c�FO�h��������ym	��b�r�O{N;���8j��"}�t���`L,���YBQi�gd	�|#z����g�>�MW�e���T�d�L/��Eq������s%')�����C�l\��#�gpUC9��5��$��Q�2����KJ��zI9k�R4��%��}e�F���M-v0���!4����(!8IIy��R,\���2h��V�,��Y��d	0j��������$%aL�����R4m[���5�%�	`c��)����e/)�1
�2(�{�P����e���=?��&�O�K��'�8����
Q�������r(.�����u�Bm�m�:(��H�m~B��wt%`�9�����.�A��%%1��r(������j��K�j��%%���J�r)�6������Y^!���e�u0	���U�72�v�
NR��K����\����6h��5����>0�1q��]}�d�����$����CqO\���D3�j/��K��/��WJ�W�CH�'P<E�26�N�v� ���LbL�]����G�6/)	c�%�P<W.E��h���C�sJ�y��V�T&�<6�f+�l�-��RR�o����������aK�;}>�ADM�_�����$%aL�����Q�s��j~)yF�lN�OqQ��v)�Q��:IIS/)�b�2�Zc��,C��u��c5�x7-������?}>������@=��;9IIL/�����R�M�,cB(�M.t�����5���}D�xIIS/)���q)��e�����'��3�X�uf$���oa�t��������'����$%1���r(��K���,���Ps�Y�`c��i�a����KJ����b�R<L���u�j�1�	`"c-�(j�����$����C����w���Xh[��bY8l���L�^��!4;%��X��$%�y���%2)�z�o��:��%�B �^�8j�F�}�t�����1��r(��Kq3�~g	j������\g[�|��t������O�l�{�D�-��6t(7_����m�Rt�0�{����Ki���w��A�a��_E�2fu�X��"��i�&����d��BS�R&�P�I��b��A�����v��w���Vk��������z�	5uz-�L���S�����k�IJbz�%�P��<��s�kE�L>m�	)9e�II�E/)�b�Q�\���e��A���o���-�K�5E]X=�}���0�^R����h�?��,B�������K�<�ZVT����Q;����1��r(�g	EKN�VHS��m7-#X���v0���!v�!��!Pq�c[w��,�UFQk�:0&�r�����������=5�s��v�I���YBQi�cd	�\��<����	v$`�#C|���7�(Ckp������Z����q���<5M��1(�?r"����x3�d`�h�����Q���$��^R����h��8�_�&��F���N�s�'�����:����h�IJ��zI9�3�����yc�8$$i���0j���=�\A�KI��Rl\��m�sp�C9����J�D�lZ�Q�~������$����C�?�(������f��E����z���L�ylEU=m�'8IIx^/)�b�Q4����`1�P��$
�#�iW��}aL&�� ��m�=i�xxII������G������w?��>��C����$�xB��FO�0�,�>�b�PTz>��b��A	���8j���o�d�RHNR��K����yM	I\��P��$������P��+
f�9�:��L2���6M"P�����$%5��+���h�u��U�r8�A��%`"c-�(j���ZINR��K��X/.E�5�4(��P�(���LbL5�!C�Qk^R��K���"���f$o�,A��,y��������/�V�A_��3/�����tW�B����W���������gE���<(b�P�������L`L"j�{ }�t�/)	c�%�P\.ES�����.e���O���&�<6D�����Bp���|u�X�Se�5h���oW��qF��p���i��GOG
47��n
�r(��������Y��%���0�1q�4��-}D-{IIS/)����O[����.��Y��i�	��T.�q����F���O�:�=Mc�>z�{7hW��v5�4�	��K��]}�X1�CBoJD��GM��>����^R��K��x�\������-U���������Q�jt9�'qj�>q'))�7W��K�t4��`(�mX��������?���Q{��$%aL������hk��X1��9
��J.�8jI���G�6/)	c�%�P��K���>��cP��c��_�q����R�ABQ��GO:�#$=&PL'��iG�4��PY<iN>Y���������$%aL���y�R4mr�A�3�rhv���a8j��Y}�d�J���0�^R�+�(j�9�:&��g	����2h�QP�Cv8������{O������P������%eQ,\��m�2(y�P		�#�>		���m}_Q+^R��K��x_<�������eX���Sp�uP�/�x�od�'���Kp����^R�'r)�vD����r��@)I�iFDM�mQ�����$%aL���e�R4�?���u5����g���"j��}�t�./)	c�%�P�����I|KC�{�B�/�\�
�TP|���d�dzA�-��u���������Wu�X�M��mP��5���f0�1�o�vD-zIIS/)�b��M�(m�uL5?!yB��	>�FDM�������F�� )���g	EC��WH��;���C��g%|��E6��V=e�]=L�-��r(�g��d�w�j~���[2�I����x����Q;��$����C�?�(&c�/FP������-$3�������o��!rr����^R��,�����c��Y�`c��eM�
5tY�.%e��J�0)n�d�w�j�o��
�D�,Z�Q�~����yIIS/)�b�Q�L�|_�#�vk��=�X���By�C����v0�����������6[�$�P��,��i�_���j���s����������T=�5xIIS/)�b�Q4����b�'�e���OO�|\�L�yl�v�o��!��$%�y�����G��%��s�O����v0�1q�NM��G��v�~:��R�L��-K(c~@M5fB�������������Z���0�^R����h��0�>��3��#��oD�4��������;��oI9�3��y/���s�-�c��!K�;�����W�o��!Rp����^R�����L���DP�C�p�/�H�$��Q;5������]^R��K����y�1���(�,�n�&1&����=�������\)6EC��WH���}?�1d��%<�L�����7z���a:O��q����h��wc!����-�O����f�GOG
]���'X�e���M�����'�a����u����9�\%��W�GO�JNR��K��XO.E�^��c��%��&1&��&Kh5�696l5H���6.ES����NA@�/�,��E�BI5Ea=��KJlL�����YM
[��}����%@�'�����U�8��,����{O������^NRR���R,\��u��c��������D������������1��r(.�b6����;3��B������'���?e=�=9IIS/)����{	p�4������cY�6L�yl�+t�?�')	��%�P�v.E[�0�N�5��;*\�.�)��)v������bh�����i�}�Q����{\Y�r�vP��}�W��eMg�>z2jqINRR���+��������Ye9�d�j�FQ:nm�_�zI9�[FQ�B���C9���d�GM��>�G�rp��0�^R�3�(j�9�|���u	%�jB	���0j��.������%%aL�����Q���U"����=��%�5��$�����B��a����$<���C1�2�J��A�2u:���$��Q;5Qkt��w��RR�l���)KH��7���c���0��y�Q��@�������$����C1?\��;��
+��%`���>Q���`�cC(�������������r(^YFQ��<hZ����g��O�G"j�?��IG
}�1;�y4H��x�2�Zc.�`(��E�������������>�vxIIS/)���1)��<��7����%@�oY���L�yh�M�
-��)9IIx^/)�b	2�J�_�w�a/}Q&1&����v)t���d�RR�,���)K��o0�C����%�h�FQ��G�V/)	c�%�P���n�K��_<��2d	����>�}�H&�<4��h��GO�HNR��K���"��������P��_��/$`�oVQS| ����Z	NRbc$eP����h��p
�j}AM5&��.��D���}�t�����1��r(�gE�N��h�>�:���6�}�$%�����YBQ���� ��P��������	`�cC�C����]J����b�R4����!"�r�)Q�;	���E�7��o�t�&�S/)�b�Q4�<���}_PS���*I�$����FQ������%%aL�����E������0�[�����O�II�E/)�b�P�.c��S~ArJ�B:�����@�iKBq��GOU:��5H����yM9�3h���Nc���>}]�����U:jONRR���+��i��\����jLx'�����Q�l��FOG-{IIS/)�bfQ�����yg	_PS�	�����F-j�s��5T,_�zI9�3�����p���/��A�L���>,*�>��!4�~�^7e��')	��%�P��<���*,.�i�JH�����7I����;�~Q#���G�����������<�J>;OP������������\)6.ESNY�;��P�/�W����?����Vy=5t����AR����xXsJ�HG���T�9b�Q����F����v���@�?K(*W�:h������r������+)'��')	c�%�P,������K�*;T���&1&�Z�����#j����1���u�R4�f���Sb(�2��`c������G����X����C�.E����
i��T4r�,��V�L�ylM����!jp���|q�X����-\v0�[�o e�RJ��CB�l���YBQ�����1���C���D;��� j�Q��HGm�h����Q��	����G�������/�u��g�m��LbL,��`�����$����Cq���9%\!Mrm����_!��%��$���P�������������r(n����E\1�P��V�`c��i�o���Q+^RR��������G�DB������}���U�72�~��8��5�!%�y����-������3u���TB:l[�$sD�mq��\^Rs@/)�������%����V����������r�W3��=u;�`�L/�=M��>z�{�v�����C�<�w�1�W�(�?�qE`.E�D��}�t������zI9�*��5��^�1T������^��������a�=�`�L/��M�M��u
NRR���Rl\���d}_�!������D�lZ�Q�����KJ��zI9���x������Tc�l�GMQ��GOG-&')	c�%�P��K�z�X!vD��&1"��f��:�QJ���
�kP.��G���u�����������LbL(��ws�II�E/)����(*�����r�)�`�GM�p=��<��sJ���O�Q�s���0g	���gO��I<�
��rx��!��$%���J�p)����w�L�!}-����%;5M�U���=�IJ��zI9���h:��������{��&1&���5z=5T�q8n�bI�	k�R4���2� �f�����n�xBs6�v���4�M-,�1�b��[_n�!�v0�g~�J�o�$%t�E�o���YBQ�B��gP�����_���EM��G���_Kv��,��K��S����PS��<�&2f�����=��KJ��zI9�3���o���d��J�h��o�J)W?�`I�	�3����{�� _PS����&1&�����o�t�jr��0�^R����h���������%3���8J���7zS�\����C�?�(:�-8�L�,�&g���$��es����-j�1���������<P1�����@W<N��XJM���II���R,L����|.�}AM5��j���c���E�7z:j�KJ��zI9��Kq����
����,���2����p�^R��M�������e��W�s���������!N�!~��
q#4�DK'P��<���s��!�CN�;���8j���7z2j'*���9�^R�������3�G�|����I����II���R�2��el��C9l5_h�L>[�8j�}�����^R��K����yM��gz���!��S2�I����I�~���6����zI9�3�b���+�i+6��bY���;����������������wH,�r(�gES]M���P�!}-�+���0jY����#j����1��r(��K�T)�w����D*��>[�8j����>�v$'))c6W��K��O�WH�nk,���p8f��L�����>�@������^R��p)���A��/���l��,�l���i�[��Z���0�^R��y���!�K�^K��)������F�GRb�$eP��,��\��:�)!�n�
��S=�l�&�<aE.�GO"��IJ��zI9��K��S�A�o5�uY�LbL5�Vd=�+8IIS/)���M��i���j�1K2�I����4Q+Q{����Y\)&��_���*����R*>��o�$%�������h�)�;��P��p�������1��$���Po����h�IJ��zI9���h:���O
`(�����`c��i�c���cp��0�^R�c�Q�s��C9�����`c��i�s��Z���0�^R�s�R4m����%@���m;���a��uw0���!V�V�Y?�$'))�WW��K�t�|�C9�������Y�x�������')	c�%�P�7��iK����P�kJ�&1&��&�K�#j����1��r(���7���{�]K�$Ip?_�Z@���s�O`����{"�d�N>���F����9&b����Z�.*��QS7WU�/�)K�2�3��Cy��*��B����!}�b	�R�j���5�=(���;������	�����	��\�t'!J�(���?�G(�����r��P�����=��|��\��^�e.
e+1�K)�R�&O�4|�Usa�������v��Z�;���
e#1������(���S�+�3/�S6ByBlh���B����!}��Z��xv�uMI�43�|%ba�2���n��1�Fy\#����(��x'���B�x�����[|��4yZ�5P%��VW?���N�����tx�f7�����v������g�|H���)��U���=�-�ir(���^�ld���*/S�g�J�������!�'8�t�u��ehB����e�����������$�vU([��v)��Q��?K��U{��@�P�h����S(y�!}������xr�PSR(�����R��k���W��k�id��tI��s/�x[��o�����B�x�����cy����������=MQ{&1������������:�5B�^����x61�z��P����������L���8������`���fp���W��������3�A�jbz6������j'41��������P6�|H���)�jJ��`�d
e9Sp���B����R��s�nc���z���f�������U��UKW�����C��0?JQ�C��uM��.(��+�=��|��~1�Y5v��\�:!��P��Q�Q�@�)��l��x}�)�A{&�yB�0��_�L�c.
e#������?JQ�<�������<�`�$&[��xh�n���j��P6�|H�h�~��s���`�d��9����S([��_Jq���m,�5%����������,:�S9���C	q���� ���~BH�h�~��t&{k^uAM9�A{&1���)�n���j�pQ(�y>��P�?FQ�)��V)��m�t�g���;3���U��^�Fb��#���Q���\��|�����<Sp�~�;���-�C�E��3�nc�YDJ���w� ��O��Y�u�C{����wfy������E�l=^���G)^p�����T�g�P(���B����!}���>G��6v�m�B����i/��Lb�U;q��~}{����i����!��W���G)*.�qt�J�u�J�9?]P�N����yB�)��N��
�����C��#>J�K9_����z��t�+�=��|�N����Wm���'��(���1�QJ�$&�z����A{"1�vb^h���j�U�l$���>Bq�X.��m�����r&��{���-����(�����,�C9���;�{���MD��S9���C	1�������P6r�|H�8��RtR��'�
���S:�t�g����!�������aw��R�#]z�b������������]SS�U;Spyg��U�l$���>B��G)^PS�X�����3W�+��l9�G(��A�^�SN��]��ML&+��;�U���U���+3������G)���1��l����P�E������_w/MX�G��G�'M������IY{&����)�Sn�����P6�|H����/h2���k��35s��F���#sx����p��3�
���u�	��%�[�j����~}{��U�l$���>B�L�R��-(L��ix(���x�P����������Xm����������f����$��g����NB��E�l����>Bq^�(��^�w�^51���=��|�N����o���E�l$���>Bq)�R�`��2U�5>��P������B����!}����xv�?@���5��TQ�����Z<Spm�����B�H��!}����(����%ZJ����``�3��5>���83���;	�����5%����(�F����=�-<�g����^�le�v)��9�gw���)����s���=���Y<�j�|g��|Q(�y>��P<��(�L�0��dP��kJ?d��/��UK'
.���U�U���)���/�~���[
���](���9��sJ?�����'
.����`��t]M)���cx������1�%��F(OL����S(�r>��P���(��!���������c�K���U+gV���jK�(���<.�x<H1K���q�A�jb�U{*1��xh��zg���B�H��!}��[���3���L��P�h���P6��|H���sOncq�R�;���}�:�39����~}3!"����9
!}�b��R��c�_���^51#;6����|��\��Y5��_��%�3_]�(F�(�
�4�`�d��*(
��F���#��(Eix������L��Lb�U;Sp�����W�������G)J���^�����}~��s;��V������n~F�s�}\w�(��#��?=7(L�)������|!W7�5�B����|'�~}s�R������C�E��c�*!k�{P�������IL�j'�e����F�.<�!��@����j�e�����3����S(�r>��P�?FQ�)�R�����r�u�g�����������M4���/�k����P���7J5e��������J����O!�U;�� ���U�C�P��C:�E��c��2��{P���[���IL�jgj�-�Y5V����<��(n�Q��Z(��J����������vF���;����B�H��!}���(B|��N33��
gq�i�q��k�<O�3���t'!�|Q(9>��P<�)j�)���C]ppz��3�IW���Y��7W��W�������G)J^}%�U�=��L�0�:�S�y���f���j�R�]�!�P|��ce��!��Y��,^~��e�'r��'&@���	A���!-�@q,Rt����K���g	a�:�3�IW���%��o��~U(�y>��P��sO&�<�*�B��QXp��]2Kh���F�~}s�fb�����|H���s�*�����l�+�,.���e�gr�'��*�w���B����!}���(
�fp
�B]���7�����v������\�Vbn�R���x61��J�P�?�
a���J��,Z�0�Y5b>�.�2��G(��Q����!/j���=��|��L|b:�J�����1=G����O
p���;��[�U;qG�~}s���/
e#1�����?G�lb�k���o]�<�`�$&]�3��_�^�|U(�y>��P��s�&�Z��J�x�_0m���L���83����� ��z([9�_Jq����_��7���\+����9�Je���z��x(A��N�5\��3p>��P,��__^ukDt�g���������+��l9�G(��9�g��RW	�H;��sW�=
����P�������a	:�3���3����7so�
e��:�G(.�1�~���|��$�-�O�61�^1�+�=�����d��$���4a��	!m�������'�|b<�P�W���-���s������y�����z�W([�r\J�x����n�:������}��������`O=�����v���#Cz(����>Bq[����X�O�ls�e��t�r/Y{&�iBLg�s{��s�(���?�G(��Q�R���<�����P��;Kw�Q��%&+<A�	���9������dE�#��(E�;I���������=�������T��o�Z���'��(���!�h2�H���M&�����w
e#[�������(J��8���C����J�Rwxlu�p����8�����s/����N�m�E�l=^���G)�^�qR��4c!�B���%|�U�id����,����o�����P6��!}����1�QJ�y����&�+��Lb�U;���_�^�y�(���<�G(���q��;dT��i�fLY��iP�Q{&�iB�G%���	1���P6r�|H�h�~�����e�
� A�z�]�U������|��� 'Ff���	���B�x�������(���9/���/����/1:�39�����~};!�|Q(9>��P�?D1I��4���������tMABW-�y[�~}s����P�s����(E�J�|]%p������k>��X�3�����W������C�E��c�\%�2K9_�4X\p,���L���8sfw����X�E�l����>B����<J��������Y�S��9�����~}{���B�H��!}����1��8���;���$�������vf�Ts��8\�j����+)����*������>�`�$"_�3�����\����!}���(�$mZ���*�o��E{*1��xh�n���j������BH�h�~�����AbR�&Okd�g���������Wm�*���<�G(���������}J�x�_p��1e�5_�o$��s�-�I�}�(���?�G(n�Q�R�����@�jb���Lb�U;#P����yv�\��<�G(��c����;���k�OC�| �~�;���-���G)JsJ_��i@]PS� �=���Y<�j�zg��U�l$���>B�X�(�}�U��<y�9��5e� �=��<!N\���	������(���1�RM&�S���<�1�`O$fc�N���7W-L��P6�|H�8�)^���&�X����P�1��_�N�ld���>Bqr�Q<���W�P�ob��0�`�$&_�f�������
e#1����nx��t*��������
2�3��W-�Y�������P�s����(EY!�w�
=?2�S����C�����$]Ix����Uk����{$��+` �laz}�Z
DF��3�IC)}�>Epk�|����^��H�������0���5e���Lb�P�)���P6��|H��s�>���)9�5e�����v��J��Um4��:�Z�F��_�G���G�'�)cm��������=��|��\i��jk>��$�~)��A�N+���au�H4�i��f$JW��������W�����C���<HQ�pJ��@�jb��^c��W��[�����%�6��[���N�@��G)�.�|���[�ifu�5�n���&cgW��>�|H�8��(��!kg��}��
`�$&_�3��2�Y��/
e#1������(E��I��9��`V�0���fV�W�L'�wVm�*���<.�x<H1H����k�{P���+���k��j�L���wV�.
e#1������(E���;d����y9�����`��<O�3����"�|M�y�����G)����3�Z���N#�'.����P6��|H���G)J�E\1�P�����)��%�����we���W-_�Fb��#������5�=(�J�9��7y`b�x��L#!N����o'�:\J��BH�����(J5eF����c���?�o��/?�������>��������h������-�?������������|��_>|���_�dt>}��o���������������������o����ooI���/����~����G��O�
�|��O����?���?~���������>?�����_���������������������������~����n?��o���g�����������_>���>�������~���n?���o����X����gF�����q�Q��o�=�����/>���%~��������?������k9nw���<���W��������m����w����������_}�?�?K�����_�_O������3h_����������������������a������}��l7�/�����������L���?��O��`�������_o��������J�R�7/
M���4��T?�����$Kv�3�,7���6s�~��PE^��Hg�3���Y]���@)=o���6�kC�]q��fcZ��.��i!�c�.�.@����8J��Z���	���
g!%�
,VR��QZ������.3��7
C}�okCYL�s����+�k'���F��g�����w�6�*G'�i����fw 6r�":imv���D���K��o���A�^g��0 ������}��%�N�o1Iks�/ ��=C8im 88��>j��J��!���y�����,�?R%J,�����,A��l�i���.�
�@�{Z���f��4c����6�u����������u�'P��������4�CMR���Y��� �Ii0����(��i�P��L���*T��gf���
'��\7x�~���B�F:�$Ik��^�����\7xU��a,��������fP��EJ��0��������������()�(	�+D���9����(��a,�V����CiuZ%!���%o��	��c�I��p�oE������@I�.|d�NK���	��{6XHO?�{3%�i��Lf{{sKP���	�(�
e�$�Y�d����6����U��FekC��,k�9��'��Ci%a%!;��ZIX�	��(�N�,�'��CI�m�3(	��w�����z�k�M(am8im���1�PZ�����g���y���O����,�48Y7fJA��$d���H��Z��B�A~�0e�vfp�n������$d��e���mks�����,����3%=7(	��w�Ty�7������B*l���1�PZC����'=7;8�����������3%=7(	��w������A��g��M@�~���"5��wne�J��^�����	���i������NaE��G	�>�1x��
e�%u�n�T��6E����W[��6��J��t���X���1#P��L3�"�z�����7O�������@���M��������1��q�>�l�J�C7XHoM?�����"I���KB�'PE���o@�o�A^�����6<�1(im���j�j���'P������7�n��2�AikJ��2VRI�B`�J�p��t�u�^���AI�z%a,���6����(ym(�p�����q��$P��XI�`�g���Z�B��� `Yi�R2(	�c���X�<�Ru��E����u��bPR�^@IX�JZ��`�J��(���
h��M|����J��1V��	��<����B�n��Y�7�
JznfP�3c%=7����(ym(m���f��7(imP.����\�7x%�i��6�XA��o���6+(	W������>�1x%������@��o����@I�����������F���,����u|�����AI�����������d��B���Y�7�
J��vP�c%�o�uy�'Pr-�YHv�f���AI�r��� ��(� 
�.o�J^�BY������7(?IPu�>l��A���u�'P�=�������<�N`��X7�����%��\7x�~I��B�hfp�>����6S����>�����<����B[�
�u��y:�>���X��A�kCYH{8Y7fJ�G0�@���4���uy�'P��p��N�g�:����"���t�>���O�T�M���3�����N`��	uI8���I:i��uy�'P���B�����H'0MR�"(	���4i��	��c(��8�Lz'�s$c�I��='P���I��=������3i�Bk:�����Xu
�����OZg��<���sCYH��38Y�3�NQ*;2(	���$������(��,��'�s&c�I���(	���$������(����BZp�>2V��r}%!;���r\�7xU���,$=�N����U'I=/�$d�������uy��PNk��������48��Z@I����t�9���������+�[}���L���WP��o�um����(�������&8Y�W��r�������;����
�@�:�B�X>���y#�7N���wP��o'I�gp]��	�|~�YH;38Y�wr~�$��|���;/=�����(y�Yhk��������
(	����n/����(�}�Yd�E��/9�q���eXi��t�{��
�@��
QbQ7��H�o�4HY��H��$��\�7x��l,��� `[������1�t�����O��G���9d�%�X�X�%�1�P��p]��	�0�Bzn�F�o\����4�~��\�7x5�kCYH���������� e��"���)�.o�J^��I,�f}a7��4HY(	i����M}~c�J�8������x�b�AII�����\�7x%�
g!�M�@�������J�D�u/� p]��	��6��������xIz�dPm&��{�����<���7����e�����^�/��ye����\�7x���,$�R@��n�{m�R@IX
c%=�����c��j�8m�2�f����� e%�+���
�@�����_@��n�{����J��4�^������O������]A��n��b����p%�z�:jp]��	�z~�`!=�+h��M�0jkJ��4�A�&,����(yO�,��f�:���f}%�F���u�����(�����*�4��&~�����;i���Q���O���
g!���uv?HA[P�Y���\�7x%�8emVp�����Aj���n�Wv����.�
�@�(�B:�_����n���\��Y_��w�E���u��PI[rRC����������:�m����
��<����BjWp�����A�G�N+�b��t�`��
�	%�
e!����d}e7������n�Wv���z��
�@�k�XD�d}'�+���{�����G��{��
C��i��(�i�d}e7�������$\��w���Vp]��1���o�Bj�Wp�����Q�[#(	��w�Z�\�7x5�kCY8�E}�����Qk�"(	��w�R������\CSAZp�����Q:�\(	��w�\�Wp]��	�:h�������&~�#�JBv�%��\�7x%�i����'�+�����k%!;��YcUOp
�@��7
R2�������Z+5���G����
�@%ym���>�4��&~�.��3(	��w�\�Wp]��	�z~�`!������n�'I��.�$d��I:�\�uy�'P���YHkN�Wv?IW������;Iv`+�.o�J~n8iO'�+����+��JBv��$+�\�7x%�
g!=7�d}e7������$d��I���uy�'P���YH�
8Y_�M�$��^wP����u�����(���,��'�+���$��z���'II����O���g�ti��uv?Is�m�KB��P�\`��
�@�s����FF�o�tP��uIh�J�'����O����,���F0r~���6�%��c(i����O��=��B[����$���Vh(��gi.����O���6�����n�7v?K����i��t�x��
�@�k�YD�E��o�&~��7?(���i�����'P��C���6!�����,���B]<����6p]��	����,���9���'��J�H��,��7p]��	�zF�`��#�7Y��(	#i��$���uy�oB)kCYh���������wK�$L�Y��i���|JX�Bzn2h��M�,�{�J�L�������o�@�{g!=74��&~��J�B��,�[m����(u�`!���uv�H��m%�L��"����uy�'P��pR���f���/�]�m%�B���������(��,���:��_��s%�B���������(���,��f�:��_$C�m%�J��"�^o����(��g!oh��M���4�@I��f��8��
�R��
����f���/�z�AI�{�J�>�uy��PQ���YH����uv�HV��J��4�ErP��uy�'P�s�YH���uv�H���J��4�E:���u�} u)�sCYH�������n�I��;���g�f�Z�\�7x���
QbQ��;��oPE�ZT!����;�.o�J^�B)lwp�����7(Is�Ou����o��T]�<�Rg�
�K����&�
J��]�����������
�@�3��%N�w|�%��n�w|�mP�����O�������f�xmF�wp���0�Q�v�����c(I�����_�7�QN0m�	�$���%������c(m7��;�.�(amh���&������������p��'�;��oP��$P��o���p]��1�4X��������JH0if�gP��o��Z)p]��1����YH3�����&�AI�\@I�I�>J*�\�7x%�i��0�����7(m<T@IXH�>Jz�\�7x�z7XHkN�w|?~s��IP���I�>I��;�.o�J~	p���N�w|����i��B��I:���uy�'P���YH/hp�����7(�K[AI��f}�Z)p]���P��p���f��7(�x�@���f}��I�����(���,��'�;��oP����p#��$���wp~��J^�BZp�n�0T�J��4��t�w��
�@�:�B:Y��������Ik�P����Op]��	��6��t�~�Y?���$	���.	
CI�Xp]��	�z~�`�<��8����'�c]<���\�7�&��6�E�Xl `��M��E�u'um�.o�*�kCYHk3���1��!'���iP�YwR�y���O�T=t���6�n�G����}��H����6����(yO�,��� `���I����KB��P�����|JX�B�o�0����!'���P������\�7x%�i���6;9�qR+uDP���$=7�����"�
c���������+(	#i��d�{�������{R^R�n��D�o��t$P&��{�����
�@��7
R�2h�9������AI�I���������(�}�YHkS@��������G%a!������.o�J^�B��h�9��Z
=����f�K~6�.o�J_�BZ�4�39����O���3i��tq�����d�N�"i,@������(	��{����
�@�k�YHO�
�u���������_�����O����~���o������?���������_���|����/�������/�����O�
�|��O����?���?~����?~���_��L������w������??���w����/���w?|�����|����yC������~���o������������������_���~���n�]?{������??����������k�����������W��gx$�@�%��v����|a�k��gx%
�k��m����������������~���?~������_����=&7��_���~����{������/n���3��d����l��.�3|JX�{,�}����k���c(/���c����KP�N��G/?��E���R��{�����N�z��@%	*�)��1d5E8��E��o�_�m`���B�����=���gA�g��0����IM�?��)��u�����(i��z6�Ce������gx���,\)�������L���'v�#�%����3|JH�{,�;E�T�}}�s�	�����=dwP�65��X�3<��;�������8����|0��Rd��
�F������3<���,�.Rd�v��o�|0��Rd�����y��6���	��Sd?���0E&i���s'Z�4i)�'v1(iS���>?�(9E8�>RD�C`�y�S��th�����M��6�O��r����\��{c�`�y�U
�U7O�&��)�2,C
��Z�6X�Q�e���X���H����ia���4�[�\�����(�g�G��,��Fth))��2���<S�
u�L��HIN����~�I��=�#O0��Z����<�4\�R��9�)�Y�.R$K���G�`%�<�(2�LE�E\�1x��5Xtq������Q�di����yZ�M�,
_�E�@��g�H�	����q����ia
�4\B�1x%�g�G�H#�%`��^D���h����,
�X�E�@�)�Y��"�T��
���d'=�4O�ze�FgKr E���N��7LI���z�i&P���@��ny� �H��"O���j�E���-9��g&z�5(�<���Y���Z/b�M(!E��x�IRGS��3�H�nK������7�Z/b�J��r]LW�6�����H.R6��ybWos��q��"O�����.Nz�O���#�9��v�4O������Z/b�J�E8�.j�2H��F����Ay.�yb���:[�����T�Y�E��2J���<W�)���e���Yp�
k��"O���"�E�"E$	�����J�"_��
4Oym�������"�E)"I���<7�)NJ�4O;y'��v��=���^�����hs��<w�)^J�4O;y/���"���d�g��^�hs��<�)�Z���AF�E������v�wz,��E$��
T�+3�/q��6��iQ��c�_<�R��,�8�+��z*��y��$��8(�NKZ�����(�E�`���F������>P$a�:�#��i K�^4S�_<���a��\��)�	X����HS���#��i KIT�_<�Rk��j��� 	W��\��J���������um�j�m�b�HI-������`PZ��je��R$� Ev%�"�E��$�"@����H���	�y�H��j�P��O���,:I��*�����r5��	k 
*HP����(���,R)��-�<W�Pz�����@��5�%�����(UR�`�H���
T�+v(�AI����C��4(���;
�@�)�Y��"AK0���%��2h����w��4x���N��7LIs����J
J���<a
�
J��N�'P����b�"E�Q5PyZ��7�O���+��k���_���O~�!}3�?4�cL�^����7���/P_]4�O����B�������J���J
`��)A��%�\C�VE
`X�����`E^�����f���O��7�JL��X����D�����P�Kt��t������!��
%��=��n���.
`��lw�%M5TXp�lL�N�Dz�i�S���H��Gj/�6�nd�;�R�����&*;�"����N��7L�IJ�<����lw���+��Yp�)C�"yePEM��t�"Nzk�T�[!���I����Bd"��Rd�S�%�g�G�x)Ef���v'/������D&/u��\��TVS���]�H�Rd������Y@����YR�"k;��"�E')"������MQ���yZ�Ld�R���:EV�vDyX�Yt1�����`��z�"I��V�<�d�9%i��F�"��H�����bb7i�
u�����am�y��Pw�Z��u�lsJH�{,�;E�#��<7"����";h�v6�,R+�/u������S�f1u�"EV`��Q�T�N����F�E��#�)r���
r�0�?�v)��g�
&yD���|��� #O7T�_<��S���#EF'�~k[�	��N���v�nE���k��P�(�g1�]��4I����`����\)E��:���p��3�F)��[�L��5(�NsY���k�oB	)r��{��4��.�u#'
���G�O��
�����(9E8�NRD�����L\��i�y<��6,_��O���Y�E�3�-�<-�*J��0(��t��7���6�&��"��?��)�-�X-�J��h����%i��#H��
%��=��"�>���@IV��@�,mX�>�4�&��"�X�w�H��<-�*IP�ybH'
�s�'
�@��g��."
�3PyZ�!��u��ybH�
rs}8i�J.W9�.�U/i�3PyZ�1����4OL�%%u.�������g�HI+����L��r����i �����R�hC))����o�"�T�<-�JJ�4OL��A�\N<��w���]�I)T�`%���'���^jz��>��(y�,��E�T����@I��4OL����Z��0x����]4�^�����@I���'���� wz���Q&6Xt!L����<-�Jz���ybH�
rw��Y��d1e��xmT
T�`%��v�<1
��������H�m��.n�y��%���@I)r���i ��������(r-BY�>j����F����%��y2x�%�Z/b�*��"�E��_$�.R�	���i*^��y2x	���<�Rw��.v��]d<���H�J�[�@,�E���"����"��?��)"��e�G�`%�"��V\�E�F�"��Y~�P�����(�yZ�	���UXp���"����"�E�#E$eE����IwP|�<<���i����	�*on��}�������D�y���y2x%�p(5�&��"�X�s��AJ�8�u#z�(]�+4O��<�(�h���(ut�`���,Jvx%n`��^$N����)��g�.���i���)����o�"����z�Y�Ci�<�J�S"#�(] +����	��]m��B��+r%��'s(����A������������R�@��w� oX4`��
+Hs����c���;
CI��2�� ���Q��h�b��;(3h���1��i����	�\�r}���G]����9��,A-�y���3
���<��m���G[2-`��J�6�Y@����g�F0����	�*on��B���!�
F���4I�Re��JF�I��N�'Pr�p}��(��y2�����6�<md���i��4x%��EmF���m#O�P��+;e��>��J�4��i����e���E��R�<�Ci���������+���4x�e�e����|�g�	F���4y��=@�t�,�J�5�N��PAP�1@��$1���J��%�yX{�I_�����(����"��"E
f����Ci�4��X{�E-E����	��i��B/��/I�@�93���F	�y�L��������	���6X���&��
T�3s(M��$fW�<g��L����;
�@�)�Y��"YK��� H��f?(��L���g��i���)����o�"���g����Ci��?�~PD�%���w<�R�"
]�E� ����sf�y�j��'�����r�����O9s}|�9���T�3s(���A��4�Y������(���,r)"=o@�93��,}�bN�yb�,y������	����`��cb���=���J����9���i �t�0�N�'P^N����~�qR�
T�3s(���y��yb*�,��g��i�J.W9�>�UI�<���J�$o�h���3k�
����	�z��`��1^��3Py���4K��y��@f�X�w<���#8�>�#��	��<g�P��Op�h��2k�
����	�*on��B��%y�T�3s(��'��4OL���c�����	���r}4�YK0�d�Y;8YA��4�Y�@��;
�@�b�"��"��T�3s(��O�����i ��S1�N�'P�1g��1^�<�f����Ci�
k��@�A�����(y.�Yt1)�G�T�3s(-�%����@Il?�N�oB	)r��{��4]]0�d�Ey.C�<<�
T�1x��H�E)"i��a�F�"E���2��<�4�[����$��~�O�a��Q
f=�\�CiI�����H���;
�@��x
]���{�����J����L3�"#�"	���i�J6��,�0�.R'�����E���.�n��@I��4�&��"�X�k��o�]��
�EJJ_7OO��U�E�@����E�H��\��-����/aP	��:[���(���,r)"��C=�\�C�
JR�-4Oa%�����w<��6�X��iP������%9].4O����w<�R��
��u�&)�u;�C��`h�R$��n�/�����PB��c��)�
�2yb�R��R$��);\����;
�	%��=��"�l)`��J
JJ���2��J7���i�J�E8�>v��R��;���"�y*	�����w<��Sd;���0E��-3yb�R��:�4O�L�+	���i�J~�p}�h���F������
k���Xp�
�w<����Ex��[{#O�PjPR���yZ��S�x]���C�q�S��h���K�Q�C�l`��J
J��6�<m#�������	�<]�,r)"=oyb���6��A�����(�0_���(Y�Y�.RD��-;yb�����h�v2��k���4�&��"�X�w�h���<�C�
J����y:��stZ���13(y�,��E���+Ryb���t{���:�w�tSy��O��K
���LlW��\2A%
�:�#�ud���%���6x%�g�G�)E��sK�"A�#�ub�4���
�;
�@	j�X�l��#����@0�;MRR�����	��a
��X-����2����@0�r��+��4x�Z�4XL]��t{*���	B��d?���+mX����1����h W��ky������f�k����i Gi���N�'P�t������t���������@��T��tSy��O��
h ��rJ�F�.�q��k��@N�~��O��
h �D���1�)B����i���	��L9I
��w<�R��
��u����\39�����A{�4��4�_���(yX�Yt1��$�
T�k�Y�HeO��@N���V��i�JU�5Xt�:���+Py��\N���!�@N���
�;
�@��(g�E':I��+Py�39�����4OL9������d�U�"��"Q����s]���)j)�C�����a�N�oB))����o�"���
T��Jn�L�/�����i 'm��;
Cey�,r��dA�����'���_7�<1
�$)�W��i����,�,��E�H_�[��s��^d������yb�I��N��Pn�S��h���K7H�?Py�;��8mT}���i �6���O���^����^�����s=�"�I��m��@:�5e����&��,�.j'��lC=����q��"�ZXp������@���F��pN�����.�tN������T��e	jPd �$������1(9E8�>RD�n��scRL'
r7���Md ���"��z�f%�g�G�H�0�����I��
�wn.��J�4�]�����6O�E��y�d�������I��
�wn���I��
(;7����*)j��BR��A��;7&�t�,}��s�tI*{�vuc��.�)r���o�"y��Y�<7��tYK�@������Pvn�����"�X�w�H^�p(���I^����������7�]������
]�����7���1)��f��������f���n����r�JY�]��~��U���1���r�wn���K^�Pvn�����{s�E��^�7o��sc�O?I����������Pvn�����"�X�w�8-E����>�$o�����/�6�����wz'�"�E�����
�wnL��%O�
�wn���k�U������e�
]�zm�
�;7���AJ���1�K�MW��sc��^��r}�d��������>��I����9_z�c����w�$w4�E������������')E����/}�v������r�P���d�������K2�
�wn���K�Pvn�����
}�h��'������k#O���1�K/�d7����g���)���Qt��P7���1�g����sc��AS�e���;�@	)r��{�������sc����U�<w�|$��w���3������� ]����sg��A������i �����w���3H��4�;s�re��Ge��x��;�@��m��;��Y�2i��}���h���J��f���sg� �;����g(z��'�����f�@��3��8h)�(�����`��;�����v�`���M�>�����;�$�����4�Q�������w�QU�7Xt�����c*��9�FI�����i �$q�����;�$�g�G�H"��<w����;����2J�v���3�����g���Ei�����J�t�o��;�@FI/�����wF/w�������G�T�;s(�^K�<1
d��t��sg�������.$EQ�C����;�6���;�@F����;w����x�E�������*���wFI�����i �$M�����;�|����KQ�������;�$M����4�Q�����w�$��8��G�Hom����g�.����sg�(]������;�@	)r��{�������sg��Q������4�Q�c�����w�"�E8�>�"�iPy���3j�~���3
d���c���3
r�p]�H�>�����;�6��;�@&I������w&���]��"��<w����)����2iS:���3��$5����r5I_����sg��I������i S���^��w&M(4�;s��%d#X�u������3
d�����y0��$���"��nQ
f=�<�g�E��y���"��<�gJj��`�G�*�Kc=�<�Ci�F0�8(2�L�'���i�JU�7Xt��O�'��)�u#z�,����n��@I���4x��h,�x�dIuv�	���RDz���y2x5J��;
�@����.��y�R��F�"y�^4~Pd��%���w<��w���]D2�y��4;���;�"#�,������	��"�E)"}�����`�YR/4O��<��R���<��S���#E$c�#F�n;K���y�d������;
�@�M/g�E���2�>��F�"Y�:h�yfmJ�;
�@�M/g�E���9d���H������LF�YJ����	���o��B�%)�����9�f�����y���<�N��P�P�(` ��;s��q���o����(�y*3c,mX����	�z��`��X7�@����9�f��������<�������	��"�E)R�-y#O�PZ$)����i!#�"	���i�J��V0d��_��l��B�T��
����<��l�N�'PR6�` ��;�>���b�_������<�6���O����@��w~�RRd���o�"���c��FF�Er�?���(�%��@��w'��v�<����+,�6]TXE���N0��*��g���������T��y:���hx��i�J���4����(3�T5|�'P^����x���y�.��E����@��@�&������(S�[0�:�LY�������!'��u�,��!��O�*��c������[;K)R�w��� ��v�O�a�d)Ej��K�1T�RdZ{k+��4���/�*�)�Y�1�R���`�z��Ci�f�G�5����V��+*�)�YtPm���R�Vy�C��.�c
�5�%ec���O��
g�H�Qz��*��c�IJ��j(��4()Ej��x%�����"E&-Ev�n��HQ�"h����	B�����RRd?���0E�4#�U�/&PZ���	k oP�
�4���/���)�Y�.R�K�]��|	0�����'���A��V�w��(y�,��E����`��J
Jz�e�<a
�AIV�����Tys�E�f�R�0���%mX4OX�iPR����/�*�)BY�>R$Io�F�������A��5�%��j��x%�p�����3yb�R��*�4OXiP�;���|�'PYM�"��"�����'v(�Ai�Z@����g�����|�'P�t���c�Z����<�C�AI����i%#�q�����|�'P�����bt6j�yb�R���q��FF��6���"fJ.W9�.��q����<�C�AI���}`��6��Ev�v��<�,�.�"_~��`��'v(5(-A��o,���u��~0()0�����R�q����7�F'h�2�k�4@/r�J.W9����)���s�^dTd��?[y������z�'Pj�4X��"�M�U2`��^dR��u�d�J�Ej��x�L�n�y�jfT_4������4��T7O`%�"��<��Rd���bLR���@pT
�k��8��Y�X�w��@e9���?����jW�<GG�"�$K����s���c���O�������y+���z�9z��A��gEF����H�1x��E,���L�,�V�u#z�I1��A��)\�@��;_�1�8�)BY�C)2J%P�����$
roh
'\i���;_�1�$�e1��"�,}�X7��$Y���P��a���/�*�)r���o�"R�������^d�d�c�a"#�I�����/�J�q]��&'��3yf����j�S&#��k)R�E�@�)�Y��"�,},`���^d�d�c�S!#�Im���<�R�"
]�E&I�>�`�YV�"R6��y���s����<���"�Es�IU/`�;���l\@��,�R�U�w��c�$�E(���\DR��y.D/2iS�4O���+5���<����8�.��&I?�`��E��
�W�<�l�����;_�1T��"�E�c.��fl`����$���
4OyJJ�qz���N�` �5������]T�N���;h�v�K)���N�');�w�q�L����������cd����"�cP����B����9��� �����_�FF�N��N����	�<��,R)R�`�o�i '�~L���[[��N�����P�S�.��Ni�:��4�	������(��^���k�'P�������[{*�i$	�yNL��$K�	�w<�R���>�i�9��4�,E�
��#��i �d=�N�'P����..l:�
{*��9�:i�:�z�91
���E&��i�J�=N@91�N�~>���G���r5 �;c,e#��4x%e#�@N����V&����_�\
�ybH'
r'��i�J.W9�>�UI�>���J�$K�"h�����p��	�z��`��1���8&����C��N3��'����UN|JH�{,�;E�Q�T�s(�� w��ybH�
r���(9E8�>R�IM/PyN���{)E
h���{���4x%���E5����<'�P���g�!�@zm�;
C�s�������"@�91�R��Ef�2
���"����	�\�r}��Y�D��sb�^R�Mh���K��	�w<��S���#E$��T�s(���b��@z������R��wN�0H#O����Ci��@��4�A��=�N��P��o���k�A��=���J�6�@��T�A&N����1����v�O�a�L�.T�s(
�T���yb*�0I���4x%��8�>TgAS����J����4OL$��	�w<���"�Es� ]�uy2�� u4n��'�'PQ���"O��i��#E�/I�q�F�"A:�uc�<<��T�1x���6Xtq�����;X7�����"����3J����O���"��?�v)%27�#O�J� mX����3�J��C��(�����c�8)����1��8f	jPd��+r�w<�R�#,�0���+�����D�3���y2x%yf9��i�J=�k���/J�
&�nD/%��u�d�J�F��i����3��w1:��9�nD/�+r.��),��;
�w<�*r�'����tE��z���CiZ���)��g�.�9��i�J��p]�E��
�R=�t��4Jz�@����3Jz�;
�@��g��."�E\#O�P������LF�Q��8��i�J�E8�>vm�Z���9�F�;�������g�������	�<]�,����"m�3y2��$��q3h�f2�L����4x%OW9�.��I���`��J�6]�A�4��g��������PJ�l'����6]]���9�&I���<-d����*��4x%�g�G�H���
F���4I���
����<�t���N�'P�u��.��'m����'s(M�tu���Yp�
�w<�����E��$}���`��J���\���iYp�
�w<�
r�P�����;y2��$}���y�w\i���O���"��?��)"m�y2���
r�<d���R�{��i�M(!E��x��I
f�����4Id~X{�%/A����(5E,�H���<=s(M�+����g�$)�=��4x���,�P�%����g�Ir�S=��L��Y���O�T�Y�E��T�����g�I���w���3
d���O���,�H�,i�=Pyz�P�%2�E4�Y�������	�$��v�O�a�H��<=s(���F�_�@f����w<�R��
]LW�t����g�Y���h��2Kwz=��4x���g���eI+����3����wZ��@f'�����(Uu�`���,Ku�<=s(����'�<1
d�f��w<�R%E
����7�����4K7�}��@fi�����(=E��
SD:��@���Ci�f�>���i s�6,��i�Jnz9�>�^�S��<=s(����/�yb���
����O���*g��t5k�@�i&P��5���i �6�����R���N� �<=s(-���/�yb�"��=��4x%�"�E�H����<=s(-�����yb��
���()�@���(%����~�l��#�
�'��,����N�'P����b_$y�*O�J�$o�h���H�f�;
�@�)�Y��"�����g�E�7�4OLY$y������|FCY�.�h��t����3���M��<1
d	R-�;
�@�s����H��0�d�ErtC�<<��>-���c��Am�QS�����"
+�p�`��g��t�w<�J��m'��[�[��Y�<s(-��jWEF��H)�;
�@��
]�GI-�z��Ci���&L@���AI���;
�@��g�������R�y�nII\�<<��v��i�J�E8��E�H'���`�f�"�	}�u�d�J�����(9E8�>R$j)��uK$E��"aP;	�t�+�N�'PNN����~��NzC�G�:��@I�q�aXHp��	�w<�RGg
c)"�[�y�Pz��K!��)f�Q:�����	�z��`�{H�Qr)
)�u�I�H�x!��)\�/�N�'P������E3J�x!��'t(}��v���<��J}��4x%�q�����-9��'t(}��6���|��J��4x%�q���)E
yB��(-E@�TV\)E���(����(]��6���:��@I������<GI����7������SDz�0���%��:�j!#�Q����i�JN����\��
F������y�
����<Gm��;
�@�.E
����YyB�R���H6�<md�9J_$�����PB��c��)"}�6l`�	J_��Nt��FF���;��O�&9E��
SD��B���:��@I����ig#OM��;
BM�<a,���R����	F���L����y:��"@/r��c��e1v1�����T���L�����g"�JT�_|�|��e��)�<o�<�@&��$�z�G�N��O�F��i�JN����,�"Py��L&�)N��32
�$	#��4x��E,���L��S*�8�	���9{�I.E�w<��Sd;���0E��O�<�#�I��G�(�����"um�J�5Xt1:����T��,E����#��4���R���(9E8�>RD����3z6A�R���y�L9%)E���(u��`��tu�����36A�f�1���i 'i����(u��`��tu�N3"Py�H.'���1���i �"�=����	��"��?��)R�aPy�D.���h���
�.�;
�@�)�Yt�"Nr�@�39�t�gV��ybH'
�#��4x%�9�>�n�R�<c&�N���'��t��>�N��P��"���G�H�	"Py�B.�$��3h���Ib��;
�@����.��N���g�������h���i3c��i�JO����~����<�Bn�8I�<1
����w<�
�^��]�E�$K�@�Wr��i��4OL��A.��4x�
r�2��>�(!i�b��$K�h���I���;
C%�\�,R��6�*������;h���i�\��i�J��R}LW����3�D/�$��x���i ��������1T���(���1�+�����A�"�H���'������	�w<����8�.����9NC=�L��x�_$
+�"#O/}�5�N�'P�yD�E�^���1�u#z/}s!�u�d��HP�^��1�<]�,���z�#�i�`��^�KaMS�<��T�1x%��p}��xi������E�4]M�n��@I�4��i�J��,���^K����xIs���v\)E����,��~�O�a�H�����gb�^�&�(2��Az��N�'P�M�E�#E��.�#��J�4�N4O��<�4]M����	���p}�"��JS`��^�KS:�VP��<�4�K����	�T�	��Y�
���
K�Z5P3������	�w<�RGg
}����jJX7����C��yJd���*��4x%��g���4`]���6]��y�d�F��	�;
�@��U����j�R#O�P$G�T@�T��3L�;
�w<��S���#E$Ai����9���!��y���3HaM����	�<]�,�����9-`��J�����<-�Wj3���c(}�JY�1]
�tu#O�P���������+�����(��,��D�6]]���9�m����i%#� �d��4x���N���LiK����9�m����p##��w��4x%�g�G�D)Ev0�d�A���y���3H��	�w<�R]�,�p)
�8`��J�����<d�$���;
�	%��=��"��C*��J�d���z���2H��;
�@�#��>F���r*��J�4�����;-J��;
�@99E���R$J��<3s(���8�;�"��()r3��4x��h,�x�D��!�gf�Qrt����;-J~�w<�R�Z5Xtq�*J���<3s(���Cv��33
d�>�����c(y�Y�1���>�gf�Q�g_�<3�@Fi����(u��`��t5J�T��9�F/=��n�2�@Fi�����(U��`��01F��*��J�4]�4OL%�j����RRd;���0E��e�����4J#�A��T�1I)�;
�@�/����4��@���Ci�F�9���i ��9��;
�@��g��."�,d�����4�E�A��T�QR�f��i�J=�i����&J��<3s(M�_n.�yb�$i�3��4x%�9�.�I�g�����4i��4OL����e��i�J�E8�.v�$i�3Pyf�P�$G�<���i �6����R���N��!�gf�Iy.�yb��
���(�������&I��<3s(M��C^A��4�I�N�'P�
g��M�2Pyf�P�$�q�@��4�IR�f��i�JN����4��<3s(MAJ�4OL���1��4x%�q]�%m*T��9�&I&�w�<1
d�d��w<��w���]D���gf�I���yb���]�w<��w���]D2�(y2��$�~��n��@e	���<�*j�p�����et`��^$/A����()E���C�<�6)���~���T�LX7���7��T7OO��U�E�@�'�
]��fi*^�
���d��L�"#�,Y��@���)����o�"����z�i&P���VEF�Y���i�J�}=,������<`}d�4�(��`��g����z�'P������n������E�$p+�n��@IE8��4x%?��E����G�n3K�EA���3Ks��;
�@����.FgYV����dmX�@���3K����4x%�"�E��6�H���0���
+h�y����O��]���b)��"��'s(-��"��)��g�Zy��i�JN����.H�F����H�,*��%��	���<��?Y�Y����"}���`��J�$p+3h���WJ��i���)BY�>RD�C�`��J�t��,�y�\����O��<g���H�/y2������BF�E�>\���c� �"�E�c	R��`��J������i-,�Z��z��PQnz)��E�[����
�<�Ci�Tge��FF�ER���i�JN����Tge#O�PZ$s����i'#�"�T.����	���r}4���r��'s(-���r��� #��	����(������H��F����h��4Oy���tu��O��
g����~���Y��g�PjPY��|����O�����	��"
}������<g�PjPR���*$���"um�JN����>Y4���J
*IP��s�������w<�R�
c)��3��<g�PjPQ��G�3�@T������1�|�����N�?~��`���J
JJ_�<g��4()E���c� �"�E�c	Z�l`�I�����6�(�"����	���p}�"�tu*�;��T��<a
�
*K�O��i�J��4X�.RD&�@�96A�Fgs��@��L�T��N�'PrG�Yt��L�>k*�;����	4OXy����f��i�J��r���7(������
�@	�O�����Z��;-�J5�n�S�"�^�E��s��%�[�S&#�I�h���c����~�O�a�-�`��JoP����������$�����(����"u�"IJ����C�
J:��g�<�d�9I^�3��4x�Z�6X�.R�H/���grp���4Oy:�>��;
�@�����C�8��*�;��T���yZ���I�1f��i�J~�p]�h���yb�R��j�
��+y:�>��;
�@�)r���o�"R[T��F�"N��1o�y����I�)3��4x�z�7X�.RD�����s��^�i������<��3�N�'Pr��YtQ�:mXT�������4Oy:�px��O��3���3'�.�D/�B������1�t���N�'P�Io�E'�N:�]����8����X7OO��U�EC%U/�Y�.�"Ny.����E�4�\�@m,�R��N��Py�Sd;���0E���2�#�e"z'�<�iP3�����O��3��.�h�d������E\�������C(?h�j���(��,��E�4_��F�"^�G���y2x%��Y���7������SD�G���Q�xi*���y2x%�"����1�$�e1��"�T|	;X7���T|��y
;��a�N�'PEN����~����K�G�K$z/M����HF�^�/����	�\�r]��^��/�y.��E�4_h�yzif��N�'P�1^�E�#E��v#�D�"^���d�<e2���!��;
�@��x
]�ym*^��3�����4O��<}�R�w<��w���]$j)F���E��.���y*d���A.��4x���q�O�a�H�R�F�3��xm�;��i&#O�
r���(U�`���g��_��s!z/�d�4OyJFV��4x%�g�G�hS��<�����a��yZ��3H6��i�J�s]�����e#���E� e������J}��4x%&���HI���`���H��;h�v2����w<���^����7H�R�F�;���]j�A����g�.H/����	��Sd;���0E���F���RD�E�<d���1��4x%�q]�i*�"�'s(
�T|����4�A���
�;
CUu�Y�.TgA�DW��\�Ci(R6���se� �i+��4x��5Xtq���p*��9�F�yZ�z��2
d5Vum�J5ki����%J���<W�PG�2^���;-J�PW��i�JO����~��,�V��\�Ci�����je�U�"+��4x���g����|�g�Y�<W�P���~P�W*W���c(/������\��5�
T�+s(�A��C�<�L�����O��3��.�h�tas*��9�F�3k���;��q������w����t��w�2S����Vq>�<)��h*bxr�RP�����7(*�=T1�tV��f.��%�dM������3����x���U_����Z�����,M4UO�Yz�����7(�]�U��]EQ��py�.�� k�����<��	�"�s�
���b�a��py�.��0�����y ���"�s�
���y�b�s4������������UO�Y�5e��oP���PE��E��!\��K(��Cnbxr����w��9�E�"UL����u�py�.�������������"�s�
�����O�E��h.��%�Vd)�w1<9dEgCw��9��[�W1G� K�.\��K(����bxr��X����:n_�-��*"\��K(�L�?���<�%&�"�s�
����)���Q����JkA-r���y +�E~��VW}S�����py�.�����%�'���H�?D~��^E|s�"���y�<�PZ����u
��<kC-"�;��y��Z�_��<���y����<���	��<+
�;D~��?�@��V�_���P�}3~���#����7(�L��/Q�E-E�����^�4?y�(����4�]=�}xx�B��C�w�#
��oU�u����Gz��f�"
���><
�A�n���Q���"��"(�H��o�/��)�#]u����i"�s�
��9>��o�zj���y����l�G�S6�gKh���oPT]}�b
u�!u�(w��p	�-�������!{�!�;�������)��
��GM���HCqxG�S5�gC�P9D~��n_�-����-����E�3������1uU�w�AQu���)�����&$O�P�����bxjF�l��{����7(��U��A�����%���V�.��n$������9��(�"�U��-�����K(m�s|�bxZ���_�E�~��7(���UL���/�"��<]BiG��961<mF���{4���x�B��]�.��/����Q����i7�gg����x����W1�}��	��%�v��pbx�����f,�;��"n�����b� #�q��%�v������a$��l����x�����b�U��SH�.��'�9��t��3!W�w�A���W1�D��T}	��%�v�]����e$��l����x��-����E
������J;��8_w��t����S�w�FUj�U�)�I��py�.��#!�\����<�}�����Q�k���9����T}
���J{C�HX�=��M���oP����O�E��.��%����(�L�dx:E~����}�b�h���yWO��<uB�@�U$n%=��Z�>_�F��}�*f����^L��<uB�@�������=�?������oPT:{�"N�"(��.�S'������tj�@�����x��{_E��EP4�)\��N((��)bx���B-"�;^�p4��b�h���@K�py�:�t���U���=���i"�s�
�"��9V���S�<O�P��B_�>���r���%�;�������2E� {�)\��N(�A!U�lbx���B���x�����*�-�Tq��<uB�@�
B���@���f,�;������*�-���O��<uB�@�k���@�������oPh��S�w���_�9�k�Sqnbx���B;,��9�������sL4�+~
���J
-X��6'y"'�)�;�Z��*��E��|
���J
-���v#y./�"���Q^El������py�:�t���������E��9��;[E�������py�:�t��������E;c��9���E|q�UE*���y����B�%���r-X"�s�
���>��o�Z�����	�?(&�_b<���� ����Q�"��<�*�����.y^/�Y���zm���e-r���#�����?o��\K���E��_�}xx�*u���A�����9��J�"W�����RQ����4��ZD�w�A��UL�"h�/q��_dA��W�OoP��~��D�����n���!����,�I}�K���� '�%�;�EZ������"(R�Jw��J�/��{�]�����{����D����?n��>4x�*���Z=�����<��%�;�Z��*��E�$�$�����������<��/��9��W_�����Uq��_$ [�U��T��P��%�;���*���c��ENq��#& U�jbx�F���}����7(���*�XEP�������_$0U����m���m���x���M��"O��7 [������_$0����7wq�3M�w�F�"��2G��
^��<������V1<��]\�""�s�5
���*���BEO�MH������V�MO[p=�D~���}S������<7�	��|�bx���������Q8��W���h��������H`��.���I�(_���oP���CS��L?��y�Hd��!���H��i�"�s�
���b�YP��B�<�_$"'�u���4�gDN�K�w�A�g�%�sk�(�������(����t�32�X�w�A�c�U�9���%$���E"qR��n���s�4e�������7(�"OU��"���)��Q"Q��ky	�{�����-����9?��/�Q�.�v�o�QbF��r�{j�HP���7��2m_�������~���Z�#�*P��F4���=�-V���E|S���-�w���Z�b���2�����7^��B[�VQ�xG+�{��<����2�;�y cE;�{~���-�[�"
�!�.��6(�`�E��26�`��;�x��-r}���l�$�]���Q�!���2v�"���7��:m_�zVz�U���|_`�Z�*R���<�iA�{~�oP�E|s�H@{����}�
�E���2�6��;��Gh�������E��<]Bi�h�nbxr�Q���;�x�J����"Ma�������B�t	�)�U����y SB-r��|�5��G<T1GxDb:d��K(ML��bxr���^�����~��*�x��]]���JSA��*�'��LL:��w���(�"�U��-���MH�.�41�l���@��Z������Q�E~���[���.$O�P�j�]O��z���;�x��-����E:z�B�t	�����!�'���L�9�_���h��*���/��}��%���<O1<9d^P���/r�
-��]~��(��g���������sy���)�����C��� ��;s�-�/�-������@ff���_�2cG�X�U���I�B[^B�t	���������TC��_d�5�~���9����?����q��_$#C������7��Pw���5<T��h��.�%����d$�.a(#yf�m���/2��[������"H�^�]�\\BiFB�N�2�g.����o�AQ{�CS��sAKr�K��K(�uc��H���n��w���������"���=]�9$���s1������������5<T1� �����(�������|���������kT�-b��#<"w�"�%����d$�/EO�I�=����o�A�w4UL�����K9�}3~��B{�"��b$��B�x��|�
�����O�E��\����J���*��j$�����w����&A��Y��������-XMO�H��8Y���o�A���W���o�����%���d�b<�F�,�����;��Gh�����a/NV!y��������i5�ga����o�A��U��"	-���<]BiA�e��z����{~���"-r~��_l��lB�t	����������d�`��;��Gh�����A�.$O�PZP�����i7�gAf������?�@��V�_�{qr��%����C����<{qr������[�W1G��'��<]BiA'�SO��<{�p
����Q�E~���[�~,��<]BiA��%���I�-X���\n������O�E:zj_B�t	���8���t����
A�w�A��UL�"����\Bi}5�:�<�*:$D~��}�<T1���.]��S;�����f�e(�L���D����-�[�"�mF.��J+��C�K��y +�����x���$|s����py�PZQ.L�w�38dE�)A�w�A���Cs�E�*��3����T���2.���^D�w�A%�"�?��!�4��pw�gp	�	�!�e<������x�����b�U�7��.��"!7d1<9d��E�����h|sL4H���\BiEBn(bxr���A�w�A�U�W1�*��� \��%�V���*�'���H]
"�s�
�f�?T1E|E��A�<�K(��������P�����7(�"��)Z��X���%�6&�61<9d[P�����7(�"�?��A!;A�<�K(m������-hx���Q\]�U���6���3�����g���@�<���rr�5�����9����i��3������MO��P�x��oP���PE��E��,\��%�6���bxr��4c��9�E���P�_�lL.��JS�1<9dc�����Gi�����b��`� \��%�6&�bxr����A�w�Aa��W1�t��W<�gp	��	�����1�L�w�A�U�W1�*���A�<�K(m��.1<9dg�3��9��(�"�U��-��._B�t	��"�u�^���,����7(v/Q�qSt��p��x�u�:��".��<;����x�Z�}�>��/�7t�>.w�3��������r
��<P�&E~��k�c��Q�w=��/�9�����&.f7#�.����7(��<TQ��o(�!�"��i�P�C���i�5
�0�"�s�
�i�*���Fg�c���m�E
j�t���P�����7(���/QUs�j��N����u1���q�5�����Q�Uu��r{D��l�h��3��b�a>L�H��"�s�
�E|s�E���c�K�Q'��t�61<��eP	��~��7(�"��)ZdA_#����v�AV�X�xX���(�3����7(�g�*�-����&$O�P:Ph�mbxj�\\&V����7(�����4E� +X�B��	���.�������U��9�E��<T�h&2u!y����B��*��~���,��9���_�c���r��N((�L[�x��sAF�(�;�Z��*��EP�f����J��71<mF�\��(����7(��U��A����S'�j�]O��<t�7����7(<��*��h���x�S'�j�CO��<t�7����7(�]�U��]m�E���J
mWO1<���H���Q�L��b�3����&�SH����,����N#yt�7����7(���*�XE:�/!y^���{���2�g@��(�;��p��*�h��<h�ry^�/�A���K��e�iJ���x��~��*���d(M���^FAH�L�]�L�� �D~��z��b�
H�L������ZE�]�L���Wv���x�����b�U$�9�}3
BH�E�K��3-����oPx�U�����.�����QBf-r��@��&��9��(�"�U��-���I�<S2
B@���V�2.�PY�����7(��>T1�������3%�  u5������3������^E|s�"
m���3e�  u51<9d@�j����-�[�"�s���3��2t�`U1<9d@��$�;��x�\���Z$"�:	�g���e|��q���@Fd�M"�s�
?h|S<h"JH����yqQ2@jbxr���\��9��}3$&����gj��eD6�����<�1���/'����(<����z��@7�6�J��4�bxr�������x�����b
�����S�<�j^\�������2"�e����-�[�"L�.���'�	����2"�l��oPx��U�1����$��L�9q������y #��&��9��'_�ME����s�$2u����@F������7(�"��9ZyW�py���E"�M:���<��	�"�s�
���b�A��$\��4~��������@&&����7(�"��)Z����SH����$������2���,�;���v�W1�v5�����K��e�"ia-r��<
!�"�s�
���Cs�RW�r�<�b�")�YV�2�g
��~���(�=_E�BIH��!��f�")&��OoP��~��7(���*�XEP�e�A�7�IH���><
�A���E^�2=����S��K(�4�K�7�I(�0�E����*j��9��p�\��[���.yf�P��X��)PF�L���E~��}��P��_�g�|�<�K(�H��YO�H���Z��x��-����E2SJ���E2������<3��E~��
�|�b�P���Y�Fq��#&��������3�c�Y�w�A����*�H����mn/q��_$�������3#kJ����-�[�"�enB�t	�YSr�S3�gF��,�;�EZ������"�|���<]BiF_��]O�H�}I"����7(jL|�b
cbF6�*$O�P�������i5�g��A#�;�������B]��|�7!y������MO��<3:��E~��kT��hl}�w4��
�.$O�P��@�.��}q����x�*/�"�����^������%��gbx�Owq�K�w�A���b�MAG�!$O�PZ�A8��t�����f��9�E�#��"<�0=���K(-L�:��t6wq�*"�;^��_�V1�_�D������J��\bx�����ED~��~��*�x��/I��t	����u�<��@����9�E[���9Zm,��Y\BiA����%��<�%����oPT�����"
]�S�7� �Q��(�LC��("�s�
-X�Y\~g)������_����p����iH�-"�s�
���(s�7�G \��%�dp+q(��,H�-"�s�
���{�b��xe���,.�� U�gzG9dA�q��oPTy�b]�<�py�PZ�����T��"������7(�"��)Z������,.�����U���<���,��9����>��/���+��Y\Bi]X����y +�[��9���3��,.��_�F{��'�+��s�b<t����E�w�A����;k���`s,X([�41<9dE|���Q�8c���;k���KS���S�����y +��s��oPX��UL!�������Y\Bi�hxZ���<�5�g���x��-����E����gq	�y��*�'�����[D~��T�-r|��_l���gq	�}$�lbxr��B����x�B�4��,.��b'���c�BN�����y +
�+"�s�
=����������/�VG�!�C���(������7(��WQ��o��@�<�K(mL?�x�<�
9����x�bP�.��_�F��04�	�r���y �@u��oP�E�����Q�E�����_ldK/����!�v��oP����s���.�]��.��![z}�e$���*�;���*�P��xC�N�K���E��r��P7����7(:�>T1�$��+���o�/��W�k���oP��~��7(�"��IZ���y��f�"
������<��"�s�
���>��/��J{�w�����VX��e$���U�w�A��U��"=��]��.��U���H�
	�U�w�A����b��*��k.��GLCN���������������7(�R�P�)E
�~��}3����*R��T�����[E~��^E|S�"I����}3~��B?j�S5�gGBn��oP�P�P����������HGRu�bx����h.�;^���[������"L�nB�t	����&������Z��x���Elq�A�����J;SW��zu����x���c_����>�^W!y����>SW1<��]\�""�s�5
��W1���;�7�MH�.��������i[��E-"�;^�
^Ele�U�����<]Big*�.���H�9r���x��-r~��_l������%�v������i7�gG9U�w�A���W1�����CH�.��3u������E��9����}s�7w&U�B�t	��	���N'y2!W�w�Aa3��b3@�����KH�:�t���u������@!��~�+9=��PE��E��|	����E���^B��.sqQNE����"-�K�"H�n���tB�
%q��%P��o���D~��m��*�h�9n���tB�
E�e(�LCA�M�w�A��U��"��������
�n��{����&�;��p��*�h������������x�<��@j��9��[�W1G� ��	�g�	�?(�]m�.y6��(�""�s�
���b�A�x.��JP(<���@���"!�����7��[������"�s����e�  �q�bx���B-"�;��p��*�h��ZD�<�N(�A!!�1<i�@����x��_���E^x5��l:�t��tV���=��V��9��W_E��E�*"\�M'��������}G5#y.L�����-�[�"(/�	�g�	����.��f$��-����Gi�����b��c�M�<�N((�`u1<u#y.�[]M�w�AQK�C�-��P�py����\Pj[����s)������7(�]�U��]E��j���V��ra��&���H�
�l"�s�
oW}slW�W��py6�P��b��.���H��ED~��n_�-�t��l:���Q�bx:���(/�;���v�W1�v5 +X.�v�H@V�v���0�g`����x��-r|��_l� �g;�_$0��)�'����$�;��hx�Ci�Am�py���E�E.1<9d`���9���3_��Y@_i�/!y^�/PF]�����(��t��9�E4U���A_i��"��������><
�F�O�t��9��(�"�U��-RX�����H@bE/�2�g���~��D�9?��/�+z�K�=�Hh�E�2�g@�|����-�[�"� =�%��_$�/���
��<��t��9�E���*�-���R���E":���}xx�B�p��9�E��<T1�;�������o�/��� �}xx�
u���A�����)����%9_��5�"�����<#Jp�"�s�
*��>��/���z�K���HD�Y/bx*F���R�E~��^E|s�"�hc�w��W���"UO�H�����x��-����EPF]oB���/QF]obxjF���(�E~�����*���2�����H,%��n$�������x����b
>����
���HD�����i5�gDYg]�w�A��U��"����<W���
�W1<�F��L��oPn�����b��#r}��f�"}�obx�����������7(���*�XE�!w!y��/�PfV�����3V��/2��.b��S�"�
���<w�Il�=��t�3��W�w�A�U�W1�*�>{�O!y�/�PtP?��t�3e��I�w�F���i��bk��`u
kJb��%���t�n��oPX�U�9��#����J��\bx�����5e��oP�E|s�2�������������]��3�'��������E~���[$#�*\��K(�/����%��y 3�V��9��P]�W�L��d��X��su	�E*��.y���������n_�-�%��������"��x�<W���(px��oP���P������py�.�4#	fM/�2���%�;��*n�����f����py�.�4�����(���H�YE~��n_�-���V��\]BiFG��,�'���((z��oP����"O�"����py�.�4�������y 3:@�����7(<��*�zj��\]Bi.�E���2�@�U�w�AQc�CS3�6�*\��K(�L�kbxr����rr�%��^�E�~�{-R�t&\��K(-�w�61<9dA��V��9���^_�CoAy>�py�.���������y S�D~��=��PE��E�A�<W�PZ��UO�Y��h��oPx��UL1����
���JS�61<9d�H��oPx�U����������������]O�YP��*�;������)��K��������Y����y :j�����7(,��*���
:j�
���JJ�Z1<9da����x�����b
��0�L�<W�PZ�tv����<��D~��n_�-�\��py�.����V�%�'��,���*�;���_�W1�_���V�KH�.���t��u���:B��"/Q����:��Z����Nq��_�"uu[^u��[��x�j�E�~��-���m�K��K(�k�C���YQ �&�;��p��*&i�$����������ma(#yV��l"�s�Q�E~���[�|���}3~���)[�OoP��E~��kNo�U���\���� ����TA����4��"h6��9�E��>T1������-]���HE4[^�H�E�l"�s�
*��>��/�����]��\BiE������wwq��F�w�Fa]�W1�.RQ��V����JkG-R��T����E�~�����uWE�CiL�E�7�i���V��T���
��~�������b��E�.����J�E��Ztm{D~��5&>T1�1���[��K(m((z�bx�F�l((z���Q�Elq��H��E���J��m]O�p=hD~��kT�[E��A��`�*$O�P������i]��E��9��x_�|c��&$O�P��)�m��f$���\��9��(�"�U��-���]H�.���`�bx����
z�����7(�"��9Z�m��<]Bi��E1<F�l=�D~��=$�P��$S�!y�������SO��<���D~��^E|s�"
��)$O�P�:k1<�N�d7��9��[�W1G����%$O�P���{���2�gg7��9�EI<T1�!��,|�ry����>�������<��E~���=T1������py�.��#����%��y ;��w��9��[�W1G� U|.��%�v����.y����f�����7(��y�b�
R�w���]Bi��E.�r�4��1��*�9>��/�R�w������'�e<�i����x�����*�0&��6v�������T�=u�����K�w�F���WQ�x��zj���J;R��|�v������.�;^�*n[E��E��]�<w�P���z/bxr�^Q�������F���6��#U|.��%�v��W1<9dG��.�;��:n�����f���7���]BiG'��*�'���H��E~��?�@��V�_��2�.\��N(���^h�����=�?(&�����7(��UL��4����J
�H���@ZE~��kT�C��"�)Z$�.�]'�j�UO�9P�ED~��k�7�*��HD�U���uB�@�n����=���"�s�5
��}3�������b
�S'�k1<i�@�K�w�#
��oU�y��%Y�<w�P��B��}���@k��y��7(jL|��N�"L�.�]'���PN�~��I{ 
����x��-����E�T-\��N(��,(~?���=��ZD�w�A�(<�����AE���,N��Y������@j��9���Dc�HSL4�C
���JP(�{����=�E����9������ x���������"��C�[�F����r���n9P��c;n�/��FA���Y]���������(�����y9y�$��a�����p-^�:�����sl{���C�w�lP�E�"���zD���["�q�*����i\`�
/������7(���STUu��r�H/�2�`�/'�����d@�H�������8��C�w�����#e��>vv�t���(�
��w����k����b��F.��������LH������o%��f��,yh�2�}C��"��b��^�"�r�
�z���S�7�Y��q���"�������A0V��M1�E��U�)Z�)?����)�E�����"�r�5��M��x
B���kS�O�[]G�S3�g@���H�x�����"�q���������"�Q����A0���C�[�A����b��Hd��*$�~�A��*����}���oPX��UL��Gt���� �7EdB�&�������"�r�
oW}SlW�^:v!yn�/�P�����i7�`B!��H�x��!���e
�)-�E���7Eb"�.���H�	�U�n9��y���[E+�u�I(#�8�xx�31�H�x���U_����|>��<O��IL�:��t�3���C�[�A��jULqV-�����i�"��`.1<]F�Ll���oPx�U��������y\�k��Pw��t����S�[�#������nBp
���2
BB��r�<O���hN;E���?�@��V��H~�9�}3
B~���<�2��N�n9��W_��H^P������"a(�L����}�x�B�4�<����E�n�l�nD��x�<O�����)�-^��2_��2����yF� ���.y������N�n9�E��*��3�����y&� d����><����QF�)�-���k��*�x��Q
�)\�g6
B�h)bxr.���t�H�x��-r~��_l�<���,��eFB�Y���<���"�r�Q�E~���[I��py�������xV1<9dFB�)�-�Z��*��E���.�������M������q�S�[�#
��oU�u�0�Z�<O���;ZE���2w����/Q�����2��Z^�E����;�@����� �)�-^����W1������S�<O��Y�"bxr���\�n9��*b�s�"�k�py�.��4�lbxr���U�n9���U[��jA�\�py�.��0uu���@\{�t���(|@�W1����kO��<]~gA�c�!�'��,L���oP��&<��K�,	K0��M!�&��bxr���}�"�r�
u��@�.����,��"��MO�Y�f,�-����Sx O�n�/��������-���KO�Y�/�-^����|u��%\/!y�����w�����TC��_d�5���U�9Z��Y��o�/R��-��i�
�"��/2�E��U���D��+,���HA_���}xx�B���x���UL�Q�-�
��o�/R�-��/�2�gE��H�x���E�~�{-R_hI�w��r���j^�(#yV��_"�s�
?h|S<hj@�-�%���w�����*PF��(T���oP�u�P���Q��,����T��_�><
�A���H(x��I�U�9ZmWK���EjB-R��T��Y�����7(�]�UL�]����K�7��� W�S1�gEv�K�w�AE�"�?��azV�K��K(�m����<+��^"�s�
���b�azV��K(��Pz51<5#y6t|����Q��U,S�������bv!y����&�.��^��E;,��9��]g��9\g
���UH�.����w����E�4��9���^_�CocC�&$O�P�����MO��<���%�;���D���s�Z�7!y����X���i3�gcC���x��-r|��_l?y�B�t	�
Y��]O��<�\�%�;�����W1�����CH�.��!�u���0�gc���x���"_����D�SH�.��1	������E�U��9��W_���.!y�����.�KO��<���D~��n_�$-��"��<]Bi#���z���2�g#���m���o��
���UL��K����=��X�����)P���_�E���o�A�����)&�N,E?����K(��,���ne�i}A�x��|�
*��UL�:��{��<�������<���j���~o��*��UL��U���.��6��P��r�N4���������"��)��NT����<���P��pG9d���v��|�5��~�b�c�=����������i���]\�L��w���y���[$����������iYO��3j�{~��Q������"�"w���ZE����4���;�x���Elu��hcwwy�/�A�U����y {E��=����������9����V����}�
�"MO�Y�y��������?�@��V�����g����N(�A1=���I{ 
u�=���7(���*�-���B��	�?(&�t1<i�@���=���7�F[�W��h��Zd��N(�AE���bx���B�{~�oPx�U���0�i��N(�A1	f���@z���;�x�����b�U��L��<uB��I0���r��3��������*���f������JP��!�'��(�"����3�����O�E��t�S'���*k1<i�@�7O���n������S�HE�SH�:�t�������@����s
���=�@��V�_�HCK�%$O�P:Ph�����=����~��������G3�dI^^B��	�U�><
�Au���E^��}Gc�x�����B2�����}�/��u���B��"�Qn[�2G�,�Eq��i����%P��������;�x�j�E�~��-�\�K�K��N((�"a(#y.H�_���o�Au�"��>E� ������J
m{b(#y.u�=���7(*�?TQ�h��NI������t����������n_�-��%/����E�����4����x���CS���|��f�"KA��"��l$���g�=���7��[������"-��.y.%�AV�S1����������n_�-R����%������K�S5���X���"oP�4�Cq�ihInB���/�4�`51<5'yv�L��w��E��*��&�w!y6�YP�����������{~�oPX�UL��&�w!yv�	/4f�bx�F�(�`��w���[������"Z�W!y��/�`�bxZ�����|�
���)�P�lB���_$�"��6#y&���;��Gh�����a�.$���EBD�]O��<r�/���7���*���cA����n�"!�U���a$���C�E��P�E|s�HB-r
��0~���;�SO��<CF��)�"gp(���U���A1�)$���Er�/��N#y��_.�9��Q2n�����b� �r	��2~��B�KO��<r�����\n����*�h����^NA@����=��>����7(�����)������3����l�a�K��y J"�s�
���y�b�w4���v.��8��!�%��<���B��|=�E��<T1�9��T� \�!!"U<����2"�v����-�[�"H���Q"r��x	��..Z�D~��T�-r|��_l�����Q"��	i(���H�"�s�
�JgUL!�E$����(9�C���@F$���9��(�"�U��-�����(9�C���@��,��9�Eu��*��EbBK�py�b^\���*�'����D~��?�@��V�_�Hf-r��f^\F��MO�Q�p��oP�E�~��-�"��py�P�>41<9dD� �;���.���CA� \��%�F��]O��/�;���*���ca�py�PQMX���<���UD�w�A��U��"L�.��JcG-����y �E~��VW}S�����d��.�4������y ��	"�s�Q�E�~��-��A�<�K(MZ�v1<9db���x����b
>!|.��Jr��CO���g����x�����*�-��U��.�41����@&&�����7(���U���Ih.��Jr��KO���f,�;�Z��*��E�*��3������u���
B��"����E~���[9������ERa-r	��<r�G��9��[������"����]BiB���e$�TY���"oP�E|s�HE-��o�k�L��i�5
	�Q�w�AQ{�CS�����1��f�"		�1�����(���"�s�
�
�UL!�'��"����$����><
�De��E~��n_�-��>�S�7��H��%PF���c�Q�w�#�����O�E�*�]��.�4/�E������j��9���"��)�"��r�<�K(�������<32mG��9�E��>T1������k���E2R�c�S�����I�w�F%��_E��c#��c��K(��������wqQ��������W[E�ca�x��K(�������..z�����7��[������"����<]BiF�������3���(�;���k��*�-���UH�.�4#[z\����33^�w�Aa�W1����	��%�f&�obx�����/�;���t���C:C��q��K(-/�"��v#y&�����7(���*��E
�9���<]BiYP�bx:��Y�t&�;��p��*�h��!y����$�CO��<�6^��oP
����O�E����)$O�PZ���bx:��YP4o����-�[�"��x���K(-��x���e$��$��9��[�W1G� cbR.O�PZ�11���gr���'��9�E4U���A�H.��JKE-��%��<��"I�w�A�U���9Vt\?	�gr	��!7�E��3
y����x��(2	dr����H7^����uc]�};��4����)I�w�A�w4UL�����I�<�K(���f��@dE��$�;^�"�E|q
]���%��L.��Ft��]�L�Y��$�;���1���)����L���\BiEbE���)9dE�{I�w�AQ��CS�EjF-"\��%�Vt�21<9d�hN���Q�����PQF].��J+2�"�'����*I�w�A�9>��/��D��3����>,����6��"�s�
O4��9&���3����b�R���@��V��9���U_E��E�S[�<�K(m��\�bxr��B���x���UL���8(\��%�6d)J����!KQ��oP�E|s��HL.��J��MO����(����7(t�2���Q�������1�=�&�'��l=�D~����>T1�w�1uU�<�K(m���v1<9dK�E��1�������B]m��-I�<�K(mL]=���<�
��K"�s�5�����9����`I�<�K(m�
�N1<9dC�����x��������"��M�<�K(m�uv���y s�����7(l)�ULa)j(/	�gr	�
���KO�������x��c��b�1�������]BiC���k(#y6t/����7(�"U��"�4^^��o�/����r�^����E~��}�<T1�����!��f�"
i�9��������,�;���*���b�H���%����t�������TF��_d�5*��"_E�"��#�:�C�7�����K�wq��%�;^�p���b������t�<�K(���mN�@�������Q	���"��"(�,����]BiG*]�bx�F���?u���@��D�"��_~�[-2����$q��_��������$sq�F��9������<E� 2�E����R�r�S]��EgC���x���h��S�He-r��VM�����������"Gn��oP����O�E��87!y����B�&�������Y�w�A�U�W1�*�t�.$O�PZ�	��m�bx�M_�����~���A���W���"����<�iZ}5�bxZ���h.�;^�Ply�� ��;���,�)�������`*FY�Y�w�A�w4��2�}Cc�&$O�P��Bm�.���2C�"�s�
���)�����]H�:�t������i���EY�Y�w�AQ{�Ci�Ai����N((�"��#y������7(<��*��h�EN!y����B�)���H�Ye��9���"��9�"��t����JPL����t�3�Q^�w�A����b������:�t�:B�%��2���,EE�w�A���CS�E����%��Q�B&��,e�iY����x���E�~��-�,EE�<�b��l��(�L���f��oPx�U��� q��g	FA�(���M��3-��"�;���^���)�"IgE�<K0
BD����g���B-"�;����7w�{���M�^��4^Iw��h�@�����x��C�Ce���6��Y�Q":�W�}x*�9Ph��oPx/���c/RY���!6���bxr��\0E�w�A�U�W1�*���T�<K1/.cG�H���@���i"�s�
�
�UL!�������Y��ZIgUO��P�^��oP�E|S�Hz�.�R����B��&�'��L��_��oP���P�����R���4��2�8���x�<�	y����x�����b
]$!�`.��������?l�2�gBg���x����b��&1uU�<�j^\��ZDO���������7(��U��AuE�<�fN�$t��lbxr��Y���c�A���b�
2&��,�9q��1��bxr��l��9������9��mW������IbB�!�'��L��&E�w�A��U��"��X����/���{���y �:+"�s�
oW}slWj��,�����ZDO���1�����7(,��*��SG�py���E��i_bxr���t"�s�Q�E~���[$#�����y�HF�g}����7��Pw����h��b���{�K�ms-��><
�F!�e��oPTy�b
]$���^���HF������kT|!��/2�E'��*��h2��k8�}3~����.�:��E���x�J/�"�?��ARu�w��F����~��@����K�w�Fe�"��<G� �qMU�7��(�����4��V��9��(�"�U��-������o�/�������4��V��9��(�"�U��-�<��,���H�h-bx*F���"��/2��W_��Hc-r��f�"y�k�S1�gF��*�;���*���cA��Z��gu	����Su�'r�V��9�E���s�zj7!y����<���������3M�w�Aau�W1��Z��Fj��K(-L��bx�F�,���x��_�����UH�.�������i5�gaB���x���U_����b�*$O�PZ"��lbxZ��Y�wM���x�*�E�~��-���MH�.���Op�MO��<�@u��oP�E|s�
����<]Bia��.���H��0��/2�Ui����N�]��z��%�t��bx:��YPbb��oPh�s
A��w�'XO1Z�F,L���oP�����O��,(O�^Bt���K0�%�����.#yV&�����7(��UL��Ld����J+�`.1<]F��(������7(�N�*�X'+ry6��l.��"=���2O��*�D~��5&>T1�1�"=�	�gs	�5�YV�2O����M�w�A��Cs<h������������-�%��<��w6��9��[�W1G����&\��%�V$��x�<��@V���&�;���.�P��HEg��py6�PZ�1��E�.wqB���7��[������"(�	�gs	���9�x +2&6��9�U���WQ��7Wt��	�gs	�[���@��Z�>_�A�U�W1�*���M�<�K(���������O7��9��(�"�U��-B$�&\��%�V���*�'���Ho"�s�
���UL��W��7��l.���������y Jh"�s�
���b�i(�	�gs	�ma-"�'��l��EM�w�A5�"�?��A���py6�P��*����<��i�"�s�
�E|S�ES��������T�UO���f,�;���k��*�x���*.\��%����i����!cb��oPx�U����3�M�<�K(m��y����<�-���oP��CS��iL�.��J:a�1<9dcB���x�����b�U��py6�P��W��!�'��l��w����-�[�"�s����������SO�����*�;��p��*&i���gs	�����������M�w�D�~���x����HGF����K(���H�u���:B��"�Qm_�2G� ���.q��_�#��/�@]��6���E^�o�����b� ��/w�����X�����K��]�w�FE�"��8G��c�=�%��J{L�	Tw����/2�E�"UL����c���E:���x���P�����7(����)^�u$y��uq��_�#�����4�UP�����7(z����)��t����K�7����y���i�
mWE~��kT�{[E�c/�>���!����t�������wqQ�������p���[�Y��%��J;r�"������t��9���ya��T��O�E�?�E�]��:�t��^����Vwq�vU�w�F���	AP�w���^�e�n\������������x��C���Oq��#�B��	���=]O}1��t"�s�
���{����"hc����JP���W1<��\\������7��[������"L�\���JPL�[���n�����t��9�E��U�)Z}G�oB��	���MO[3�	�"�s�
Kg��8E����}��N((4��bx�����0{��oP�E|s�� |?���J
�"��`..��E~���y�b��E*k!y����B��SO�e..:��EB��?�H�\��[J�)$O��:PH]=��t:��-���x���El}�A�����N((�`]bx����x��9������U����k��E6v�ry����*u�<�Ws��P��z�5
����9T�yWW��\_FAX�*�.w�s]�3mA��*�;���D�P�����U�<��(2���.y��<�$��"�s�
���S�:C�
�������k\�=���W��9��x�\��[I��py��(:���S�vwq��%�;���w���6E� �z.�5a�h�J�@usq3Z�D~��kVW}s��KAo���&� ,H�\�}xZ�r�P7����7(��PE��E*�{.�5;��
B���@���#w��oPx�U��� ��*\�k1/.�9^���rA��*�;���v�W1�vI��py����\��y�bxr.��B�4��9���9>����Hx���py����(`mbxr���BW��9���U[��j@_i_��sm��e@������y ��,��9��(�"�U��-�����s���e@!�*�'��u���x�����*�0&�������������20�X�w�AQ{�CS��S���s��k4��bxr��4c��9���^_�Co@��U�<���8	����bxr���������7(���U���A��U�<���8	(�u=���<�E��"�s�
�"��)t�����py�������bxr���dW��9��?|���s�(/w.��4~�P��u���y �Y/���3
��oU�u��h�U�<�6(�`m/1<9d@N�M�w�A��>��o�HG�.yn/�	����:�I�H��D~��?�>o�_���A9��r�<���E�+ �&PF��H��D~��n_�-QX���o�/QX�����TD��_d�
��UL1�F�6c�Q����z����4���L6��9��[�W1G� ��^���HDQ&[�O�Q(px��oPT]}�b
u5���-���H��E.�2�gL�ED~��o�����b� [�������_$&�L�bx������&�;^�2��*�����fl���f�"i�[�S�������Q�����2������&q��_$4fT1<��..��D~��?�@��V����{k��o�/��������3�(�M�w�A�P��*���(�ekB�t	�E�l]O�H��	�"�s�
�"��9V��Z���%���ZDO�I�m{D~��n_�$-�&�UH�.�41~��j$��x��9��[�W1E�$t�`����J2�o��6#y���"�s�Q�E~���[��l��<]BiB�m��n$��4c��9��W_��S�w!y����T�CO��<r�o"�s�
�"��9V���!y������!���H�	}�o��oP�E|s�r�o��<]Bib��)���H��i�"�s�
���y�b�s4�����<]BiB����e$��4c��9�E�UL��O��+��K(MH�_w�sw���nv��9�E_�=T1�k��T�]�<w�P�P����%��y ��w��9�EW��*�XEk�S�7�  U�g2(�LC��]�w�F!��.<����L=�nt�OaMI(�f����������x���$����DFy>�py�.�4���=�e<���w��9��#h|sD�ddK���sw	����t�<w����������7(���*�XE�-}.��%�fdK��}x��2�""�s�
�
�UL!�g$��������Q�1<9d���/'��x�\��[��w���]BiF������y 32m�"�s�
���UL��fdK���sw	�	�{���@f�%�����7(t�rw����@7�6���\������y 3rR�"�s�
���{�"�q��S[�<w�P��6�.�'���=�D~����|S�Y}as.��%�f���bxr��RSv��9��x_�|f�py�.�47�g�bxr��x��9��y���[��IT�<w�P��*����y 32m�"�s�%������x����Hy�%Y�<w�PZ^������y �����<��?�@��V�_������������C���Y�i{����-�[�"�s��py�.���`�����@[�����7(z`���>G����py�.��0����@&�����7(�g�*���JDo�������X����y 2m"�s�
?h|s<hP0���K��K(-�c��k(#y����x����Cs�"��"���}3~���c�OoP��~��7(*�?T1�_�� ���Z-X�><
�F!�����-�[�"H�?�%����$�q(#y��C�w�AE�"�?��Aa=�]�<\BiA��O�r�'�29D~��~��*�x� U�Hw��p	���G��H�i����x��-����E*�����f1	�G�S6�gE�"���x�����*�p�U����Dq��_�"{�Q��T��YQ��!�;���.�P��HE��Q_���HE��Q��T��Y��z����7(�"��9Z$!�����HE�G�S5�gE��C�w�#�����O�E2j�&$O�PZ���hbxjF��L��oP�5�CS���L��B�t	���t]O�H�"�s�5�Kg��9����#�UH�.���H�c��j$���#��9���3_��Ye��&$O�PZ�61<mF��(����oP���P�����MH�.��v���bx�Nwq��F�w�D�o�����^�4��p�B�t	�
J�]O��<���k��9��4��)4mA�CH�.�������a$���(�;�������)��
%��<]BiCy��)���H�
��"�s�Q�E~���[����<]Bic��%���H�-�m����Gh�����a��%$O�P�P^����e$���dO��9��(�"�T��-����?�O�P�P^����=��1���oPt/�P�{�C���y���V�*���i�""�s�
��E��c/����py�.��!��V�r���Z�>_�A��U��"���)\��K(m�-x���y:dC^�S�w�A���CslW�[�.��%��ZE�]�<�������x�����b�U�#c�)\��K(�(����@dG'�O��9��p�\��[�����y���X����y ;�@�"�s�
�
�UL!�w��<���t	�=�)bxr����S�w�A�U�W1�*��}���y����������y ;:a~����7(���*�XE��S�<O�P���{61<9dg����x���U_��U��
���J{A�]O����N��9��(�"�U��-��U��<]BiG�����y ;���)�;��:n�����b� ��)\��K(�
�����3AP�w�A��U��"L�.�S'��^/�����I{ 
��"�s�5j��D_�2�1q�3���py�:�����]O�9P��E~��5<T��h��:����	����1<i�
��N��9��u_E��Ek!y����B-r��I{ P���)�;���*���caC�py�:���,E���r��."�;�����W��h@v
���JP(������=��vX"�s�
�"��:E�T��_/!y����]���4�U��x����Cs�"�h��q�V�"��������7(�""�s�Q�E~���[dA�r��K�����!����2(�""�s�Q�E�~��-�|>W�K��N((�"�@���"�%�;�����W1��fA>�+�%�K'�j��	��<��Z��x��-����E�v5q�N�"�E�}xx�B��9�E��<T��h�uv�(��fZI�W�OoP
��~����L?|����)Z����K��fZ�|�"��b$��s]"�s�
���{�b��x:�x�C��lZ��
B�S1��RQ�����7(�"�?��A>���%�K'�j�*��j$�}����oP�E|s��N����Y�_da�g�S3����*"�;��p��*�h&yv!y6�Y�)������30AP�w�A�P��*�Z$����*$�n�"�I���V#y�E�K�w�A�U�W1�*�"B�\�_$���^��V#y&����7(�"�?��a��&$���EB`-"���H�y /��9��[�W1G� ����s7~��>�p�bx����H:��oPX]�UL��������<w�		=�1<F��ny����7(���W1����>�{�B�<�_$ ��u���4�g@^�K�w�#
��oU�u�T�"B�<�_$0����i$���Hp����D��>��/�:�w]B���_$�����e$�@�H��D~�����*���c����=����B���i�������o�D�|���x����H|t1���-FA���P]����h��w�����U,s���V����}�
�"��Q�����;�x�j�E|SlW#�!��������Z$�;�y c@-r��|�
���UL�����)��Q"Q��Wz	��@FrR���-�^�W_��9��s���}KFA�	m{�!P�����;�x�*�E|e�IhI��<�X�2Z����2f�`��;�x�J�E|S$��Z���|_`�*�E���2�"���7��2m_�������������iUO�+���;��Gh�������E.q������*����<�����=���7(��U��i�A���������v����y cG-r��|�
���UL��&v�Cv!yv��2��J����<��	����7��p��*�h��B�UH����LZEV1<9dZ�������n_�-���MH��yq�������<�)�������VW}S��)�?�]H�.�4E�"���2E�"���7^�~�g�HS��K�]L!y������]O����s��|�
���)��D�CH�.�4�����2U�6��/r�i��*�-R���)$O�P�*��bxr��P���/r�gh�����ih�	��%���Z����@��Z�~�������)���,|�KH�.�4���?���4���x���h���M&�w������E22�-�K������Pw���T�-r~��_l����y�<�P��g/~�(#yf�:[���o�AQ]���)t���v�K��K(�$��gW�2�g��E�~��7(���*�XE� �,�������1����7(�����7����P�|�d�XR���ErA�t���������n_�-���%]���H�h��@�3W�]��w��Up�\��[���w�sq	����S6�gF��r��|�
��"UL��dd)Z�]�\\Bi�h�S��T���;z���;�x��_�d)Zj���E��E����<�mW���o�A��UL�"��V�&$O�PZ��41<5#yt6t��w���[�W1G�0����%����"]O�H��
]���o�A��U��"����<]BiAgC�.��n$����.���7���;_��h
:���B�t	���t��V#y��Z�����n_�-�N�.��<]BiA�e��f$���������n_�-��*���%�&��bx���Y��{��|�
���b�aR�!$O�PZ������a$�����!�"�;����*���Je-"$O�PZ�1q9��t��4�"����n�����*�0&t�u9���J�1\N1<�F�,(�o��_�tcG�-����EP��r	��%������t���X����:���@������4��x�U$���]��Y��D~���L�SS|&�.��@�<�K(���mX��gp��t�����Q���b���Td(
��\Bi
�E�]��Y��D~��n_�-��� \��%�V$���"�rOm�D~��k
��\~��(������/v#�����;���\�h�#�;^�������S����.���c�!����e-r��������)����.����!����<��"A�w�A�I���9&Q�
��3����n����y �E���x��_���,|A�<�K(mL�bxr������9��[������"����3����n����y 2���9��.��@���/
t��`S<�:h���E�"���oP��CS��i(�,�gp	�
��.�'��lL���oP�O�W1��vBz�py�P���,�bxr�����9���"��9�"��t.��J+61<9dC�� �;���*���c)�A#\��%�6�:����!�Y��oP�E�~��-�H��.�����]O��ZE~��=��P�������.�����p���y S�D~��KT�a�U�9>���iJ�<�K(�(�?�bxr��>�D~��k�T:�"�����b�0�L�<�K(�L:����<���`D~�����*���t����3������������#�,����7(<��*�z;���]��.������:�H��
�"�s�
���Cs�:����]BiGgC��
Ts-X"�s�5
[�|sX�:�!c����H��E�}xx��u���F�]�U�9��H��1��f�"�t1����7(�""�s�5��U�VQ�XE*k�K�7���lhL�@]������Q�����O�EP�aLw�3����$��N����E{��9��q��*�-�\�1�%��J;:����<Qbb��oP���PE��E��\��ow�H���?�z�1<����������7(������~G��j��}�L� _�bx��\\dp�"�s�
�~I���>E�������}k�E��<c�S{����tQ�w�A����*�-�V�&$O�P���ZDO�0��t"�s�
?h|s<hj�.$O�P���v�]O}5���"�s�
���{�"M�"(�,�B�	��A�n\���Vsq��#�;�Z��*��E��,nB�	��A�����%sqQ���g��rk���k�G�(/u�����[�.!c{^��0�J)M1C��*�;oP41���2E�������<EB���B_�X1<����������n_�-�D�CH�"���0]���q}
U%�;��"-r�����E���B�	��
ef�����\��""�3��u_����,|�%$O�P�(�����t�sa7��x��-����E�tv�S$��
����n#y.L�������_��*�g��D����)J�U�)y��{�!�Y����(�:�U�9Z}s!�g�aA���<%���gZA-"�;�Q������"H������ ,H���-P��V�v5����T�-r�����E�]��S;'� ,
�H:�=�j��x�����*������Y�<�������j��"A0����^E|s�"����py��)m{�S����(�����7(*��T1�t�>h.��������\��S��C�����A�U�W1�*�P�`.�\�����]���<�	�"�3���"��)�")�UD�<s5/.2&�*�'��L��Y�w���*���cIh/"\����	�MO�����,�;��-�S��E��,\����	�]O��P�_���E�����"h.������>����2�O�f���Wh�����-�>���3��21uu���@&d��"�3���"��9�"�P���3o��eB������y �[f��x�����b�U���P�<�nN�$t|8�bxr���g��x���U_��Ut@:�g�������CO�����,�;oP�E|s��xn.�|�'+SWO1<9����Y�w��p��*�h��Of�������L�����<�+rE~g�
oW}SlWW��
�g��_de��%�'��\� (�;�Q��[���O�a����Y�<�m�"+:��o1<9����"�;oP���b�w4+RW��)y�����H]-�!PF�\3k��_$�E[���9Z}��,Y�7�Y�wM���oP��~��kNL�U�94(1��E�7�YQbbI��)��ZD�w^�����KTe�+g��M��^�w��q1/WqE��_$���}�~��x��w��O����/����e=�H�+����x��C�Ks�H]-�)y�l�"+RWK��H�+RW����A�d��*�HX��ZJ��r-2JO�H���,���Wh�����-�Q�d�I�7��(��T1<U#yft������k������u�=d^�S�����HF_$(MO�H����"�3��(�"�/~�[��J{J��%�f�y���x�����(/�;oP�k�/U�S�HEo]H�.�43������3wV��/�Wh�����-���!$O�P����2��4������"�;oP�E|s�:�X6!y�������&���H�eaU=�"�7(,��*�������w!y����2��.���H�ef��x��-����Ek!y����^��bx���Y��I��x�����b
]������K(-l�9��t����E�w�������B]-(���B�t	���=��t��4��"�3��[�W1G��<�r	��%������e$���n����A���W1�DS:���B�t	�����o1<�F����]D~g�5j���b�B����^n!y����&����}��;�9_^�oWE��E��.���]]BiM�En�:�}C-"�;�Q+�h|�ME�*\��%�V����!P����y�����L����<�w�"[z.��J+�-O�syV�&[E~g�
���{�b��x�,T���.�����>%��<�
�U�w��h2�KS$T4�V���.���d�����r����*�;oPt�}�b����OMU���.��"Ci-�2��<�U�w^���E\�?�w-�>h�*\��%��k1<9dC�H���E�����"H���Y]Bic�H���@������d�
��|�b��
%T���.���0��M��<���""�3���|s$4�Z�������t�.�'��lL���E�����"�+�U�<�K(m��Vu���y ��T��x�����b�U��V���.��!�}bxr���B����Aa�W1����
�gu	�
YS�&�'��l�����d�
����)���tH���.��1�n���@6���*�;�Q�MQ�������_�C��!��avo�8���!�*�;�j���.��������O��}���D=���<���""�3�����V��x�tcX�������|�����8�*�;�Q��������Ag��pyV�P��obxr��&��x�B�/<���wv�;�l�nd��[O���D#�;oP��������
�!��b����>��).�F!3@���7(�y�b
�HGf��,���HGf��<���TC��_$�E���*�3����%��������>e$��>��D~g�_Q�E�_��_�Z��S�l.�t,	�N�2��XP�����kzU��� �\~�H�ol�����K�[���2l� ���W�-q���b������S�5*/�tS�����}�`����$q���b��y��D��b�gZy��q�5
��n"�3��(p�~��_�7����[�7�H�jUO�H���n"�3�Up�����?l�Q��S�l.�t4v���T��9��%�;�Q��akOA����1XUb�hR\��a��H��A�eX��?�Wc��@��� ��;�����z5�M�"�2��wX��:E��7�mAP�w~�P�Tbx����I-�-�Q��U�U�<E� �T�� ��;��-l����}��]��$�-oP���K}�YP$F�� ��;�F�M��i.��V�nx��_���=hv!y���@���h�o����M�[�����W1��fa��!$O����*��bx:���(���t���}c�A�������Z�N1<��\��_�[��P7^B.������_�9�=��q����������t��~U��hs�7��}	AP�w~�����-���2�nD�e�
?h|S<h���7!y���@�1���m$��<"]�[�Z��*�u�,]��S����������<�SbU=�����~�"?V��[d%o3��@��Q�V��S���y��u�H��A�U���9V������/FAH�S==%���3
E+t�nx����^���5^*�O[x {2
BB����<��@~��q��t����P�������g��`s<��A����b��b�]�����������O��}C�����Q�@o��M_��E�H��A���b���&�.<��aEG?z��v~�PJb���7(�"��9Z}��d/FAX��{��v
��"�2��������;��@���@�j^\���robx��/:$�E�e�
u��@�f^��lN�b�p�2���2G��9M�[��(����w��me��.�'�\����7(t��C���kE���o��[�<_l^����.�s�7(,�Ei��M�M1��x;�\������(������WB���]lK��,�m��
�A�{%�e}7N�����E)�9�����ClK��,�w1"1��(p�l��e���6��?����l�}���s�e�����7(,J�F��I.���r��p,e�	�.��4^��f�S��!��~_$#�����b�?tL��`?�� ���~�����2�hD2b�
5��������@7�6�56��������et:��d���o��I�+�G����OB��xx�*�����^���)�"��S�7��(HA�[�� X��s�d��T�-r�����E�_u,O�s,�kP����r��<����x��-����Ej���<G2^������@���w�C$#�����R��OAxc�����E��g}O��(tdx����5#�T1�� �n�E�7�5((�n��xx�B����~�A��U��"������o�MQ�{z��@Q� �����7����������E�S���)
RWG�S1�gA�q"1��(�"?U��[���]}J���HA�����vwq�3M$#�Z��*�u�t4��"��q���&�&��f$�������Wh�����-�����<]�eAg0F�Sw�'���~�A��U��"L��B�t���	�CO�H��,"�1���3_��YEgg���K���� ����<+��
���Wh�����-��-�&$O�nY����i3�gE�M"�1��u_��HE������[V��9v1<�F��+�F��x��_�&�B�t���<�!���H��`��x��~��*���T�c��<]�eE��N#yVd�"�1��v��]�c�?�%�F{��~��y �)���H�}E���������~l(�n\b��� �>x�����O�]76�:��q�
�"�>�9.&zqr���[6�:���t���9Md?������B�o�d��\�.��!���yJ���@��A��|x����*�� 4tra.���[6��d[����<�
}@|���7(�	��rs��
�~�`S,X���S����#����7��P�����o{^.����6[���4�����Md?��*�o�/~��[B�M�<7�n������@dG_D�D�c�
���7���\�cG����������n"1��(�7f�`�oG��Mx 7���qx�o�9��:���V����<�������oPh��e?���'{���SG��V���<�����~�A�n��e?�J_�\�>G��7�[���@��&��x�B��@n.��7�3�l��1����x�<�9r7�nx�B-"<���~�(�b�b�p��s*^����D�e\`�B;,���\�e���[b�9�zj1:�@�D7��x�Bo�6���\~�@y_������{3G��`*�����Q	/��>�)������pyn.�t��x��r���M$�^�2�Dmy�Itdv����2X:���b<t�Q��,JoP����b�wk���������o��r�3��H(
�A����b��6rn������&�S����9Pb�&�;�Q(�o���w����KO����a��E�e�
���m��O�����?����i�s4��@�"\��N(
�#��x�=�_��i����n_�-���l������@���-�'���B� �]�w������(S�H.�b>E�]'��#�!P���eA��_$�E���T��h4�K��6-�����sx
�F�9m���7(d�R�:E��ItOY�����D���oP��E~g�
�>h^���A�^���"��0-���}}���7(�""�3�5h���b|�h�Nt_/q��i�Nt�����m�����n��?�w-���{~J��N(
����@��B-"�;�Q}G��X�)Z����S��uBi�������twq��S�w^��hli��fA6�Z�};M� �n�bx��]\�""�3������DU���������st#2�MO-���|-�;oPx/���c/���-�[3�������������]�w��:n��?��-�R��.$O�P(��t1<u#y.(n~���7(���*�XEP��>���J�V�!��a$���y�E�Q8�W���E���}��N(
��nbx������~����@��T��n��&�]H�:�4Ph���i7���b�w���Wh�����-�$�CH����,(�n?�xx�sA��]�w��p��*�h��N����<�IL]=��t�31uU�w���D���b�IL]=��y�HB'��SO��<��ZD�EN3v������4�v5�`����i�"	}u���t5wqQ�����k��[�V���"(:h���y�HB�A�-��;���ZD�w^�2n[E��E��z��~�HB����S�<�2���C�w���v���9����y���1
BB�<�E��3
������A�����"H]=���X���*ZE�K��3
E"�3�E'��*��hPt�!\�G2
BB�AG��=���{����n_�-����py�)��z�O��p������x��gz_��S�
G:���X��0P����y8d���u�
���b�AF�C�<�l�	�GyO��@����!�;oP�E|S���A{��<�Q��E���r]�vU�w�EZ���O�a�,�E��������l�G��sy��&{�������*����(��.����+��MO��"��!�;oP4���)�1Vt\�.����+��]O��"��!JoPx�U���0uU�<�n^\����1���<�+
f?D~g�
����)������0/.Wd(=61<9��N�"�4����~���"
m���������
�&�'��\�w�����(�m<_E��E�����<vs�dE��c���@�����<F�5
'�*�HX�w�.�c7'NV��bxr��T:��x���(_���e��.��0'N22����2#��!�;oP4����)R�22���y��/��Jw���y 3S�DBi�
��������A��C�<����q�����@f�y����
�|�b�P��"�Z�<�P������@f�����7(�"��9Z�<���<]BiF'���sx
�A������h��T1G����sY�}3~��<����oP���_$�E��*��3�<�G�7����t���x�B!����A���KslW����t��f�"����-PF�,h�?�U���P
�������)���>%������s=�H����"�3��l�*�8�Y���3?%��%��������..ZE~g�
�E|}�!z�Y��o�/R���,��)��ZD�w�����W1��fEKr]�}3~���rV1<U#y�}�S�w���*���cA���^���HA��������������A
�"�/~�[���)y�.����g�S3�ga�����A�U�W1�*��Yg��K(-��tv1<u#y�Q�S�w��p��*�h��Zd��%��^:����<r/�"�3������9����unB�t	����MO��<�`U=�"����A��M�.��?�Fw�^����"�����i3�ge�����A����b��jM�A���%�VdM9w1<�F��(�����7(������O}��<���J+��1<F��� �;oP�L�KS���LA8���J+��O1<�F��l����7(����*��|be
�%$O�PZ�|}���2�gE�H����AaK��b
KQE�O�-$O�PZQ �y���6�gE������+
��OU��a��[H�.�������m$�:H�\"�3��-E��),EE>]��y��������%P����{����7(z`���)l6������r	��Sj��.�@��|x�Z���W�La)jH�����r	�
e�_�)y^���Q�K�w�Z��*�u� �%\��K(mH�����y9dCq�����AQ]���)t���/���\BiCG����</��l(����7(���T1�.�2�C
���JRW�|��@6�^�D~g�
��������A�0�py^.��!]�*bxr����/��x��C�KS�
�"�py^.����VW���@6��K�w���^�W1�^����y����ra�&�'���(�����7(�"��)Z���V�py^.��/h�����<�}Aj����A����b��Hgb�py^.��#k�5���<���""�3��q�\���?l�}	���J;�������3	F�w���t���B:�(��.��%�vt������\����D~g�
�"��9Vtn�.��%�v&��bxr�^P�����z}S�E�\��y���^���CO��������7(���*�XE*ZE���r	���U����@���""�3��'_�
SW���r	���N1<9dG��K�w^����*�~���Y��y������KO�9�J'�;oP�A����A3�)\��K(L:����<�"]"�3���U_���@�����<]B�@�H��9<��2B=�"�7(�y�b���HD]����o�/2�B=�����PO�H�
�>h^���A��9�}3~��Y��e$����o��x��-r�����E�tv���y�������t��<��"�3�E�"/U��A6����f�"�����x�B�/�;�Q�:�}m
�@V�;gq��_d ]����)���z�E�Q��V��9�j5�������f�"����sx
�A�������n]�?�W-��"��o�/(�"UO�rw ��/x�Z�"�/~�[da��)y�:�4Ph�S��Twsq�{����7(�"��9Z�n��)y�:�4P���������Z��	�A���W�gh�}���B��	��BV�S/��������D%�qU�9�"	����<uBi��}bx�\\tR����7(j)z�b��E
R��<uBi�P�lbx����3�����A%�"�/~�[�����N(
��nbx�sq������7(���� ��;�
t��`u�nD��w1<�CW�"'�-�;�Q�Ely������B��	��B��COGu�i����kT�-b�(s������<uBi��};��t����K�w^�*n[E��E�����N(
��\bx�>���m����A�/I�T��h�Pz_B��	��b-"���H�+���-�;oP�������A�o!y���@���-���H�kG�����A����T��h���?���J�P����!y~�
*#�c������UQ�h����|�<�/�A
�jO�b�i��j���*��UL��&������}�
uc�OT2��L^�}�l�H����UL��7�����nq�����"�"P���j�g~�7������@~�
j��h/���2�2��p�����=�����x�Z?���*�)t�\������}�
-Xy�a.nE����o�A�?m_���i?]��X�����D9dn���������-���B��"O���6(��T1<9dfC�3��oP����b���y ]������U>�E������V|�l}�HK�h��*�������)��yqY$�51<9dY����������W[E�b)	�H�g7/.����]���YV��<�;����v�V��������CH����,�!����T��z�w~�
Kg��)�����MH����,l�����<��}m�����"[u(<��*��h�@o��<7����1c��syV�3~�w~�
���UL���'��<ws��2����@��������E3v��4��9N�U�����aN������������3��oPx����b�ZW��}
��4'NjFC�)�'���
������;
��OU��)��]B�<�_��w4��������_�2cGe��[��qSTz�����q����A����6v��_���-E��),E���&$���E�����#�'�������z�EoPX��UL!�W�]]>O�s�GLE���s	��<�g�������7(�y�b��I����O�sY�_�}P�,�@��}�*�����}G�R��hz���*�����=h�sx
�A���~��kT��3_E��u���^Wq��_�%�����)����	�AQ���)�FR��%�}3~�!�/�s<�A���3��oPt��R��U�!���Nq��_}���go�2�g�hy�w~�
�"��9V��6�)y..����,bx*F�lH:[����x��x/b��#�!qp�O�sq	���U����6wq�*�����^E|s�"
=hZ���EZ[JO�H���������E�����"���E�7�i��t1<u#y�������o�A��U��"����<]Bi�E����<:��<�;���4��)4��Zd��%��k1<
#yvtHby�w~�
���b�A{�MH�.��/h����i3�gg��3���Q\]�U���v���B�t	��������..z�<�;����}�*�8����o9���J��t�COGr��3���Q���b����Y���%�v�\N1<����EN�9���o��?��-���SH�.���S]�)���p��%�"��Px����c����-��<]Bi�h����t��W4�\�/r�����x��)^�u���B�t	���,��n#y��Z�~���
���b�!CoR.O�P���4}��gr���$�;oP���R����$�$\��%�v��L�S�L�9� �D~g�
���{�b��x��Z���(JSZ�v��"�3�������"�P���3�������p�����F�3���9��t�7	�gr	���M�.P�]\�"��:����$<���w||�_�9�d(�Z���y �[&��x�����b�U$���py&�P:����sxJ�9P�l���7(������OI�I�<�K(�P����r �.������@��T��nt;	�gr	��v����@$&��x��_�t�>	�gr	��0OMO�9�w5����kT�-b��s�:����3���1P7v1<9��E~g�
�zW_�������Ag��py&�P(t���2P��E~g�5j�{[�����
�g�	��B�&�'���B���$��x���h|i�I�E���J�Zd���@~��I�$�;oPx/��X�h&
�g�	��B��.�'���B1�L�w��p��*�hdLL���tBi�P�bx��/
�K"�3���"��9�"�,v.��J�������UQ��������*������I�<�N(
ZE.1<id���+�;�Q���}�3E����I�<�N(
���bx��/TG�����Ae�"�/~�[���&$O�P��bn�[O�(������AQ��Km�A>[?O�s�	��R���.P�cP��~��m��*�h�}{]��o�i���uyO�7��PO�H�5
��|i��wA��5�����E������oPhm����($,}����n.�J�=���Sl{$���sx��QH:[E~g�
��/UL1�.���S��b��@�[������V�"�3�Uq�����?l��Z$?%�U'�
���(#y.H:[E~g�
����9V$�����v�A1�k�Si���K�w^����W����"�l�Y�7�Y�A�����fwq��%�;oP4���1E�����-�������������� /�*�;�Q�
���1����������E�������]������������*�g�Mb�g�g7~��a-"�������""�3��(�"?U��[dA-2��9�_$!�:��4�����*�;��-�S��E���&$�a�"�	���6#y&&�����u��T1�>1�z��f�"iE�.���H�	}�f���7(,��*�����\w!y��/��*~��i7�gB'�W��x�*�E�_����!y�/�
k1<F�LL����7(���*�PW�O!y��k��9��t�3����"�3�E��/ULaoNL����y�HB���KO��<:������~�����Mob�-$���E�����n#y&�a�U�w�Z��*�u�������m1	�d��)yf��L} �s��Fa�W1���q�,\�������@�g��B5����+��������YQ�f.��a��9jw�l{����AQ���)�	�Y�<s2
����6�2��uA�(�;oPT]}����"��-\�9aMh�Z��gv�	�Y�w���;��*�xG�">�g^����D����gv�	�Y�w�����R����l�Y�<s��E��U�2��d��x�Zq�����?l�!�,\��a�h�*bxr��Gd��x����KS�"+z����3W��rE���UO��V�"����7(���*�XE����3W��rE�����<�+�����A�U�W1�*��,\����+r��.�'��\�������F��U_E������Y�<s7/.W���CO��"|����(.��*��W������]B���r����@���E~g�
����)����Y�<�K(�(�#obxr��x���Wh�����-�B?�pyf�P��*����y 3���"�3���"��)�"E�f���.�4��Z�CO����+�;oP�E|s���V���.�4��As���y ��4"�3���"��9�"�E��3������KO��������+��������A
�pyf�P���/1<9dF��Y�w�Z��*�u�0U\�<�K(�mn1<9d���)�;oP���KS��H/!y����ra��9<^��������A�w4/UL��&����%��f�"����9<^�Pzs���7(���T1�*�Y�����HF�xI�@�3���"�;oPn��?��-���KzJ��%����i�(#y��/"�3��(�"?U��[� |Y��gq	�	�e�j���,��x�Zp��*�9Z9�K����HA����S�
�����F%�"��4G�$�"e���E
��KyO�7(�""�3��RK��b��RT�_�G�7�)(��T1<U#yeRD~g�
oW}SlWKf-r��f�"E��*��j$���L����Aa]�W1�.R������Y\BiAQ&����m��"�N�w^�*���*�{$U�.$O�PZ���J�S7�ga*����A�7�/UL���0r��%���
1<
#y������n_�-���e��K(-��Z61<mF�,��ZD~g�%���U[E�#w�2a��K(�l�������f�z�EoPx��UL1�V��)��<]Bie�.��}wmWE~g�5����VQ�z+:�Z!y����|>������Ek����A����b��HE>�r
��%�V6<�bx:��Y�F�w���!��*�8$QZE.!y�����3���e$�������A��U��"��E���K(�(y��bx���Y��$�;oP�������a&�[H�.�������t��}H7V��x���3_�����#T�������iu
�y�5���*�;�Q�F���.��?����_�e���-]�M\��*�����Q�/����/���U��������"5=%��<�-�K�w�����R���E��,\��%�6�u��>%��<�
%&V��x��G�^����UC>�*\��%�6���y(��l�SE~g�
�"��Y]~�(���������nD�x���������*�;oP���*��o��S�������|>����y r����A�����9�������.��������y :�YE~g�
���b�A6�pyV�P���61<9dC�q���7(�`	du����@7�6�M�u�L�bxr��\gU�w^��'�
du��
�
�l���m�I����y �:R���7��������������������^�1:dGgC����A���W1�D������.�����u���@vt6�������|SHg%]V���.�����x�@9dOh����7(���UL�����OU�<�K(����!�'���(T�����~������kGgz�pyV�P�����)�C�����HU�w^���^_�gz;��S.��J{F�)�C���L�����(���U�����m�pyV�P���^bxr���U�w����W1��#|.��J;�:R����<�9�����A��U��"��O�#$O�P������9<��*B=�"�7(z`���6G�t1oq��_���mY�H�i�M�w��:n��?��-�Q�,O������I��('y"��������^��C:C�$ZzJ��%��u��v�2����y�EoP�E|S����%y���]�E���>���k:��D~g�
���/UL��tr��U�7���B���)��|�M�w��p��*�h$�����8bJ�l�9<^���D~g�
�Jg/UL!�����)��q��������<��i"�3��W_����i�)y6�P:2j�*��j$�QX�<�"�7(�"��9Z��iM�7���H�����s ������}��R�oz:N���<]B�@�������s0�X�w��p��*�h��!y������m��i,����Z�w^��-�W1�-}0U|��%���obx����ED~g�5
��}s��S�7!y���1X���is�'2m7��x�*���O�*~���j��g���.$O�P(�"����..ZED~g�5
��W���"L�>���J���COGq�����F�_E��E���B��	��B��)��3���ZD�w�Z��*�u����	�S'�
��KO�m..SWE~g�_Q�E�_���SW/!y���@�n���t���n���E�����"L�����J�����=��eB����A��U��"H�����JU�)y��{�!{s���7(�"/U��"H�����?NA@Bn_��g_�3
	�]�w������*�-BD�.\�}q
��VOO��'�L����|x�����b�U��]�<{r
RW��(�L[������A%�"�/~��ZdA�����W� ,k�S�vsq�t�E~g�_Q�E~��_�ryv����(��z�����X�<���k�J�U_�:����H�.\�=aA*]/���kd��^D�w�Z��*�u� ��g/FAX�J����2Ph����7(�"��9Z}:��g�����Bz���@
-X"�3��p������l�$�go���RY���I{ �,��x�����b
]da:�py�n^\.�3|�����sa*����A��/U�)Z�,t������\P���u|���<��V���Wh�����-��]�<�0/.��Zd��f$�}��������@��T�?n��A����yq��1��bxr���n���7(���*�PWrv���:�4Ph�����y �x�"�3���9���"���������/�������2���]�w�����W1���Ig���uBi�P7�bxr���3��x��������"hc'\��4~��B5�%�'��LL����������*��hRE��py���E��n1<9dbj����A�U�W1�*��F������/�i�����@����	�A��~���"�
6>O�s|�_$��P�@�3�3�C�w^�}��*��:�S����$�t9�M������~����@��T�?n�Y�F*�����n#=���Z�D~g�
���}����"��mM��������9<��*B=�"�E�����"k�[�7�Y�r�E����&�L���7��[���O�a��OM���<G6~�y G��H�+RW����A�U�W1�*��)O�s�Y3��1<#y��CLC�w������)�+����U�7�Y��V1<U#y��L����7(�����)���H]m���EV���&��f$�������A��U��"�-8�G�7�Y�A�����������!�;�QKg��>�t�2u��������������������A�U�W1�*���c�s�����!��a$��	�"�3���^_�C/��7!yn�/������i3�g��y�EoPx��UL1��Z�w!y�����c��n$����C�w���*���b��P:!y��������a$���3M�w��p��*�h���q��%�f&��bx:����Mv������[���O�a��hI>���J3rO1<����h�����(����#T33����K(�L����tuwqY���e��\�.b�(S�"%]�[H�.�4������]��E-"�;�Q��E��:�Q����o���J3���S���2#~����($Oo������P��F���4do�����9dF��M�w^��a�Mx 7������/�ZF_G��G\L�LC��7��x��|�m.�3c����M��g$�o��=�������Z��rs��;�_.�N���m���4��a-���oP�E�rs����W��-�����<7��,�I�����u��T1���,D����ss	�9����6��,H��D~g�
-X���������6��_��U1:dA������F�	���?���
	��pyn.����E�x�<�9�7��x��b��b
�����M�<7�PZP����x�<�}�i���7(���*�XE��	���J��o]���Y�f,�;oP�M�KS��-L.��%��S�
1:di�ED~g�
O4��9&dK���ss	�}i����<���7��x��_�dK���ss	����M���Yj��x��-r�����E�T-\��K(-��V�.�'���L����7(�"��)Z����M�<7�PZ�T}���y +rRo"�3���^_�CoE^�M�<7�PZ��z;���<�9�7��x��-����EP4�&\��K(���g�%�'���L]����(��3_�>�(�c.��%�V������@]����������"��<�^��7���\BiE������@�L��]�w^����W1���"�z�<%��%�V$���M����
��~��5q�T1���V����"��q���"�sx
�AU�z�EoP41���6G�������o�/R�*����x�B-"�;oP�E|s�Hc-r��f1��Y�2�g�h/"�;oP�A����A���}}J��K(�� �%PN�D>�E~g�%�}�v�V����"
��{~J��K(m��g{�j���V��x�����b�U�-h)U�7�i�&�1<#y6d��E~g�
���b�A��{]�}3~��r*�*��j$��P�����k�Jx_�:��P��>���HC��{�S�����""�3��(�"?U��[$�9�}3~��l�{�S3�gc�����Fau�W1���������JJo�����..�����=E�R��(SW��<]BiC6�}��i�����]�w�Z��*�u��x�}��K(m�&�obx�����Mv����(�����#��!#����%�6d��w1<����h�*�;�Q��x��9���P�����%�6��bx�����w��x��<��*^��Z�P�B�t	���ZDO��..j��x��C��b���������K(��&��bx:�����*�;oP�E|s�SW/!y������KO��<;���"�3���|s$tt�~����J;
C�o1<�F��L��_�6cG��3��:�g:�g�B���_�7���GH���<;
g<D~g�
[�|SX�:���y������-P�����x��-�R�-��C�<�P��|},�@�g�@�j����F-t/��X���4���y�����"G�������oPt�y�b��f���.��%�w�O��p��b���x���h^����@~�C�<�P:P�������<���"�3��W_��Hf-r��f���"G���@����"�3��W_��HA��py.�t��)bxr�Q��G�w���.�RE��E��,\��K((���bxr�QY�<_N�Z��*�u� ��!\��K(��r41<9�@��C�w�����W1���Ig��y����N�]O�9�t&�;oPx����c����}���J��>(��bx��@�UD�w�������@]�z����J�Pk1<id�P�����n_�-�tH��<tB�
ef���2Ph.�;�Q�������������y���@�
�.�'��j|��x��������)Z�Ig��y���@�U����@
u����A���b�
����y���/:ju�bx��@����7(<��*�-RX��S'�~�*k1<id��^D�w^�~��*�f.�C'�
��%�'��j��x�����b�U}��.�C'�
��-�'��z�����n_�-����#$O�P��P��)�U��	�A���KslWQ*��,��m�E�OB���x�*�����p��*�h����r���L����3}�H�:�u������H�\���?l�-��)y�:�4Ph�J�@�sA��=E~g�
���b�A��s}J��N(
Z��M���� ��)�;oPT��b
~Y��q�"��eZ�;�sx
�A�����7(jx�bL�"H]=K�m7-���gyO�7(�]���7(jL|��N�"��x�[�7�YPf�Y��T������S�w�EZ���O�a��3�g}J�g5~���*��j$�"�"�3�E��/U�)Z��g{J�g3~���tMO�H�_��~��n_�-�t�.$�v�A��.��n$��T:��x��-����E��?��<���$dL<����<��V��x��-����E������9�k��lbx�����t&�;oPx����b��k!yn�/��t���i3�gBv�S�w��x�����?lt������HBg��]O��<S�D~g�
=�!�M�
t��`���Q�bx:��=�D~g�5�`�VQ���<O!y�/���y�������g����F1A���i���`��2E7"��y���Z\��E~g�
�E|m�����.!y^�/�������e$��O��x��-r�����E�����y�HB6����m$��l�����AU�z>��OzG�n�l�7�	�3^�C\L��F������A������A��/l
'uB�w����y9��Y�9_���.�R�����_^L���� ���PO��r��d/��x��C�KS�+z�q	������.�E���y9��>���oP�E|s�z�q	���aEZ��?u����i"�3��~p�\���?ld�����FAX���S�vwq��%�;oPx���s�3���*FAX3Z���rE�����A��U��"�m�%\�W1
���#�*�C��\Qx�%�;oP�E|s�z�q	��U�����gZ���@���|����UW_��B]]Q�%\�W3/.W�Squ1<9���3M�w��
n��?��-�l��py^=�A�����<�+��/��x���__�������\��y�����bxr�u�y���A��U��"�8�%\��K(]���MO��"��%�;/Q�i��y�����*��`�?�w���������<�Eb\"�3�E���T1�����f���J3
��1<9�gF�����A��UL�"hI.��%�f��bxr���~��x���E�_���{�!\��K(�L�?���\�Eb\"�3���^_�CoF���py^.�4�������@f�I}�����F���\~g��$^.��$2{qr���y sF�(�;�Q���2����?�w����%�f����<���TE��_$�E���T1�;�\Y�\���HF'��#PF��������k��U������{yJ��K(����)P����ED~g�5
���9������O��v	���I�@9���y�E�Q�"��1�*��f�k���E2����9<���^D�w���^�W1�^�\�s���E
z�q��xx��������.�R��HA/N�|���\�!�.�@��,	��~��T�-r�����E����<%��%����������$�`����n_�-�����<o�PZ��W1<U#y�����/x�B;�VEU�M�
t��`S���\���Zu�g����F!_��� ��;�C��,O�)H������*F����F<��*�C���_^�!$O�PZ�?��4>���K�w���_���)�"����K(--�CO�H��i�"�3��u_E��E���	��%���obx���YPJ�-�;oP��KS��)������%�tr����������[�w���t���C:c/N!y����^�b<<��9��%�;oPX�U����"��<]Bih�:�xx��~��%�;oPx�UL1��Z�O!y������z_bx:/wq��%�;�Q6�*�)��������J+��/1<]���h�����(�t�Bt����@7����`*:$q�bx����t"�3���^_�Co]���Q.O�PZ���P��oP���7���9��*�-���|�<�/�Fe��Ky���f�����o�A��U��"����y�<�/�F�")=Q�Yj�g~�7��2m_�Co-hI~�<�/�Au���=�������h���x�����?l��Z��������i�!P�Yj�g~�7��V�"��)L��y�<�/�A�U$�2���������7(�"��9Z�������j�R�(���m{����x��-����E�����ty~_`�B�*�'��l�"���o�A��UL�"��Z�����l4<51<9�g#f�/T~�H3cG[>�E�_�����6vO���6(��ibxr.���y�w~�5*��U�����Z���%���Z����y [B��g~�7^�V�"��9>�V�"CH�.���hg<���<�mE��g~�7��m_����T�MH�.��e������<��i����o�A�k����ly�n�l
'u+�Ev1<9d+�E����x����������ohc���%���ZDO��*j�g~�7��p��*�h��4��<]Bik�E1<9dcB�3��oPx��U���w�"��<]BicB�)�'��l�t����n��x�U���0����K(mL�����<��	����\n�x�UL��t&U�B�t	���������3��~���=-�Eli
{sO���-$O�P��tv���y {"-�|�_�6cG����b��#C��yJ��K(�H�Z>�@��#�gy�w~�
��y�b�s4�Y���<�P����,C����k��_$�E4/U���)d�XR���E:It�B=���z�<�;��U���WQ�x�T��Yq��_�#��>���j�g~�7^�^Elm�U�Y�z��f�"��U$�H����~����H�\���?l�g-�)y..��w�"�@����U��������4��9���@���<�P�z�1<��.nG��_$��(�"?U��[d|��\��o�/2>h��bx�F��"���o�AQu���)������%q��_d,h�������94_?�;���W_�����v��f1	�K�S3��Hh�z�w~�
������"	�!��<]B�`�x�S7��`��3��oP���KS�LB�t	�#�m���0��`B�3��oP�A����A���MH�.�t c����i3��@�������7(jo~�b
{���Ev!y�������.���H��g~�7��p��*&i�A8���Jr1<F�
��3����-�S��E��s9���J�@.��#y��������7��[���O�a�t��v
��%����bx:��9�f|	������R���S�/!y����T�KO��<��>L3��_��[�W1A��?�L��<uBi��s������2��~��:v��*�-�T�$\��N(
TE�����2P���u�5
��}3����A��I�<�N(
j��)y&��j��x���f_����g�9�}+�EP2@Zn�r�4�&�D~g�
j�9���"�+���3���@�nL�@�gZf-���oPT�����"hI.��J�PH:K�S�L�(�L���7(t�2�������/�JLL�)y&���B�O}��s��A�����9���6����S�.��sxJ���� ]$����n_�-�|X�\��aA�H�bx��@��_�w^�pb��b�b�Y�."\�I'�
m���2P�ED~g�5*Q��W������ZD�<�N(
j�&�'��k�����k��[�V���"L.��J��i]O�����="�3��(�"?U��[��"���tBi���5�x8��� cb���7(<��*��D��ZDH����\�11mbxF�\�11����^E|s�"�}.����:a�61<mF�\�Q*����^E|s�"�
���3���@��w��n$�e����1oP�M��b�7�����3���@�����a$�������A��UL�"�Ig���tBi��*r���4�gB��H"�3��(�"?U��[�Ig���N�IL:���t}��E;,��x�����b�,1�L�<�e�"�Ig���21�L�w^�V���*�9V�g	�g��_$1��-�'��LL����7(���*�XE���~��y�HBz��yO�7��PO�H�5���x��2�k�T��n]��o��P8��<���TC��_$�E���*���:���E�7�I�L����S�
-X"�3��[�W1I��%9]���HB������H�	}�z���7��[���O�a� �z]�����H��EN�2�g��ED~g�
�&�T��h����)y���E2��y('y"�x���7(z����2E��/�����f�"+2���9<��P�����n_�-�"U|�I�7�Y�A������sE��*�;oP�E|s�R��z���\���q�S5������"�3�������"(~rmO�sm�/�&�"bxjF�\��r���7(�"��9ZdE{�.$�n�"+2��]O�H�+
g\E~g�
�
�/UL!���"CH���EV�]�u��i�seB����+
��OU��aR�&$�a�"kE���6#y�L����7(�]�U��]��Ev!yn�/���F���v#y�
�ED~g�
���b�a��.$���E�����v#y�L]���7(,��*��W��B�<�_dE�����a$�}5z���7(��U��a��)$���E2����N#y�j���Wh�����-�?hI���y�E�.r���2�gf�����+
��OU��Y�*r��%�f&y�bx�����J'�;�Q���������?��SH�.�4#=��1%PF��� �s��#fnL�U�aL�Hd����]BiFm��(�LCL���7(���T1���+j���.�4#	&/�@�gJ��"�3��(�"?U��[�e���.�4#�"�����2���,�;�Q�(��2�����Ry}
��93����7c
GnF�{Y�w��������T�8�[�����3�����K9?%��<�������AQu���)���,EY�<�K(-���[��� L���7(�����;�����s��7�������G�
�"�3.�A����4�����@�<�K(-�lh�bxr���)Y�w^�
���*�{�B$�,\��%���41<9dA�\Y�w^��.b��C)M����]BiA�r���@������kTG���.��`���`s�
�|bbxr��>��E~g�
*��v��������'f���.���"bxr��A-"�;��-�S��E*2d���.��~�r���@V�u�E~g�
���)���G�pyf�PZ�"����"�A���7(�"��9Z$�UD�<�K(�	��!�'������E~g�
?h|s<hV�"B�t	��I0�������e��x�����b�U��o��3����Y����y +S{D~g�
��x�b�C��Y���]Bie>�KO�Y�5E�w���ks_���+J�����]Bimhg|���y +:�E~g�5�Sc���OaL���S���%��^�9<��B=�"���A[�W1�h�C��#����T����<���j��x�j�"������i�RT�S�7�i�RT�[�����tVD~g�_Q�E�_���:�T�S�,.���#;%e$���KE�w���.�R��HC���>%��J���:�H�
IgE�w���k��*�x���?��,����4$�����Q��TD~g�_Q�E~��_���/e���E��JyO��($���x�����b�U����}3�����K�S1�gC_j,"�3��W_��r����<�K(m�uV����<J)*"�3��[�W1G�4�����Y\BiC�������74<����k��]~g�q����7�Q R�bx�F���hc�������u�����<_�����"��!���\�hm���7(����)^����CH�.�t,h����i�s�,�"�;�Q���e����	O���)�����Y61<m�������F�,��A��wlp�l��@����i�b$�����kT���ly��x�K�CH�.�t�,�r������������A������83�_�92�FAO�S����*F�4��x���U_��Ut��\B�t	��I��/#y���"�;oP4���)�
f/��<]B�@m�%���H��Ig"�3��[���O�a�t�"��<]B���En1�F��YE~g�
j ���V]~�(��������Y?�����6X�<������T1�^�<�pyV�P�����Y��g��@�z���7(���R���� 
B.��J�P�PZ�S���(�""�3�E�=Ux ����(�����)�J���<��@*#�s��A�U�W1�*���)�[1+k�[�NsqW�3�"�3��[���O�a� �j.��J��=���\\�W��x�����*�)Z��U�<�N(
Z�������U$��Z��*�u���.��J�v�UO�����A#�;oP4���2E��3�U�<�N(�B�����I{ ��F���Wh�����-�X�\��U�"��Z���3P�ED~g�
oW}slW���
�g�	��B��.�'���B1!W�w���*���caR�pyV�P��� #pbxF�\�M�����^E|S�"2W���:����R71<mF�\�a�*�;oP�
d��������`S����]O��<�9�"�3��'_������<uBi�P�bx���� �q���7(��UL�Y�gp�pyV�P(��bx:���0uU�w�������B]]��*\�U'�

O��N#y.m{D~g�
����)��y��py���E��Z���e$��T���Wh�����-��j������,�s\o1<�F�\�#�������@��T��n�����������y���7��PO�H�5
���*�-�T��9�}3~����s��..y�5��x��E�_���������<�b�"_�!�!PN��E�~���7�T�gh��T����o�/�������x����^�p���b����g�����}3~��<�m}O�7(������~��*�x�$�9ny���E����oPh�*�;oP�E|s�
�m����Er[���<r����A��~���"H�n�)y�b�")��&��b$�TPU"�3�E���*�PWSA��)y�j�"	%:�*��j$�TY�<�"�7(�"��9Z��iE�7�I�&�����<RW����A���W1�D���.$�f1�I�]O�H�	�4��x��f��*�0$����<���$��
1<u#y&�
�&�;oP
��������O{�s���/#����<W���������T1�wuE�m��f�"+Jh��6#y����D~g�_Q�E~��_�r��]H���Z����v#y����D~g�
�E|S�EVd(m��<w�Y���bx:������M�w���k<_���V�C�B�<�_dE_io��N#y���M�w���^�W1�^�I���<O�Yk1<�F�\�J'�;oPx�U��� �g���y���<����e$���t"�3��[�W1G�0����e�"kC��-���H�+S�D~g�5�msW�Cv����_dEn��yJ��y W��u��x���KS�+��S.��q
R����<��@�OB��|x��C�KS���]�<�K(�H��i(�L��K�E~g�
j�-r�����E�t�����������.�2������E~g�_Q�E~��_�rv���.�4#�`_w�2���y���7(�y�b
�HFn�.\��%��mW�S����3������~��*�x��c�]�<�K(�����<���<�}j�����k6&�*�0&f$yv���.�4#��W1<9dF��]�w�������)����9�}3/.se-"�'������E~g�
oW}slW�����������}�&�'���
=hD~g�5���U�9Z}���gw	���]O����+�;oP��KS���L�.��J3:�����2���.�;oP���RE��E��N�<�K(-L����<��i�"�3��[�W1E����gw	�yW�.�'��,z�����o��?��-���w���.����}���@�]�"�3��(�"?U��[��v���.����Z�CO�YV�"���7(��R�����3~y1��������j�O1<9dA6�.�;oPx�U��� #p.��JS�/1<9dAQ�]�w���*���c)�E���J���[O�Y�M�������*�����gw	���U����@���x��-����E��x|���p	�y��g(#y��Z��	�A���Ks�E:j����f�"��Y��S�5j,�����p��*�hdoi���E

C�9<^�*�
"�3��[�W1E�������\?���HE��sx
�F�h
��x��oz_���MoER�XOq��_�.�En�2�gEB����7(���*�XE�T=�S�.��&����@��"{����7(jL|�b
cbE��Q���p	�%:�"��b$����C�w��p��*�h��V���}3~��������fwqB=�"�����"��2�^��G[�}3~��������wq�|-�;�Q��V��9�jU�*>�%����T���.��v���,��x��E�_��_�Z���<]Bimh������Y�f,�;oP4����)R�jCc���K(��Zc��i��"'�O�H�
���}�b�7�E��MH���E*S�71<mN�D��C�w���*���ca��.$O�P�>hg���i7�g����~����@��T�?n����]H�.�����q��i7�gC�"�3��[���O�e������K(m(�cbx:����#w������@��T��n�;N!y�����y�)���H��	�"�3��W_������<]BiC���.#y6��"�3�El�T1������[H�.��1!���m$��r*����A��U��"���&\��%�6�S�}����<�
E�n"�3�E[���9Z%ql����������-�@�g7��x��-r�����E:j���\Bi��E.�r�4d��D~g�
���y�b�w4
�Gl�������$�-���i���s��D�5�*^��Z�#�s.��%�v����O�ss��A;,��x�Z���W�La)��a�pyn.��#�������<�yW7��x�Bc������P�����������9dG!����A��1���\~�(�"��M���+k1<9dG��M�w��P����;{��E���lhG������4�^X�<_N�������c�G1�pyn.��#������<��-7��x����b���I���������[���@���z���A���W1���tH���\BiG��m���y ;S�D~g�
�_�����;k!y����T�M�����a�M�w��x�\���?ldL���ss	���ZD���9� (�;oPx�UL1�t\.��%�&y�b<t���y���+
��OU��A.�M�<7�P:�r;���<�y 7��x��-����E���6���\B�@��)�'���n�����k���^[�:��;�~,\��K(L]����<��I�"�3���^_�C�`��pyn.�t��_bxr���}o"�3���"��)�"�����ss	���o1<9���5�vK�#Wr����d4 �Cw�	\�dc����C����UU������vU[
wd&<}!�i6��+�v���[z}x���'(y��U�1�Hn�u�'K(��J���:��1J��� ���%-��AU�M�;�z7�,�g��\�~x��(����w�������1&���V7��F1U��������	�J��/bx���&5��T��G��"�g8i1wp��#�PQB����Z�w�f�E�}c�H?5��^�\qB����@-lq����ix�R'��*�-"��k����E$�n
��dx���4��ix�R��9���"��s�\�����������%mX ����(�E^���[D3��[%-"���&0��,����
�;
OPj2�Iy�	Z�4p�i���5��)5��Q:�@~��	Jo�v��olI�^s/y�8���J�.����W��Ij��ix�R#hN�HC�H�Z��'����]70<��w��ZA~��	JZ�
A��i(y��6��5k��O5�����+��4<A���W1�u�D�H�8�����!0<-D���;,��ix���tF��CHg���~]���J
%4+���-�$���N�c�����A�wj���-�����!=Z���n�b�����'(Y:�U�1��t�l@��	�T�Zd��F$�Y��_A~��	J��U�q/"�2���'�>PEj�O;�<g�wCW��ix��^�Yq~���k����� �&�*��h��\NH�mP�P
�$]��8����^�X0ZDt��^��7�!��A���N[`�R���:�����gH;�$���E���������U��6��ix��_��U�!�'�$���6Vq�P;@�S�Ij��;
�QAm^E�E�7N6���f� ��%�P�����
�w��T��In��"h6���f� 8����z�scH'=1�@~��	Jn^�-"�Ypyn�(Nz�f����1��"h6��ix�RoWO��vU�6���<Q\�n�P��$	f���?E)-r\���m�
�<�@4'����P��$=k���'(��xR��D'E�l���E� H/�lO��'�A~��	J�ExC�"^RZ7���"Q�$n	O�����
�w���g4'U�����W�<�D\z�}�-���y ����@~��OQB��T�g�������s�����R�0<1�����;
�Z��*>�E4��<�B��y)u{+`xb.O�3
�w���{^��"R�\�[��E�3����y �&��N�����*��E���
�<��<��������y ��I���N�����*��E�7N6������k��
�'����/�m ���%?��U��Kn�
�<���q��t�m`xbH/�m ����(�E^���[�H[2pyny��Kn�m��@z)�|���'�*�H���7������������O���5��w���RD�c�)�}>���H��
�����<�[���N�����IC�$f�E��sk�/�_j�0<1d��6��ix�R
�'U�1ZD+�	H����%T?<��`��w��TK�ICX���������� ��PD������N��,��q��olI���^��g�	�k���jc���t;��4<FE�Ehq������%��%������U��J��4<A�C�IC�Az�}�	\7�	����~x2<AI-�;
OPr��*�hI������E�$����OPR���N���"��1ZD���=N���H����O�'(�E@~��	Jn^�-"��{��u#~�8i-��H$�8I-�;
�RZd�����H��{�%��%�F���'0<%"yF�����N��*��T1�t%c��{�sg	�Q2&�O�H�QS{@~��	J���T1�w5J�����%�F�]������3jj��4<A����*��EM��@�d	�Q��*�*�<����N��|��*�8h����@�d	�Qr��*�<c��w����U^���Rz����%�F�7
�O�<���;��4<AI��
A����;8Y�!|Qr�+�V"yF����w�����
�,�3y��6��U�3m��F$�X�3
�w�����W1�DS�S{�'K(��k�����H�IS�@~��	J�]�Uq��4r�'K(M�o�
O;�<�dp�AB��	J�ExC�"Iz�~o@�d�IJ����<�����R����Y~g�l�d���IR��~��� �g��U��ix�RN��<�,�3�B._�16,�g���K��y ��3|
�w�u���X�g_��l�
�<K(MR�f�{��1d�^�n ����~�O���-Y�py6�P�$�[s����2I9�
�w����U��"���������$���������@~��	*�-r\����py6�P�$�[�
��2I�j���'(y�U���H�\��%�&)T����2I��
�w���I���1&QI�l���XBi�������<�Yz����N����y��On�,��N.��J�,�"	O��5��w���]�W1�.�5��<K(��$����<�9J���4<A�-���E$KQ.��J�d)jO����	�w����"�����E��	h���XBi�~&�0<1d�����4<A����*���f)]��gc	��HgZ��@f�/�@~��	Jn^�-"�Epy6�P���i��@�I�����'(Y�U��m<.��J��i+����H~��;
OP���b�{�2K�py6�PZ�����'��,�_���N�����*��E���py6�PZ��"`xb�"�L@���'(y��U1�M.��J���\����<�EJ�o ���%��b����py6�PZ4�����y �fq���?E	-�R��"�t\��%�M:;���\�Ez��/r��C7�*�0�\���%��	O��Y$�����'(y�U���Hf�c�%��%�)���@��HY���4<A�C�Ic�5I��K�K(-�H����Y�_�<@~��	JUWO�B]��y����T)K�p��dx�r������]�W1�.R�W���u#~�*�8�O�'�*�z���OQB��T�g��$V<n��u#~�*����OPR���N�cTTl�W�������u#~��9jg�+����N�����*��E�tc{��`	�5i�
O�H�U��@~��OQB��T�g��6��������I�E��<�(�A~��	J�Ex�����������FZDJ82�r �+=�=@~��OQB��T�g�����2��VI�hM�S���Jq���4<AIw��0��PE}��/X���F������4V��� ���U�|�������I.���&�>Q�������xqg��v��N�c�,��b�Ef���H�0�������BW����'(y��U�!ZD�Y��	J
��
k����J����4<A�a�'U�!ZD��7 y��RC�^d�����J���w����V��-����$O�P�DI���� �+E ������q��ol�,��$O�P�DI���}#�+��w��N��t3�� �;�(��v�`i�nt�o�
O�H�.I��;
�Q�.B�cqR��q�&�J�j`x:����`��w��`�}BH���D��H����������$��T�P�|��C����z�OP�A��OC4^y��XL�/�LNm?	���=CiU5P������������d7��l�b�E���'����Z��\`-R��6�� J����$��W�����|�	*���W��n�Q��<�LP����*dq��a���O<Ay�ExC�C� }�z��s�	*I�������nW���'��S[�V�x����>�.����a�������Z���|�1*Mj��*�4D�$�Ep�����t��x�<�>I��}~�OPUn���G��"Y���]��&(�LK`<dH��3���|�	J��z��QEz����:�E�E2��i��;�x���AC��c4�~\�����K_�)`xb.O_���;�x��^�M���������a��
�'���t����O<A�z����"�Q�����a���0<1d������|�	J~p����I��-y��B�&'mX��28i���;�x���U^��jp����s��E$uu��@/mX}~�OP����B]
^�������7N��6�
�����a���O<A��(�b�I4����s#o�� � �`xb��	�;���d�Qziq��7Di�m@���#&h|�sy�(�i
�E;�<��*�z��%7 y6��	I��<���<�!IwX��l�HYn�v���l��v�� ����
��sy������l��Qm^E�E����K��4��j("y�I����/bx�R'��*��h��@�����F�"A������QJ���c{���	J���T1�_$(!����n�/�'���'�CTTrW��EOP�.��b���"�n�/�'���`�+�i}~��Q�$��q��ol�Y���^��=��D����7����JV���������!�E���z�s��tV�"�gt�V�����:��T��h�2&p��_$zi��`x�D���c����|�	J}�{R�Oz���dN\7����s�S"�g�|�s����������!��F���9O��U�"�=d�S&�g�R����O<A�-���E�'s��u#~���S&�g�|�s�����<��*�z��"H�,�4Jo.�O�H�Q���>���'(�Exc�H��[�'K(��_��T��5���|�	Jn^�-�	��<YBi,R�,`xZ��)���>���'(Y��U!�G)f^���J�&��`xZ���$_���w>��(�E^���[$M�����%��I+60<��-������O<AU�E�����E�7�
H�,�4Ia-����H�I�2����'�%��KU|v�H^�y�'K(M�����i/lq�n��_d_J~F���M���s�'K(M�����������"
�E;�d�� ����QB7��C�����`x:�X�9�_� cGJ�DC�HCL4I�! y���$y��$��`�[%T?_���P���X~g�U:�`c�t)+���'���L�EB����	J�hN�c�)������XBi*Z���Nm)_���N��z�zR�������c	�I��:�;��t���N��j):�"��"��
\��%�f�&�|/y:���R�����'(���Uq��Y�E������<K-z��1d��E��4<A�
����"�.\��%�f����P���H�;
OP�A�����Nj��t,�4K��.���y ��Z�w���]�W1�.��.O�J��S���2K9�w���]�W1�."Jpy:�P���h����<�9J���4<A�����1nW%C�.O�J�$���'������;
�Z��*>�E��\��%�fM��`xb��	� ���%4��1M�.O�J�&�V0<1d�����4<A���b�]D���������	���2kB.��4<A����T1�{4Y���������	�+���L���;
OPr��*�h��I����XBi��n��@)����N�������!��)����c	�EJtp;���Hy�w��TK�ICX������c	�ES����H�f�;
OPz��}c�h�8py:�PZ$��k`xb.�"9r��4<A�-���E4U�<K(-A:�0<1d����w���g4��2F�(c�����J�����~x2<AE	��EOPj��T1F�$����\7�)Rz�������$T�1<A�-���E��"�n�/R$U�����Y�$�z���	*�-r\��[�h���<=K(-R2�w
���Y�r��A~��	J
�>�b���"������g	�U���~("yV�&�A~��	Jn^�-R��\�n������~x2<FI6Y�;
OPr��*�h�Yj���u#~�*�d}��'�c�$z��ix�R��*���b�����T)��'0<%"yVI]� ����Jg'U!�UI]�i���E��9�	O�H�URW=��4�)Ji���G��"R������YBi�$O������Y��"�_���(�E^���[D�<�<YBi�<�����d���m��4<F%5��W�������W y���*E��
����J�= ����:�O��_5uu�'K(������i!�g��d=��4<A�<�b�jR�$O�PZ�t��`xZ��Y�t���N�T�[�]��;[D:�W y������+�V&yJi��w����U��"R^�����J�?LR^�����A��P���;
OP�K'U���?������'�J��v0<��,��&�A~��	J~���C������<qB���1����9��N�	���'(Y]�U�!Z�i1���J
%����v���~c���N���"�����E�He�'�J:�0<[\�L ���d��V�!ZD�7��8��PQBm����lX�w��T����:D�HO3py�Pj� �*@�3-j-�����(I��p~��T�_����FI���<�cg���@~��1*��"��<��H�����S$!7�^��i(�A~��	J��N��C�������)���P�,�����ix���4�����U���6�m�,��C��b������w��Tu���4�u�v���(��9O�i�$�����%4��!�Y����(�$y��'��4�t���N�����*��E$�3�g�	��$y��C��4��" ���%�"��1v���3d��r�T��'��4��" ������q���l��.�P���Y�����B$�YJ ���%4��1M�.�P���Y
!���H�s�&��ix�R��;�"�"R�B.�P���9Kg����H��d�
 ���%4��1)�7�gX���Y��
+�V"y�R4o���'(���U�q�H���<N(}��h�����y g)�7��N���:;�b���I���pB���;�
O��$�j���'(�E�}_�8����3��/�4!w��@:��@~��	J~B���	���ypy�F�"N����'��tNk�i����U��"�T
\��G�s�m��'��tRxD���?E	-�R��"^���	H���8I�S?<������"��(9<�W�h���H���E����y���H��/bx��r��}c��YZ�^��3q�8��������r�E��ix��[�W1F��IZ�^����E���G��<]�Z�������U��"�*}���E\���OPIB�~��qRE�E����u#~W����O�'(���w���g4'U�����I�y��F�"�J�=q(&yV�L���'�(��q��ol��c/y�H�"^
��O�H�^�#��4<A�-���E�$���K�19�"R7&0<%"yz���"��4<A��Z�T1��V^�cN�����~/f0<e"yz�IA~��	J�O�B��RxD,@���/�%>0<"yzI�� ���%�"��1v)�9V y��RxD�`x�[\�L���'(Y�U��� m�H���E���x������KA��w����/|��-"�G�H���x�0<-D��RPt���'(Y:�U�1ZD��V y��/��$����i%���r*"��4<A�-���E4~��J�"^�70<mD��Rzs���'(���U�q�H�q�'K(�Rzs������k<��4�)Jh�������o;�<YB������I���;
�RZ�]���������J����
O�H�a�n{@~��	Jn^�-&iK>���J�����"y�Yk�9���U^��j���ry��� 9���K��y �$�'��ix�R���*�PW�$�'��L,�4�$�z�31d�RS��4<A��ICL4Ar�'��L,�4H��z�31d���;
�Q��W1�>H|.��J�$�'?;�$>��N�cT�[�]���py&�P��";@�lq����?E	-�R��"�>�gb	�!y	��@I�O �����G�T��h��.��J��K�)��Sb� eR'��ix��[�W1F�H4	�<K(
�����2HZ���'(U:;�b�L�py&�P������<�A���4�)Ji���G��"��'&��L,�4NZ����y ���O ����>�;�b��xQ�py&�P%>0<1d���;
OP�.��b��\��%�FM��`xb��	� ���%��b��x��L,�4:iY���<�Q��A~��	Jn^�-"�|b.��J����`xb�(��$��ix�R���T1���(��$��L,�4�E���<�QJMI ���%?��U��7j�8py&�P5U|��@FM3���'(�Exc�����gb	�Q�O;��2J?��@~��1*������C�No���
\��%�F)�=50<1d�4c��i�S��"/U��-"�'��L,�4J�����@FM3���'(�Exc�����gb	�Q
f���2J���w����x��4F�i1{�3���$��f�v�"�g�4��;
OP�.rR��H�ra��K��%�&)&�@�3I�)�w���]���!v�$��d�u#~��&	�O�'(�L���'(�1�IC<�K�-={���Z�J�~x2<FI|���'(�Exc��dK�����E�$��0�<�$�g��ix��r�>����z�3����iE$�����'(�Exc��$���K��%�&)�$G0<E"y���H�1<A�-���E�`���n�/��`��������$'u���'(�pR�f�$y�s����H�rar�S&�g����w����x'U�/Ia-�L���H�T�\��T����(��;
OPr��*�hM/@�d	�I�2�O�H�YrRg��ix����/|�}-�'�����%�f)K<W0<��-�tg�;
�Q��"��y���]d�'K(������i!�g��\��ix��^�M���y�'K(������i
lq�]�w��_��U���Y
���<YBi���
O��WR�@~��	J��9�b���-y�'K(�A��O�<s�6,��ix�����!�Y��;�<YBi�Z���i'�g��3��4<A�-���E�S���%�f�I���<s�Z�E;����*�h)�;@�d	�Y
���"yfM����'(�^�W1���$U��d	�Y
�(S/y���%I�~�6<A���Ic�"E9h
py�P�%U����Y�2K���;
OPj��ICd�e��\������"��e>��iE�) �����/|�}-R$U��ga	�ER�����iE�) �����EN��/R�|�\��%�)_��
P�Y�|��;
OPr��*�hI�/��YXBi�~a��^�,�Y${s���'(�RtR���"����,,��H�x���T��H���w����x'U���E�nDA(R�vI`xb�"i��w�����W1�A#��py�PZ���$0<1dI�.�;
OPr��*�h)
��ga	�E�7��'��,�f\@~��	J��T1���H��\��%�M�-`xb���� ����(�E^���[�H�?py�PZ���R���<�EJo. ���%Kg��1�3�s\������"�|bY���<�USWA~��	J�ExC�"USW������:K���'�����
�;
OP�.��B���"��YXBiu
O�Y�4���N��<��*��h�d(-��YXBi��A����y ���, ���%�"��1v)��ga	�5H-����y ��P@~��	J�Exc�"��\��%�VM�j`xb�*��^@~��	J�]�U�q����'K(�������<�U�@��ix��^����,��YXBi���O�Y���
�;
OP�.��B��Y�^��,��J�:U�"�g�^f� ������-�b��"�t����u#~�*Ig���G�P�t�&'�z���	Jn^�-b�2�T7���"�����QR�k���'(�/rR��E����n����P�P�,�dL� ���%�"��1v��X}/yV�Pj(�Ev�Z��J�j���?E	-�R��"R2@
��YqB���3-,U��J�= �����U�1ZD
��1���H�H�������J-�;
�QQ��U�i��^��������^��	O����Z�w���"��4F�H!�5���"��f0<��-n�P�_����9.|��-"����K�'�Jk0<��-��" ����&�TQ�h���j�'N(5�t�0<�JW�x� ���U��UZE�v�JM�'N(5�t/R��T���	� ���5��*�bC]�'IY���J
%���"y��1���N������8D�H����'�>PRj]����s�~����N���/rRE�E4�s�'N(}�4�s��J$�YA~��	J��m@����@)��������I��6"y�� �;
OP���b�{�����'�J��v0<�D�����+��4<A�OzyC<�����k�'N(5��"
O�H��d�� ���%�"��1v�\ y6���������H��d�� ����(�E^���[$K��$���Ef�
�e�����f	����'(Y]�U�����x.�eb
���.�P�L�~�k���'(u�=�b��WJX��s��� ��.�P�L����ix�R'��*��D��%��2����P���0�����4<A��IC4Nz].���I6������<�N��\@~��1�����
7������py.�(�I_��K��@:�W���ix��"'��\���B��1_;/�iq�I<�N�!��w��f���}�u�b��\"Q\�ZO��$uu���'(���������<�D\:)�`I`xbH'����4<A��IC�.I�py.�<Mt��t�`xbH'�-��ix�R�N�C��&y�����K�����@�,����N�cT��Ehe�{�"�������i�g��@:M���?E)-r\���<��s�����$�
�C��t�1- ���%Kg��!�3�I����,����$�O��'�E����'(�Exc��,�������^��.+���K6��w�����W1�D�%#�\��J�8��Mv����\��K-�;
OP��*�b��U/���\6������O���_GZ@~��OQB��T�g��&U��������O�����w���{^��"R��\�K#~/��.
O��5��w��dK�bK��b��\��xM?���<�^r�. ���%[�xCX���9^' y�/�%��:����	�K��/bx�R_�<�b�6������[e-R%T?<�$�x���'(�I�IC<���*��
\7����*��	����%�x���'� �H���7�H�Z�����J}�Zd("yI3^A~��	J>hxC4AR�W�K�+K(
�*������h��w�%��KU|v�H�"�n�/$~
��dx��n{@~��1��-B�pc��$�����F�"A�7���OP���;
OP�tvR��Y��f�����E����	O�H�A
�XA~��	Jo���G��"���z�se	�A
�X��<��sn+��4<A��hN��M��5����J�$��O�H�AJ^A~��	J�O�B��-}-@�d	�AJ^�
�<�����N���"��1ZD���H�,�4H�������3H���w�%��KU|v�H9��$O�P��u��B$� �6�
�;
OP�c��*�x����u�'K(
U�0<-L��~o���'(y�U���H��
$O�P'�EV0<�D����"�_��%���!�8I���<YBi�r*�
O�<����N�����*��E�,���@�d	�Q�m�u��N$�(9�W��ix�����!�Q��<YBit������f�����;
�Q^���U�!"h����$O�P%�z���5�����;
�QAo�v��ol� M��<YBi�T�O��Wi�
�w�����U���x1��b����J�dK�����&Eo ����>�;�b��x1)7vpyn,�4JQ&��K��@FI��@~��	J�O�B���-}.��%�F)(zs���1d�L���4<A�-���E�S�<7�P��������<�Q�7��ix�R��*��c�Zd��)�-}�@d��L6��ix��[d���7�����pyn,�4J�i��
��2M���;
OP�tvR��Y��pyn,�4MR�D0<1d����4<A��IC�IJ����sc	�IJ����2I��;
OP����!�I�7���XBi��-���y �$�o ���%G��*���I�����J�$�oO��$~����(Y��U�!�')�f.��%�&����'��LR���;
�Q���C�ORZ�\�K(M�~�`xb��i��8i�S��"/U��-"}�����4���@&M����?E	-�R��"I��.��%�&�l��`xb�$��7��i�S��"/U��-"��l�����������@&M����'('��q��ol�ipyn,�4i�����<�I2�o ���%�"��1v�*�C���J����`xb��i� ����'y�aU�~�}-����������i�
O�����
�w��dK�bKQ��f���J����v���y ����@~��	J~���Hc���}�' y���,���>����	�K��/bx�Ru��*��E���d�vp��_$Ki7�t�<��Xa���'(/��~��ol���>����J���d�7�"�g�|�;��4<A�-���E�7v�K�;K(�����E$����"�?E	-�R��"Q:�}���E���~x2<AU	��E�QIzyi��W������d���=����	J��@~��1J����@U�M�e��/�Z��=N`1�Xj��i�S�r�������IO3��K�;K(����G0<E&yJ�:;��4<A�-���E��{�%��%�f):hO`xJL�����w����U�"��]����H���=��)��HZ��;
OP��x'U�6�����,@�d	�E�����B$�"��w��ix�R��*���&� y���"���W0<"yM����?E)-r\���+�<YBi��
��J$�"��� �����juR��Z)P_���J�7o������Y��"�_���(�E^���[D�W y����	�+�V"yM����'(��xR�����
H�,��h�������6,��ix��xZ�|��H�,��h���}b�+mX ������U�1Z$k-$O�PZ4~������Z�w��d��A��w��R�q/o���Q����*��4��ix�R��'U�1��tj@�d	�EJ)�0<L��R�v��ix�R���<�,��w���|��r%��M�����JZ���'(��zR���*=�h���XBi��\hs/y6������@~��	J�EN�B����\��%�V�wz��%��<�U����;
�QN�Exn]��?��b����J����P;[\�E@~��1��-�_��z���gc	�U2�7���W:�@~��1JN)�U��RT��	py6�PZ���z��1�g����;
OP��{R�Co��f4��l,��JZ��x���JZ���'(u=�"��"��
\��%��$uc��@�$u#��4<A�-���E����gc	�U�[��@�,U�;
OP�A������
�<K(��K(0<1d���;
OP�.��c��
�<K(�R�M+`xb�Z�
�w��T��Ii���������R��i�n*���PZU��W����y��Om���!�xn.��J
%4���PR���N�c����!�����'N(5����`x�HCI-�;
�RZ����7���Z�<N(5����`x�HCI
��4<A�-���E��\�
'�J�E60<a��$��w��|^E�����py6�Pj(i�����=���Z�w���"��4F�H��\�
'�Jj��'��4�t/�;
OP�t���C��don���pB���9���=���Z�w�d�1������E���J
%I���������w����/|��-"I���K�N(5T�P@-lq����"���Y��U�#|�������u;
A	�O�'�,�z���	JzO�b��%u�p\����,mX��OP���;
OP�3��*�-"�~~����B?�O�'(�E@~��	J�hN�b����"
\�DZDRW�0�<g)����'(�E�����E���K�N(}��t�����9K���4<A��"��1�E$#�c���N(}�$������9K6��w���;�AU{9E	��,���/l	O�H���]=@~��	J}a���8�u�N���u#~�9K-������9K?
y��N���"��1Z$k-r���Y�H�=O�H��d�=@~��	JZ��B����n<�����X��Sa�����N�����I~��&%qH���Ef�&{T0<U"y�I:�@~��	J}���
7B�8M_��Y�_�M�����iIlq�
�w�f�
�b����8�H���8)��X�x�z��R7��N�����*��E�&�o@�\�_�I��c��F$O'eR ���%����!�U�	��<7�qRN����i#���r*��ix���^E�E�{�H�;��8M���x���i<��4<A��'�b��i|��N�"NrR
O�H�NS�A~��	J��U�q/����<��8�I}`x:���$'��;
OP�.��cQ��m.�� ~�8��N�|�	*J�n�~�	J�9�b�{�����S�(�6�3@�3MQ�����<3T�[����7����?n�����*�"s(v�)��m��;�x�����W���7�I�j�.����������G��c��E��PNm^��W���<�LP�W���<��K���w>�%���*���^��]���� uc�=�y }���>�����(4��8�A�����\`��v��z�@�(�H����cT�[�V��h�$���.��T�P`xb.O��n��;�x��r��>�����]��|.0AIM��@�,
�}~�OP�����c��t/��<��Q�.����<��H�H�������y���n�*�"H��<��U�E
����Wi���;�x��'^�M�v�
$�B\�I��
�'�����}~�OPQm^��0I[r�'K(
������y ������O<A�-�.|��-��Y�<YBipZ����y ���>���'(���Uq�'4+�<YBi����
�'��^�����'���]�W1�.��]d�'K(
A�E60<1d���>���'����"�"Aj�H�,�4D�Ev0<1d��.���J�Exc�"�*���%�M�m`xb��	�
�E;�|/���^Ds�5 y����	�
O���"��46vdy�U���h��$O�P4u���@������9Jh�����)J���<YBi���y��'�T�P�_����"'U���T���<{p�6�"UB����!*NNB�~�����T1�.%���&p��_$NR��~x2<F�R����O<A�-���Ef�Evp��_$�����"�gT~�����9Jo���G��"N:�}/y�T�P@�3JB���w>����O����0��b����J�d��C("y� 4}~�OP^m^�)E1H�H���H���9����1Jr��}~�OPr��*�h�(���\7����xN`xJD��Ij�>���'(y��U1��$
����F�"1K7O�H�Qz�w��;�x�Jr��}c�di����9���X��S&�g,R����O<A�-���E4u���%��*�H�S!�g�Z��~��jo>�b{s�$�
$O�P�$C�\��T���&����;�x�*j��*���I���^���J�,
O�"y&M���;�x�R_�:�b�W����� y����Ig+�"y&/=1��;�x���9.|��-"�C?�@�d	�I��V0<�D�L�t��w>��(�E^���[$H-���%�&��8o`x����$c���w>�%�"��!t�$�H�,�4%�Ev0<�D�L�1q��_d/%���!��$�$O�P�$����������V��46vd�v�W1��j����<YBi�������H�Iz�{>�_�`cG�[�W1F�hn�H�,�4I�}��"y&�K�@~��	J�Exc�"�t������������c@�3-Ko*;��ix�R[���!Z$K��.O�J�dps�
P�L��t�@~��1��AV�
7D�U�,|�<K(��������c�,���@~��OQB��T�g��� ���c	�YR���%O�<�YR���4�)Jh�����	�.\��%�f���B/y:��������N���"��1ZD�<py:�P���P@d�A�;
OPz��>�����v���XBi�$O���<�9i-����'(U9�b]$K��������,�]��@f�K�@~��	J�Exc�"���������\��&���y ��c#�w��j�U�!�Y�\��%�f�@\��@)����N��j8�b3@����<K(-�[�U0<1d����4<Ay�E�����E��I\��%�)��U0<1d����4<A���b�]�I-\��%����0<1d�Z��'
OP�.��c���u���XBi��A����y ���@~��	J�Exc�"�����c	�E�@�
O�Y4A�w����U��"��	\��%�M�����<�Ez}���N�cT��^ZEb�-Ij��t,��$i����<�E�[:��ix��r��*�-"���.O�J��;B����y �&��N��|��*�8h4��<K(-��y���y �������'(�
�b�g4ERW�$O�PZ$C������U%u���N�c��>��U�C<���rc��	\7�����~��'�T�P�_����GsR���T����\7��^k����Y%�����'(y�U���H>�z�����*I0�mE$��3
�w����Tu�To{Nl���gi1���������"�'(���U�q�Hz�\7���;�>����	J��@~��	J}����!^��R��3�n����%�~x2<FI�{�w��T]���!t�*���c���E�$�������Js��4<F�In�v��olI:���<=K(�R��O`xJ+[\�E@~��1J6&�*�0&V)���^��,��J?�3�ra�+�a��N��<��*z�&M�,@��	���6���%OCI�= ���5�
�b��h���+�<qB����`x��-�t��;
OPj��Iy���oH�8�����0���AW�A~��	J�Exi���H�8����Z���i���J���A~��	Jn^�-"���_���J(�P�W0<��,n�Z�����d��W�h�z��'�>P����iKdq5�w���]�W1�.�	�;�<qB�%�a�w0<��,�������'(y�U���H���$O�P�@i�x�S���j�1��4<A�
�b��FJ(�
H�8���*Z�����dq��N�;
�RZd���7����@��	�������,n��w��d����"���H@.O�Pj� �z�3L������k���"'U��"��b��Qf)T3���fr���#7��N�c����pC���9��f� ��k����gp�L������4<A��}�T��hI���QfI:~(v�I���ix�Jr�>��	��\��a�~_9�PY\�����4<A�C�IC�s�n���3� �I���T%�+����ix��^�����Qf�-b?<��|���" �����"'U���I�n��"Q��		O�i(��A~��	Ju��T1���i�!py�D\:mx�`x�HCI�" ���%���*��qNk�\7���I~�����<�N��@~��OQJ��>����"�<C��E�n,`xbH'�@~��	Jn^�-�)��*yp���_C��@:)�+��N����y���n�(���g��������'��t���w��T��IC�E��	�����ib�
�'��t�/��i�S��"/U��-"�Epy���q�$�H����<�N���;
OP����c��^m��6����~�5l`xbH/��@~��OQB��T�'�����py���q������'����J�;
OP�D��b���	\�ao�E�
����y ��l@~��	Jn^�-�������x���p���y ��l@~��	J�]�Uq��5��<�A�"^���	O����P�_���$T/�)���~�`Ch�^������$����)�w��TK�ICX��$����<�L�"^�����<}�Z����������1)�?����x)�,�~x2<FIouE��ix�RoWO��vUzo-z���x��Q���'�c���E��ix��n{��"n
/��Nl�n�~& �~x�&(�L����(9��W1B�����vp��_�Ko��p�<���"��4�)Ji���G��"A�:���<c$~� ��##�<��c��w����U��"�����K�1�H�T�������$/]����(������C����w�9��F�"A�y�������4��w������*�-���e���E���
�<C�P�_�����}R��}):( y�����n�`<,D��Q*��N�cT�ZE�����\���J�&�T0<��-�4���N�c����(c��&2-@�d	�A������W�E@~��	J�hxcL4U�EV y�����"+�V"y)>��N��|/���^$N�D���%��I�E60<mD����-��N��<��*��h��]7 y���(e��O�<��nh���'(/��q��ol'=8����J�w0<�D����,��N����y���n�u�<YBi�����F$���= ���%�ExC�E��g@�d	�1J-r��� �g�\g ���%��b��\g	�<YBi�\gi�%��\�QR���4<A�&��*�0qD�6py&�P%�.�����2f�E@~��OQB��T�g�H�Z��-��v7;�� ��;
OP�.��c�$�\��%����H(v�IF��;
�Z��*>�E��"���XBi�$��W�".�$��'��i�S��"/U��-�$+X.��Jw|��<�@�Yj��i�S��"/U��-2K-\��%�&����)1d��
M ����>�9�b�g4I��K���XBi�2�R��@&II ������wR�o�%M.��JS����2I���;
OP�.��c��
��L,�4I������<�I��A~��1���"��2���d)J���XBi�~�,0<1d*����4<FU�u���C�����g	�<K(M��(U0<1d��k��ix��^�M�^�J���XBi����'����|
�;
OP�1���!��y�ZH�,�4K�Yi��@f�R�@~��	*�-�.|��-"�"���3�����+��2k�<��4<A��hxC<��R�~.��J��^J��2Kq�	�w��<��*�M��py&�P��T�����y �7�@~��1*�
�"1�dM�.��Js�n{��2'io���?E	-�R��"�	\��%�f�����'���E�F��ix�����!�Y�aJ���XBi�R���'����5%��N�c���U���R0{�z�3���\��Z�H�ER{2��4<A�-rR�-R$=+�	\7�)����~x2<FIjO���'(u�9�b���H���yp��_�H/�e�O�'�"�z���1��
��
1���L�O���H�,E�����	Jj��ix�R���T1�3�����u#~���9�H�ER�2��4<A�-�_��z�2�^��,���E�PD�,Ak��/bx��[�W1F�HoQ���u#~�"��e�`x�D�,��.��N����'U�1ZDRR���E�7���<K����"��(�m<^�o��-�����)�,g0<e"y�K�A~��	J�O�B�/��x97p��_�Hn�\�����Y$/]���?E)-�.|��-"�s�'K(-Uk0<"yV�m��;
OP�A�������x���%�VM]�`x�D����"�_��%���!�*��� y���*��e^�����J��w���"�
?F�H�`y�'K(�A�j�`xZ��Y��2��4<A�C/�b���J�i�W y�����"�V"y�(���4<A�-r\��[$J���<YBi�������H�Ur�e��ix�R�'U�����,�@�d	�U�M����i'�g���2��4<A���b]�J�i��<YBi�����F$�*��A~��	J�Exc�"R�~>���J�7�0<D�����w����U��"�[�L@�d	���o��o����_�����������_�������|����������}���������?���O���������_��]�YX����������?��Q������~���_����������_������������G�z����_��BvY�����_f�x�>���},��o����n��x����-dN����o����'����������?�����~�����K�������z���?�c����*+��~�������/y����o���2��y�de��_-��,��������=/���~��O_��������(��b�����?��/_~������J�����{S}�������;�+���,i�m����������L�{�j�������[����_�vc}�t}������IK��f�0�n6��W���j��V3������^���tg}�����g�|��>�y������K��>7��M��;�s���NK������)K���N9m�}5������r}�]�E���{���A�>f5�tc}���-w����o��>?�__��>w{}��v��W�����yv��YM7�X_��>eI�nI#uK�5�����__�������;�k����X_�����Y����wZ�W�w�i�<m���mx��6�t���O��X����]`o���Y�v}�������n�/N�������^�;-�+������/�__���r}��vwQ���}5�?m���m���=]�����w����M@���&|�{5�t�j��%���{�%}e}���������w�W��/�Y�r}���������M��������/���;��|����<����_���������/���;��|����<�����������X_{����d7mfa��W���,���%���{J�?�L�7L��Q���IK�uKq��-�!���%���O�B���}W3|�j��	Zb���I�7L�s-�����o���������
��|h��J���a�nx��i�E@���}�j���>���3���0������N�������^�;-�k�[k���B�%���{~���?����3iQ_,����D�����:��7�-'K�.,������<���K����o)�j�c��3�����7�Z&����W-^�j�������Z�������)�����6f��/���������jF���oyf]R��[�E��o9�
�_��_�h�����[~}I_S���U%:%'��h�P�����d�[�^57]�j�������G-�Ic^_���h�~]�^j���v^D)�O���7?.|�W��d�[�z�/���<^��0}�R�}��-�xm��������	*�c�M���1��<t���U[�-�Ic^_���h�~]�Uj�4��wm��N2�-���Z�p���U�?j)O�����D���J����fp���=s����iLz��������������7����(���������!}���K7+������|�t�C�ao8N����h�y_��AKy������)����%��-�1)��%���:�-����=������|�R�4��%}M���W�(��qq�o���>�f�5����W-\9���Uc^���\_�W���V�p�Bw����Y	���#8�b~���g���cnVx_^9��i_>�������w}I_S���u%J?;����?A������������]����?�j�����1�/�kJ���DI����asT|���[�:�-�I�Z����������8���O
K����o)Q�Y�/��7+Q5�g]L��_���{�W����������/�;T�����%}M�����(I~!����}��aoi�t�8x����qb���<�B_U��������7��n9���R>��OZ��n����)�����nc�����4�7+t�<��oV������Zd�[�z�/���W��?�K��M������)�����[��AP����Td�[�_�+�}������(}���dI�;�h�~]��g��/���1�������]��{���W-���'�y}I_S���u%~�#�u�ao���W��>��OZ��n����)�����nc���}	���>��[��������cti����h���������?P�����*qm���#n�G}��ccV��1�~��X��U��-�Ic^_���h�~]�AjL�
�K�wm�=���4&�jW�=�p��G-�Ic^_���������P:�-��������g-�I�\_�����kK�l���[[����	��������]������%��h���	���5%��J!~��!�"�����A��,�8�`���1�h_�+Z��^��Z>h)��z�CKl�-���7�i�ao��v�����OZJ�-��������R��m�^�Q�k��E���1O����>������QKy�����5%���%j��Gk�Q��!'�`)U6j��W��Y�_��s3����W�^���?�
�T>h)O�����5%����w�2xa��>���;����W��M�w/\��QKy�����5%z��%�C����%��6��������]�i��W�e���/����*�xm�Y���;d����{`jR-�}8��P���j�|��CX������(��Y�P������\������������/_~�?���o~���_~���g�������?=��_����?���������_��������<��_�����������������������c9�����=��}��[���?|c_�o����?}��w���������~���/���o��j�`�ko�������?��?�R%u��w��;��tXj���PI�;yi����?��bV��[*�6H_�
�����3�R����Hu%��*�H�����
r�QN+p�W�������-B�������*����Z����LP�.���B�*��w�N}�,C�
�b��&H��
2:V��$s��EV��u%�Y{�w��Y+C�Va^�V��������7��QI�jo@���UdNR�oK�"[b(�D���D1k���a�X`���Ev0'���0k���X����g���E��� ;p����j�"�"
O;�1����~P�����-�.|��-R�i����O�U�E�y*�&���x������W1�D���I�	�3$��M�=�������u�������������f���|���_���7������������o�����
��&j����������/�����/�O��?��PKu����M!FPKg��Z9 049_physical_replication_restart_lsn_backward_primary.loguxUT
�feh�heh�heh��]�\�q�{�����
�	�U�Y�������tH��p�p F��D�3[�����%�7�O+�O=
Pf��g���z+3+�X~��B����)�}
�{v_|��������7����wJah�_w_����~������}~���w������������?�����WW�?I}R��^?����Wo�������r������_\>�����wO��>�_xsu�f7���q�U}�����'��!��_�r��>x~��M2_<����;�{Q�����v7�����v����}������?���?����{|��w���)Gi5�B��������o^�����g=����������������������7��g���jwq������v�G��?����7����g?�n_�.�>�|}��}uu��������|��xy��q����������G���������O/^<��|�b�w�g��o�'/n�������������/�k��|z��������������������o�V��g������O^�zv����o�o�^��^!��h>��zrs������'7�����s���s��b��b��'_���{���>d�3�14�����4����n����qZ��=z����hp������
����/w��}���j����?��^�����~��ov������?����7�}������/�u��<�����O����u�_��x�}�s�?����?���/������W�������?��]\_�^=}����n��}�j��������?�>���}x~��{�� ���/�R�����������}��y�a�_���o�������������/��������}����/�s��?�Na]�	����8�����������w_~1��|���<����~�������;
������������������+���>��b���O~?~�����!��5�?�>^�_����������y��V�>A���|��YmBI�B�3��������C���w1�����/�y��������x�j�1�x�oo�1�'{���`�O����������W��_�~����T���WW�n�e&�/w���z�����gD?������fy��}��.�����w)�>���O�����='����[��������X�>�|���S~��ORow|����������?sJ�S�?�DS��P���������v��v��Nr1��������_��/����0z��^~���A��������������?�;�a�s��W������efG|�_�q�D���Gxw��t�/���!�O>>�������B8������������,kG�r��9}�bU��c�$�M���xd��6�U��}����xD�}	VUn<
�#�`U����<RVU^<R yl����Gy�9XU�� �G�����?j
VUn<���VU^<2�����X��+�c	VU�$�>�r�2�`U�����c�������C����Q�����x�~��h�G���J�/��T�}!��M�?*��W0_���T,_o�C�?O�L��4��h`�>E��hX�.�_8%���/0_����������}�v&������|[���77��}�g��j�|l�f�t���`�<U���X����yj�-�����6�$�-��-I ����2G�r�A����*7M]��O��=����h�?��-����������=�����x����G����~����o����yq{���w���x����o����W����_�^]���}���g�~�����G{��k3���J!K��q
VU^��@n�'��:B��������x����U�2~,[�������*����x�����U�07�C�*7��<d����A�@�q�*7����U�0��$VUn<@�w�"VUn<�|l.E���x�%�sUZ�+��L����U�2~�Y���x���t����Q�����XU���s����������XU��h$�E���x���<�U��dx^4�+�dx^5�+�J�c��T,#Kd�M�?�Yi�?���h�?F��.��`%���|l�����|�����4��a�X�$��hX>&`>�d��,2���,�
O��O�������c��!���)�����tl�^��v��XU����������?�,VU^<2~���q�*7d>6�bU������I���xD�}Y��U�$�����c
J�T�Fp�����*7���)XUy� �����t����Q��������x���������������v
�=�3�=�d��*�����^v��rC����A�^��2�c�����\����x������
��Up�����#T�� ����u�Z�N���������[���X�a�`��
%XUy� �qnQ��c�8{�$m���Y�H���k
�����Z�N��mE��b�u�O�����x��G����x�.d�����`�9ueh����N��]�?:��������P�e|��N�?�R���|_�5XU�� ��y
VU^<����E�U���n[K��r�A�c[VU�&���xDn}�����xT��0�U�p��R�*7�����r��H�XUy����R&���$yT9=d�hE���x��C�XUy�(��"�XU��H �>�U����XU����T����Gy�I���xT2~,A���x���E��Wl�_�|l�����*O�&VU^<���a���*7`<��G���x�7(�uo��F>+�7���]c�5o�a�U���4oH��
��
C��!��r��u�P4oH������h��`���^�P5o�c^Y'�G�������p��j�P����@���xCV3d<�XU���$�E���xD2?�oh�����s�*7�w8,Y���x���u�*/d���*����N
��O�I���x�^jc��r���8�`U����1�`U����%�I�
�Z�!��#��������<�*7��6	VUn<��m�%XUy�(`>��t�*7d�h[��r�A���U�2~����xT2k��r�A��)�*7�~n����?�%XUy�hd��h�G�����!������9�~,n�����
��w��VUn<2�C�?[o���4h�V4��A)j�V4��0)i�W�~���j����n�\�!e�������C���P���US��U�po�jVU^<�}i�7��dq��$)XUy��dn�o(��� ����*7d�:�������M-XUy�H`mn�o�Un<��e�U��Y�`U��#����xCG�r��N�M�U�p?���+u�*7�~.I���x��89*�R�`������"VUn<��%�bU����;���+��S��+�K�*/�\�\�^�����=l{�XU�� ��6�U�r6JeVL�f�D��!�"VUn<��e�bU���������9B��}�f��r�A�/s�*'���X��Un<��������x~�� VUn<�����U��\oKP��#T����24��r��G������9[�$��H�l�����c����kQS,����U�����%ObU����)E��V��Z�R�XU��s���XU�� �G�����9W���
%l�P"kcJ�bU�������
as�Y+T&��j�9g���7��YJd�P�5o�J��e��!��D�*��
�}!��M���;S�G
J����x���!XU�������x��d5*�R	�%K�u5�`U��\ok�����xvY����x���W�Un<@���)XU�� ��&����y�Ve�N���J�|_zVUN<2YKV�2+&c�d��%�����x�����U��v�������N��|_����x����U���X�`U����%���d��,��sZh������!�*/��t-*�G����d�T�k��r���-M������,����G��V��Un<�z�Vc��r�Q�Z�~���9��h�P�r�B�"M��
��r��*��K�1���
awL�J�5��
Ul�!�Tj��
aw*e�N�6i�v�Rnd<�5o�a���}h��
a���+�V���
e���m�7��>d���m�7��>d��A��+����L�>��������H�bU����}IJ����x���A���x�c�*/d-��W�`� e ����������,VU^<��e�N�jJL$�U���x��i�����Y� �2+�`�%���T�������Q���x���y�*/�=J�(�G��Q*�lY�XU�� ��V����?z����R@?���Q0?��G������T�Y =j�6���@z��lH��z���Tl�%g�����,���V{�3��,dmL/�7����6�W��jc
Y���
a�1�����yCXmL2W��7$X�J�����
awn���>j�v�V!�����
awn�V���7��
UrNJ_o�bsR*Y+�� VUn<��v]������n�XUy���1�W�Un<���q��������1�*7��vL!XUy� k����JU�V���l�yVUn<��v,-XUy� ���U������J���mVU^<�� cSz�*6��sAF��U�2�v	VU^<����������J��3N1XU�� �/����x���<�*/dm��h�VS��(����l�J�����`�1����4��a�-yO�4��'���0���X=L%�a���X=Lp��������0S������0S����vr�-��������m������]����*������
ujf}#k�&Q����
5�N�I�`U���������x�����U�r��4)�P��
5r��4�`U���|_����x�H�P��#T��Hj�Z~�\�.������O�������D������?�].���Won_����o������^�������|��1XU��v��o��op�����g�}���Wo�������y~s{�A�_=������O0?��e�f�����o�����]�������������������w��������o��}�]�Va����Z$WA���U^<�
�Z����x���Y�0o�t�FV�Z�y�*Y8k�
����?�P��8k|s}��WO�?��o_������?�\�U�_���c�����������h.�Z�{�
�XZ�;�<������
�jda���7�0�����V�����V��������h��
+����?�&�������v�Y�:kM
+bm��Yk
h������Yk
8B�����V���"�Yk
hXk#���ZS@���5��4�J��A^�hM
���E�������F�[����
�k���Ek
h���F�[����
�k�������1�,�]���
y�,�]���
y�,�]��w�
y���h���
�r����6�O�B�E+|��W�B��]�B�o0�C+|?B���X��w�
��,^��w�J��,	]��w�JB�,	]��h�JB%�����G�r���5(������Y�(VUn<:�c�*/d���KB+���5u��r��k�bU����%�U��Vy��%!��*K!�G]������Q���x�~�*M���xT�Z�r����x���8�U�2���XU�� ��4�U�2�E���x42[4��a�Y�������'Y�������'Y��n����'Y����������
���
��^{�����kY��%�����������`��"�"�Gz��p��t?�a���yC��5���E��:[����j�V�-���i�6��27k�7t�*7d."�XU�� �G��r�A��c�*/d��6)�P�j�;ya�6mbU������,VU�$����,w[�XU�� ��-�U���?���Ju��������`U����<bVUn<:�#�`U���u�!+�R�u���%�*7����*7
�Q�`U��C@��*/9�<D�s�*7d~��`U���\_����x���8�*7d<�$XUy�(d~:+�b:���9�1,����������,~2~�������J�c��`�0��<����������X-{o`<��4,�6!yh�G�����K���V���d���}�})����R��,�8T���f)�N�/U�?:�����qh������<DN�Gz�����G�r�A�cVUn<2�cVUn<��c��U����?����x�����`U��C��?�����cC�"k
VUn�
[����x�������O�������s����U��5�"VUn<�xS�*/)�<6��r���1�bU���c�bU���Oc�bU������-�U�2� VUn<�x*�XU�� �i�������M���x��Rq�bU������y�*7d��W��r�A�c��,#k/�����*��m��Q�|�C��#VUn<�����?�Z�4h�G��Y����4,~���)i�G���V9e��hX�2~��,~����h��`�C���j��`�8g:���������c���� k�S�������D������������t,����i������������O�@��E�?�0`<���lbU�������XU�� �������8k;� �������C	VUn<���cVUn<����*/��I��:B�2~����x��X.5XU����\S����A�k����X�����!c��r�A����U���cVU^<�z�<
����G"y�������z����&d�v��`U����{�E�B������u������B�f���,7#k���y!X-�P��]	�R��9G��R�xZ���5/�bgu�UK��������J����?��
a��Y�^��
a��Y�^��
a��C���4o�a�X#�1�����cdm��j����t���j�!��Q�?�����e����1r.{�5�C�����1k�G��Y�^���j�rN}Y5��c���e/��`��C{�jPz��P��#���uPz�"V��Z�:�bU�����8�U�0�I����9��f�7(bs�#9���(VUn<�xZ6��r�A��:�U�2��.VU^<���*�l�����H����������c�*7����U�r;�bU��#�����F9B�2�.Y���x��t��l6}${���X�CLd~�i�G�����4�#c����h��`�1���5�#c�[���E����b!�G���2�%��O�����XC$��[����?���[��l6}$g�����,�H��7����?Vp?���Tl?G���Q�?�z���1i�G����S�?�����w=���m��!��?
����7$��C����"bU����EV��j�#Y��6��j�#Y��6��j�c���W�Un<��!����x�{����x���#)�RG�r���H�����?����x����9XUy� k��*�R	��Nd������x��CR��r�A�=�*/d��teVL�j�Y�,����x��cj����?����x�s�eQf�$ly"�����*7����S��r����&���������$��!���}���67���}���67���=j�V������4���M����5��=�
?��,~p?���l?W�C�?
��+d>�4��`�X�s]4��b�9�V�w���j�S%��Q�?*��U2~���Q��A���I�?�����|l�����c�����hX>��|l�����c�����4,����}���>9	���A��:B���&VUn<��1�,VU^<:���I��:B�2~�U���x����'��r��.r}����y/]"���E����Y!y�rj<29�}lJ�T���g��l�XU�� ���������.VU^<�,w�9:G�r����)�U�2~�A���x4��"VU^<���qQ������<�vz<�x�e��r�z!S����G%y�bU���O�a��O�G���A��LI�?2���9�S��lN}&��OY�?�9����>������L������O����O3?D�?2?2�����dl�O�~L]�?���L�!�F������B��&��(�~����f���j�39w{Z4�������������L��O��`�����c�������}J�T�j�39k{r����!`~:G�W�Un<"�c
VUn<��%M���������`U��������+�����A}�1XU�� ����*7��>�9XU�� ���`U���2�����#T����yL������SVUn<��1-����9{|��Y1�=^������U�r?��`U��������y|��0g�[X���%(^H�j/Yk����x�s���x!��\���K�����G'yl����G&���x!G�r�A�/��*/d��R5/�*�\��i^6�2��)X�Q�C�Bj�x���k^6��sQ�Q�B������c������F��Y�B??�5XU�� ����X�Tid�X5��a���w}�4��w��� kPz�
VR�Z�ubU����<��r�Q���5*�A�}��,�55��r�A�/9�U��O^� VU^<����(�A�}�d��Z'��r�A��&bU�����R����O{�*/���]��r�*7����XU����u�bU���<�]ge6J�2�.I���x������;���y��*�G��++9�`�4��mP�{������t�<�����_jS�A���k�+���E����+y'��4/����}�[�����v�})�����<�����`g��<�����`g��������`}�-�{�M/�Un<���W��r����1�U�2~LA���x��(m���4��F��m�(VUn<���4��r�A��5�U����mSjAvoP�d��V��r�����D�7�Un<:�c�U��4�<��t�*7��r��r�QAyVUn<�x��`U���''���5������B�`U����<Z	VUn<�!1XUy�(d�e6J���i%�<����x��c������L5XUy��d����(
�%k��?����x��c����V��c��l�Ek���i�G��p�E��`�/x�R����Qj��<4��a�x�R��`�(5��4
I�?���&d<������6!�G����G'�G��lvN�O�P5��?m<��t���G)
���=J����C��S	d�1�`U������K��r��.r}�w��y��2�Nc���zV2���7t�*7dl]r��r�A���!XU�� �v����x�����xC9����+%��AB��A����P2���Q��:B��}IA��>M���(��e�J����x���4��r�A�/5�U��6&6�WJ����z�V��r�A�/2�U��W*v�*/���2+�Un<��v�bU����<6��r�A��y�*/d�P\4���V(�����
	Y+7���j����k�*7B�����)Y;����j��e��:��r��>�����>�d<�����;&�,�=���fv�v*���X�Tg�TE���x�����r�A�S�bU�����J�����d�T��XU�� �������O�*VU^<"?f��8B�'�c	��#�<��r�A��u�*7d>�5��r����������s@sP��:6��s@����ulhO�Z�cVUn<
�c	VUn<�����`U�������+��9����KVUn<���C��r�QIk��r�A��6�*/�\�,����E�d�C�%XU�� ��1�*7d<�`U���������x�sb��������^�x�h�G��i%��U�?*��V2�n��Q�xJ��M�?�����xZ��4,��s������N����XoPo`<-I�?O�^��4����B���������h��`�[�_J����_����4��
�d�Ci����:trnn�����v���t���z����v���q�*7d�>�`U����sVUn<����*/d�CY�`U���������x�����U�0_����RG�r��I�XUy��`>V�Y���x����.VUn<�xZS�*7d<�I���x��i-A���x�@�X�������u�*7d<mM���x��C�XUy� ��k����G$y�bU�����8�U��w;���Z������!k��$bU������u.bU������*XnF�n�E��
���+[5o�`^Y�]7���WF�c���
U,�V�jQ�B*�
����y!�d�rK����A�*��y!
�?�Z�V4/�a{�F���y!
����V5/D0/��UnM�B�?�������������`�9!����������Fm���|���t�����d-{���~��i'�����;O���mUjA�P����O� VUn<�x�-bU�����`U����2�`U��������
Xm�@�c )�*7`������x��#/����Y�.E�
�Z�!����`U��<o���U�2�!XU�� �������Y�.}
VUn<�������x���T�U�2~�1XUy� k�e��U�2[4��e�ZvY5��e�Y��i�G��x^���d��r �����X��@���A�?���������,����=i�V�>���=k�V�=����h�V�=T���g�K7����h�V������� s��yCX-��@o���
5�"k�{��!��} �n��yC�������7���d-{�4o�e�Z�>k�V�>���}��!�v{ k���yCX��@�e���
u,���^w���N�u#Y�=�W*b����U�"VUn<��1�(VUn<*�c�*7�~nL�XUy��|l�J����x���T��r�A����������-�U�2��E���x����(�b"V�����7��r�A�cc�*7�?6N�XUy� k��I����H�n��$VUn<�x�h�6�=&2[5�#a�Y�>n�����G��}�4��e�d-�4��e����������S�����S��J�������o��������S����?2~��(X� g�OU�?��������4��b�X%��������<4��b�X%�G������F��Q�??���4��a�9�~}�5��_�����4,~����E�?�Y�,���2~l��!X�p?7��U^<:����t�*g�=Mg�{{$��-XU�=+`l�����x��5�`U���%�s
VUN<��Q�^�#T������`U����<�`U�����mVU^<"���2G�U^<��ue����x���8�*7d<�`U��#������9B���n�%XU����y)����G!��U���P���\o�-XU�� ��mVUn<�|}	=XUy� kc�A�?V��YuK��lV]"��]��`����I����|,��
����m��^��(�G�z�3�������x����
�������4���X�z&{���U������3?���w�t���w��>�e,������.��
e�K�d��2m�����.��
e�;��1���U��}Yk��r�A�u����xTp}Y��
���G&y(}d�����9�0�U�0~�Q����G��5)}dG�r�zek�bU��CH�XUy�r})J���x��K�bU���\o[�*7�z+I���x�}dkW��d��,����}�*7�����XU�� ��������1�S�Q�^�uQ���W���R���U�2���XU�� �s��U���-(�G��A)����(VUn<�c�*7�~n��XUy�������U^<�{�������s��������l5�U���H��q�*7���F����A���D�?
6w���0[�bU������F����?J�j�r;�Z�B��l��
a�1��3�f���K��m����yed���j^V�P�|_V��}��sJ�P�����c�`U��<��{=����Gy����xT�����x�AE��8B����5XU�� ����U���\_D��8B�r}�%XU�� ��>�*/���Fe.H���H��SVUn<:�c�U��L>�2�bw�\@����x���U�U�2~l%XUy�{O���~�zO+�{����*/`�ie�E�zO+x�������K�_��4�;���}y������W�^�<���zqk'����XoPd<�������Gk�����B��k��@�5�xCG��zV2��!XU�� s���*/��<��7�0o��w��a�`U�����/1XUy�H��Q��#T�� �2[VUn<��%J����y��R������+�c�*/����2��ass��cVj���*���"VUn<��\l�XUy�h�~?���~�*7`�{�*/B��Q�coX�G�d>6)}�G�r�A��i�*'���8+}�G�r�A�/K�*7���f����1���M��
6wJ"�������P�����A����G"yDe?'��cB�A))���9��m�x�g�BzC))}��yC��)�bU�����Y*�r�*/d_j��_��~������#�C�����O������r�A��?6��ro7){���h��R�<�U�r}�W����A���E�B:V���Z���XU����rPj�;6��G0���R�|�*7����*/���|wxiU���|_��*7���K��r�A�/%�*/y y(��G�r��_r��U�p��[VUn<��!5XUy� k�sW��;V�����������x��c�U��
��yV���P���\o���j�{#����4lK�Y���`s�:9W(o����By� '�C�����!���~���j�����urU��7����d-H��7���t��$����A�5Y��:������)����Q��x�g��`U������U����������xS����x���4�*7d�1�����Y�P�)XU�� ����*7�Yn�b��r�QI[��r��_j�h��Q��x�w��a�*7`<���U��}IY���x�}��XU��h$�U���x���Z&����Q����XU������XU����*Q���x��U6��r�����bU���|_�.VUn<��t�bU����}�s�*7����������e�����/��~]5��c�}�|�n������l��c����0�U��N�X�������-*����x��G��������c����kQ���^Y��74`�Cs�V�XU�� cI�����Y����

X��@�}h��U�r�A��������XU�� s�1�U��B>��
�����L�XU�� ����U��
z�m���0���j�P���,���7����Yn�4o;���%(�0G�r��;�eh����Y�+Q�
�Xmn$�/��`U���$�7�Un<�x��`U���c^{?s�=�u�R$XUy=+�^F��G��L$�t��`U���������x��m��������J�����xV'c
VU^<���eR��D�rUr��>|�*/d]�,����H���U�B:���w���y![_:����y!�Z_9���I�����S��r��_z�`U��c ������P���|_rVUn<��%o����G$������P��#�<���=B�p?�%�*/d�e���6a����+�����x�g�}T��	;�Ld�a�Z��r�A�sVU^<�9)}������T����j��J��&���o����K
��cPz?�P�������������1�U��|n�J�G��������F��r���cnbU���<����������z��bU����u��O�G�N�����U���� -�y�r�^�+sA�P����<�xz<��:nbU�����M�XUy���eV�������,U���x�{�5�U��N�qS������XN���Oa�*7��2
M���x��t�Y���x�w�MI��2vg_N����U��;��$VUn<��QD���xd2~T����,y�xz<���i�G�����D�?2���u�������\@�c���~��r��4k�}l�E&��M������er���h�}l�E&g_L����f_dr���i�}l�E&� �����;�29�aB��r��IK�������%*�0G�r��Asj������9�*'���0e�E�f=��c.k����1����*�AG�r�A�/M�U�2�J	VUn<�|��`U���<���2��`��%���8�*7��2�`U���<��geH��oK"��%�*7M��/g^�_�9)��xC��R�;��u	VU^<
���o�Un<���Z��r��>,CVUn<��l��7T�����`��7��cP���%i�v�[���%k�v�[��1K��!lnL0�X��
	��g�K��!�l��g�K��!�,��s���!ln!�.��yC��e%�.�Q��*vvY���e
������LK����A�].��T��������A�o����x��c�U��H�_6��8B�0?]��t�*7�~�XU����5V��r���5%���������r+VUn<�����r����2�U�2~�&VU^<����)�R�]����d�*7d<�U���x���ObU��<oXG�*/d=�:)�Q*VS����������XUy����e�����_*?V���X��z�r;�Z�J�N���
a�S��{�-h�P��2d-�6h�VKV�� ��yC�\��@oy��7�0o������
a�u������
a�uU����h��`g��d[��!��J�A�U��� �d���4o����R7����y���]��:?Z �GW��#T�� ��8�U�3��x!~B/��wO^������|����������.?��~s���������X������g������?��}�)����+?�.VU^�Pr��6+N�y�,Z����,*� d�y`��I��{<����{<�I����v�H�����$y`�x(~�3�!<��O�v`���t�<��{<�I����t(��3�1>���c~��!�x���O��'�C���!����=��y�����z�<���r(�������x��x��{<����|�C���!��������y�q��|�<�@9O�y��x��x�<��XO�V���~�<��{<��{<�)����6���O~����?�~������-��{�����������o���_}���^������7�W�/~�}�?��WW�����g�����_���C�y���{~��������}�{z������;����xy����/^^��������y���'��_O�7�UR�v�m8C��{<����URN�V�x~<��������9IXe�|h}Ig�c}��!�%?���CN�VI���y�<>����x��x��x�'��,]��r~<�x�<�J��P��g�c>IT�O~'����G�x�?��70�[������C�&�%������������y�q��i���h���0�����m$��<��84���0��t�<��x�'�3p����8�8�Ff�`w��C���S�S�PkN�:e��C���!9I��2����dH���=�������=��{<����I������j�3�4����!<��x��1�$�_?��r��O��O��'/��t~<�p�<2�#��1���?��O���n�xT���-�ZUy��q ~��6���|=��)
��P��#b<����c�xX_"�����8�����x�p�<
�����
��1?���c=I����?=B�'�#�$l?w�j�#T}�<��x�'����C�����C���!��y$�*�G
����Up$�:p����x`~P;�����!�$y`~���z�P�	�O����8B�l��=�y�'�������v�<�$y`�����������=�y���#c��C�
��f�����G��y�����������[�/�~.c��C����el�r�>9c�����������G}'����y��|>�q�?��~.w���x��_
u�P�'�t�<����1��������d�G�xXoK9C����<���q����q�G=I�~���+�~�`��r(kg�c}��!�ZO������9?-<���#�"�J���C�A5��1<���#�$�<����yv��2�,VUn<�c����G#y�bU�����4�U����E���x��X�XU��� �5�U�!ylbU������6�U���������x���<H��r�Q���s,����������x��K��U���?���U�p?7����xD�GK�����!��x�D�X�U��~l��������{g����O�������w>����I���nv���WO����~~����z�������\^���a�Y���O_]=�������������p�������������������/��7����?������w�xy��'{xOn����/+����mZd��J
�����a<�A��8X&>x>�������C���X��{<�I����e:�c8C��y����=���=�$y`��z(�b��P�F{'����������O����G9I������0�~�Un<���
���H'�#b<��A�$�x`}���'��`<�<���H�$yT������!����=�I���s�����������y`7c�v`}����U��D�J������L+b;5�G�q��r�<���~�}Ig��<�����$���2�������������<��������������xz��C<��cN�v�2���3�Qx��1=���cy�q�����C�p�<����P<�g���$��t;�����x���=�����xr<:������!�v�<R�x��)�!�����<u.�<���|=
g�cz�q��v�<�z�����Gy�q�G;I	�q(��3��<�����N�G�x��yL<��XN�u�"�P�Q���t�<*����;IT���C�K;C���=�I���_��|L���r�<��9�|`�/���7�p�<������&����.������������=�I�����@�����x���<���c{��!�C�� �_�����x�wO�G���i����=�i������*��K����������8���v~<M6y�s���x~yu�����?���x�|�����$�|�#?���{r�E�qq�������������������u�f���{_~�������zz���7o�+����y7�n��og��?���?�E|�}{7�������t�����gw���W���Q���E��~3~�����������I|�W7O���f������o�����n��0L�"��?�o��~�r�����?���,��=�sO�G�7W��f �<�������w����>�|y}�v&����������t|b��:`���V1G�b;�|`G]�B��^�Hg���$lYd�5�!��$y`;�z(~`;j�.�~����{���P_m�������1NHk?C�)�hT�V��K�*���;4��a��������#�!�r�<��\?�4l?�������-�!��$y`��C����C�A����D���_�`<�/X�M��/�&�6l�"����Z	g�#�$l?7X_d8C�I���s�����G:I��v9��I:C�$y`��C{��o�����r�<�����ou I;?�:n��Gy�q�G;I���?�yL<��XN����ZU}�<����G9E=`<������#@��@>��3���$����%�!�����~�<2�����c�i����V�K���$y��������U���c�����Gy,C��r�QIk��r�A��u
VU^<���I��r���J��r���>�`U��#�����xD�G��U�0_���*7��k���������`U����z
����GH���b&��6�*7d<����x2_���Q�|������{>*?F������F>��`�sQ��v���(b��w<����-c'����tlK���U�?���D�7�M4��r�>c�������C�*7��2�,VU^<"�|�A���xT��*VU^<x�0�I���x���XD���x����������|}lQ���x��m��������,VU^<
���.VUn<2�c�bU������$VUn<��1����Q�����U�������H����j�v��*��o����_O
�S��l�xj����������v4���������|�$�~J�����K�cS��l�V"������yv��z[4��WO�����X?rd<m��q�*7d<�$VUn<�|�����A��M]�?2�/��~�i��������&VU^<�~�iV�����e�_lZ��r�A�/�*VU^<�����q�*7����XUy���4��Un<�x:9XUy� �����e�?*�F�X�U��
�csR���P����Y�U��F�/E����������`U�����uVUn<�����kVU^<���Y�y(��������*7�?6�)XUy�x��������.��q/���K��]�����$�|�#?���{r�E�qq�������������������u�f���'��_���=��~�������}��F2g���-�����<-����Gy�.��?�3�����|����������dV�������D�b�$*d����`U���LJ�!XU�� ����*7��f	S��r��.p}�i����������������t-�K�~�{���Won_����o������^��T��R��O�^�����W��_}������g����n����}��|wq���Y�c~jy������{��|y}������������;���W7O������E��g���3o�VZ}�*���l�[��������o�J���W��z�VZ]��z�<:Z������Mv[�O����������zz�_���u��������q�}�g�k�A�>��o����d���Q���E�����o�k������3��/���U}�������U�_������?~��������.����V���.%�z$�)�����\��f��5��9w��A
��[��k� G�r��,Z3���x�����R�f�Bv/Z3H����c��r�*7d���A�p���yS=�����\����O���c���������E���J�<
��iP��G��c���5�;�}�`�J�,Z������h���
W
D^_�h�k���t��`����P���p�j�kG�r���Uk_��u5���������xs���D@����UW�[��@��ZW���x�F��u�U���JNIY����MI����U���?������a�����G����o�]���������������>�����v?�g�����v�����������>��������������h��xy���7���H��pk����/������7��Z�a�n���9��qX�sj$c��qx�*7��s�:+6Q�Fp��j�G�r�Zx��qX��k"����w�*7����*7d��5�Ul�R%o�Z�f����U3?�f�#T�� �1���Un<�|Lk���D�J6nZ3]��k��6h�P��)���E����*9�nK���M����<4��`����m������V�������l�����j�G��sd���4�k�����D�?*���M0�h��S������
u��������M�������4,��A�Y�?����l
�f�����*yc��h�vc_%���U�?���J���m�����W;W��BP�N�P��#�<� VUN<��HJ����x$�G�����@>Ii:mX-j��#g�������(-\
�/l�\_�*VUn<
��NbU����<��U��D�/��	lX�XK����XU���$�M���x�c�����G&��I���a�
���\����?�$VU^<���J�3��j��%��
5�v�U27[5o�i���l�7�����Z�6��jAx�e��n�l`�C��
a�
�}����!���52~$�j\�� ��yC���jB���yC����>��j�V����P�<4o�
�	O��
	O����!��2�d��7���4�d5o���d<�4��c�?���������l��������|}���N���x�*����x��t������n�XU�����]�u�*/���WJ�9�2��4����x��XL9XU������`U����<�`U���u�bQz��u)d-j����x����`U�����U��67�2+F��\g;���`U����cVUn<��1�`U��#��cVf�6�Q2�,!XU�� �����,C�d�X5��e(����,~��[
����2p�aK��`��4���,�0������d=J�����K%�i�����S��!��������h�6�Q���T5��o������
;�kd���hX�hd������2�{O���������y!��G!k���y!Xm����i����_����h^V�/��������Y��V��j�;Y��6��Xmn'kssPz�z��0W�C�*7���c�*/dmnNJoP�js;x���"VUn<���G����A�E�E�
��\����f��r�ze�
bU���\o�*VU^<��gQf�������]������E���x�������G'ylbU�����ge6J���vr.j^4���������Q�|��5���`����5,A�?�Z����������������Q��Q���D����z[��%k����/d-Y��~�%�d-Y)�~�%�
�K���
��Z����>VK��z�"�~���yl������������ce���X�X�+�����d����~��YOWm�����N�_Vm���K{|�W8�G��G�r���u�h��Q��x��m�!XU���$�%XUy� ���iVUn<��T��7��
�����*�g����%�*7`�^����x�����������)XU�� ��H����A�y���*7d�c��r�A�/����x�^H��`U�����X����x�^�R�U�2~��7�������i�P��Y{Y7�*�~���lA��
����m���������\���Q��9��%��(��L�ylI�?*���s[�����Sr�c+��Q�xJ�������*O��T,�62�6��hX<md<��hX<md>�5��a�X#����
���o�����o�uh��H�xd����
��E�?��Z��j��`�Y��6���X>F�������G%ylbU����d��������!��U�2~�*VUn<����XU�� �G	bU��c �GY�����I������KkbU�����d����A�C� VUn<����bU������q�*7��2�XU���1��XU��x�?�;&g�;�>+��
���Y!�����U�2W]g��r�A����
e,W-�����
�}!kQ��yCX-�@��Q��
�
���=j�V{9���=i�V{9Tp����
Ul�K���yCX��@���yCX��@��U��v6E��M����'k��h�V[7��d�k�VK6��d}����l��~n������:���4��c�9�V������
u2?]4��S���C@�������lA���x�� }S������|>���J���O���*/����^���m��_���U���v�J�T��o#9Kh�K��r�A�/eVU^<������*7�y��r��r�A�/2�*/�y�(�����W��7~��lg^K+���)XU�=+�^f�`U�����p��9:�E����1XU�� ��yVU^<�9��yC��H�]���
ag��<�7���.#9c
�7�����Y�4h�v�����yC���H��NQ��������<��
�����N9�*7��R�`U����s0�J���D��Ou
VUn<���I�������$��q�*7���c������C�?�P���|_�9XU�������U��W{��#a����������x����U���iU������*?6��8B���pJ�T�z9��XU�����XUy� {���J%��0��p����x��1��u�sR���P����{�9w��r��]���U��L���U�#��YL&�b�������<����A��������YL���7��r�A�/c�*/�|_&e����x�����U�r�?ObU����O�*/��OW�:B�2?��XU�� ��m�*/d���#c}�9���2t��r���K�bU��\o������L��^��`s�3���d�����3��������s%����[o�9�K��l�t&�L/�����L�j/��X�v&kA���X-H&�L/��`s�3Y�L������F��Y�??�\og��l�2__4�C�|��]_V���z�3���l�����g�^j
J�T���2���1XU�������x��c�s��r�Q���5)�R�+d���k��r�A����U��~l�J�T������y�g^�^����.����Y�2k�U���=����9B��}�9XUy�H�Z3*sc�P�����NS��r�A�ug	VUn<�\u)������]c������x�*^���x��t��U�p������r.�6h^6��sA��y!�\�B�nI�B�Z�B�nI��c����5�����j
yG�V��>vGL!k
�����Z�B�nmVUn<���4��b����c�����(dm�6i�[�6�t2?���m���H���=B�r�]z��r�A��k
VU�$�-���_�ZU���$���b��<��0LbU����<��U��X@I��8B��}�Q���x���y(����fr�-J�G���X���
�hU���x�Z{Y�����>+]��q�*�g���Y_�����1�'���{�I��Q�;�k%s�9�U��}Y�������}�����������`s�����y!X_��e����W��R�A�B��������tl����5/�����I�B:?��~���`}�����$��r����
U�?�P��c�$��8B�2�h�XUy� ��Q����M5�lj���������|l��������XU�� ��4�U�2�E���x�g����
;�m��O�(VUn<*�c�*7��v������k)1(�
��l`���A�U��}���*/������{y�����x��m,=XU����Xk��������)�0G�r�A�	����GQk/��k/[#c�,����Y!s�>�*/B�f�2�Un<��:�`U������C��r��Hk�������l�����f�����t,~t�}�4/�s�����$�*'"�C��r�*7�z��9XU����{����1��zJ�7t�*7`-H�)XU������`U����e	VU^<"��V��8B�0_O��*7��"9XUy������C�{?��5L}
VUn<��e��U���.M��!Xm�d2?�K��r��Ai�����G!�s��`�H!��U�?
���}�4��p������	6+F*�����t�*7���� VUn<����U����9)�AG�r���9�XU�� ��R����Y���$X}����r�������6�U�2~H�*/��]��"�=(B��c�*7d���XU��hZ-{g^�.d-Y���rzVz �2��������Y�XU�� ��m�*7�w��bU����S�����J��S�"VUn<����"VU^<"��$�9B�r.YI����d=��#�bU���?J�bU����J�bU��#���)^���x��P� VUn<
�c�*7��Q�(VU^<�9\e��lW'�p�I�?�9\���*��`�S����Y�?*�!�p�E�?�9\���*��`�S���U6����pu�v��7�c�S���z�`U����<�`U�����8�*/d-YMJoP�j������K��r��c��`U����<�`U����j��U�r�VmJoP�four��]�jU����=�*7d>6�`U��C�~����r�*7�~n�U�r?7�`U����KVUn<�|l�U��^��������lS��r���$XU���j�C<�^�=rN[J���zV"KZ�����Y{�����x��jKs��r�A�/��*7`��J
VU^<�Z�VS��r�A���U��F���!��p�����&�7T������k�P��Yk�F�*��B���&����B�ik��
Ul?G�^�Y������O&��E��*�T2����Q�xJ��M�?����Z�M�?��%k
%|�W�(U^<�ZCF��r���XU���[IY���x����A���xt��*VU^<:X+$e�*7��E��U�0�V�����@�
�\����A���lbU��#��i��������]���x$2��XU}�<�tr<�{�d	bU���\_�E���x����)��;��O!�X�a>�Z�����������;s�0�U�r�C/dh�Z�����I���x��{O"VUn<����XUy� �bz���,f ��E�B$a<��Q5/;��;�z����x�E�B����<��]�B�����S�����xJ���G��X<%�
��(VUN<"9����7����7�/Y���x�~�:�U�2�XW����A���M�?"v��{���������qh����y�?F�7(bg���m0�!XU�� �GZ�U�0�����x���X$XUy�H��e�Jo��>I-�2��-XU����Qf�������j��f��s���
�?���P�
I��G�l��t��*	�������H3����<9Z������'W0o���� ���DUe� �a�6g6J�X~J��m{���4d�8D���x,��)QUi<�xzz�G��� ����?����b���?�Y1u���]<�c`���$���_H������X��`����L,~��b������J�����`�b����,�<G�k���?�z��@l����0�����z���{��"c������V�����
-���d�j�7�X�J�a���
)[�7����;������yCXm%k������Z�J�����7dX�J�Y�O���,Ur��~y�6g��o:���
ao:�����W�
Ui<���(M���x�����QUi<�����4`<=��QUY<�^��;�R
�u`y������c��J�a$�K���xT2�XN����x����FU������FUe� ��<6gVL���l��<n��J�A����QUi<���0����A�n��`�����>.���j�['����t�|;��r{�������)��1��B�����?���F�����?���F��x6����qld-��<��Em�O����O���sx�V{����sz�V_��z�sy�VO��Y����lVn#��N���~��������d���y�V?��Y�����,��u��g���^�fd�zx��Q�j'k�����:VK���E�M���x����4�*�G!s�����P��<�^��Jul.j'��^E$�*�Ys�W�c�1�|���DU�� �K[U�����xu�W�cs;Yr�"QUi<��2.����A��{M�W�co��N�cK%�*�x�p����,�����9:�[��^����4�z�����A��\�3G�c� ��KvS���x������;���Kv]����%���<<�ca~�{����?�K��w�o�����N�����?�Z�N�V���(�^�����;����t7���f+u��������trv�=<���3�z�{:����Y�p�[���x��cU����jU��������?V�1���{kU����3���������w����o����w�Xm� ����&QUi<����\U���<�_]���x��B��xC�����$�*����o�
Ui<�Q�FUe�k���kTU�
���QUi<�����4��FUe���No���x��cu��J�A�-U��c�<.����1��a���7T��h �M5�*�Gy�C���x����U���<��FUe�X�y�t����*�O/���j/�"����?���s����`s����������C+���?;�)?J��������y��b��[g�{�6�n���V��`��|�����?�w>�������;�����<��U�B�u����k9�Ze+V5�*�����QUi<�|l;4�*�Ow���,�o(����*�O��QUi<�xz�FU�� ��ujTU��7������[�7hb�������)QUi<�xZk���4`�x����,�;�/N������
�o�}���4�_X����4�y��.QU�<>������dm]No��j�'Y�_�%QUi<����DU���b��DUe���z���1o�J�A~{���4�Yf�%�*��"�2�37fbs/�"������7P'Y{Y/��j/�"�2��
-�,��4FU���$��j/'Y{���
a����5l����Z�I���yCX��K��{��aw1d�a�����N�Xk��?�w`����t��7T�� ��5$�*�X��JTU�����,��l��d���J�A���ITUr���DUe� k������Z��Ok�HTUr�=O����A�����?V����K���x��z�Wja�/�V���QUY<��<�^�7T���G��FU�� �G3��J�A��>5�*��n����J-���5��1E���x,���QUi<��~_�FUe��������������}��FUe� g�������}�k��g������������QUi�
����FUe� k�����YX-�R2W==o{Sz��d���!��l�s���yC��ed��=o���a����2�����7��
as������yC������7��
as�T���xCo�J��c�oU����ciTU2~��QUY<�7�m,�R��q%���uiTUr���QUY<*������*���nC���x����W����A����(6�K��S�84�*��^N���4�����FUe� g+���?����l�)N��b���/��-QUY<�Z�Y�^)�j�t����DU�� �K�U���|'xv�WJ�w����6�HTU�A�8%�*�?�&QUY<��ls9�R��f�E��U������%���4F��$�*�Y?67gV�b�cJ���]%�*���C���x��c����~L�Yd���l��?�������~%k���yCX-���d���!������8����x���*M���x����"QUY<���Uo���)+�zi�DU�����/��J�����U������t��7T��$�K���x���Z�DUe� k��:��a�dF�i[6$�*�?�*QUi<����U���|�p���a���F����$�*������������ ���?����d���������u{�V;ed����+eX����SZT���x�����QUY<��d��^)����j$�[���x����C���x��c�FUe�P2~L�W�
Ui<��TW���4�}��hTU#y�U�����Rsf�V;e�;��-��J�A���kTU
��>H�Og���*�y�=.��J�A����QUY<�_����E���0���U����k�U�����dR5�*�G#y�U���U�U���U��FUe�h�7����QUi<����FU��sw�QUi<�����4d<��FUe� �p�ZU����M�FU�� �1�����c��f�7�q���d-�m�74��� �����������X>6��qz����Ykh��L,~���vy����Ykh��L,~�s�6��W�-Ui<���V�DUe� k/�Z%�*�G#y�U��<�m����4`>�u���,�;���U�����ITU2~,���4d�X�DUe�02��M���x����DU���s��%�*�y���DU%�(B��%QUi<��q�U�����JTU2~\C���x2~������4��qKTU�~�C���x�����DU�����N����A�2�������J��.U��������,
�����o�J��^�T���J��e��xCo���Vx����
��*�K�HTU27S�Xn6A�}7���A�f��
M,7�d��=ohb��|�q?<oha�Y��7����E�����?��B��y!������!NoP�������Q�FU���$�K���x��o�����*�O��U��������U�[���|��QUi<��qkTU���c:�A�	��\/�4�*�Xr����,�\/��FyCU��l�QUi<��t;5�*�����FUe� {�����R�^�J��g���4d~z����A�G��T�>���Q����}T%{�O���w�~����6�>�6��wug��!����wug��!����}�g��!���.0w?��
-,w'����yCX�vU0w?��
)���o�����E��o��
���w����!�n��}��z���]
<���yCF��_?��9����x�g�s/U���|��o�a���<����A�>���
5�����\���4��������U��������o�J���K������o�_��KTU����:�Ao�J���WU����C~u�7�as�9W���DUe� �_���5���-r�&QUY<����rz�67�)��i���4�z�HTU�?����0������9sc:��v!��}ITUr��u8�Q:6���Px�T'���HTU��B��\��
u���o~^�.QUi<�\�V����A�Av��
u�
�>�\�n&QUY<�}t�����4`��G���4��|O���4d���DUe� ks���u���NzC�zg]��dm�m�Y�����{��s��N����w��js;Y�{��y�����|�y����������P���\/W���4�~{�U���|C�������!4���M����������,�����Q�7���Gsz?�P����<.��J�1A}���4d��QUY<��N���
Ui<���FUe���71g����������jA��kAF'��mjTU��2@{���4dl=D���x2w?������w���d���w��f`��@�w��w�Q�����u�	���������	��������c���T��?�x
�n�yg��pL2���QUY<���g���j/Xk���yCX��X�z��7��J������%�[����p(�^��?���a�z1���j����e����n
x�Pv��xCUr�]���x���,U���<���FUe� k�����%�d�C��cb����X��
UY<x�R�����4�Zk���4��qITU2~�]���x�sb���^�����d=LC���x��z�U���x��t�U��c�����^�7T�� ���DU�� ��M��J�����$�*����"QUY<&?vg���y|V�����dmL=6��J�V�Xrz�V2y��<ohag�E������^y��=o��>���&�7���L�G+�7�X�g�o�z�6�~*X[���
��x(����;�?��
?<���yC������6=o���20k��������������Y[����V[�����ITU2�nK���x��t�U�����G���,��O��xCU2���DU�� ���JTU�|{����A�����J-l�����z��J�1I�FU����^7���������^�7T�� �G�U��<��Q4�*���<.����A�y����Z����[���U�����:4�*��u�U���������YX��d����J�A���4�*�?��QUY<&?N���X� g���?�Y���e�/���f�I����?&??�x������_F����������z�V�����Q=��O^����<������}�{�6�o���cx�V���O���n��{�������!�r�VyL��j���w�cy��aw�F�V��!�
e�P��9��bo(��g��5��J�A��]4�*�Y{9v�R��R���FU�� ���4�*�G%������P����O��QUi<����4�*�G���W�
Ui<@�l�M���x��e�%QUi<��v�.QUY<����;�R��EUr.���DU�� ���%�*�x75�JTU��l.�WJ�Z2%��N�U�����6����l6]�_8����4�z�L���x���>%�*�9�m���f�����)U������`� J�����`��������`�1J�,����C���U<���PrV�*�����SrV�������SrV�j�����3�fu��0���YukT��J�A��qKTU2��C���x��t�DUe� ���:��a�RF��[�$�*�x�]�HTU%y�U���k��g����F��������3��nK���x����%�*�[�"QUY<�9~�r�!����&��w��J���W��9~F�����J6���7��6��J�z!�D���x�����,dm�v�W���:#���XU���Btv��J�A��U4�*��$��rz��P����?t���4�z1���,�\/�3G�
Ui<���W��J��$�[���x(y�=�Y1o�J��Azz�V�kd-�^�����Y����`��F��l�����f������o�YdV<��Efd��U��`j/�|���������T���u�E���x(�����,dm��]���x���T��J��G���U���|���jTUr���QUi<�����J�A���iTUr��S���x���hU���\/�hTU��/H~V���\��gl�o�����o��%��QUi<����4�*����&�����*�x7��&QUi<���VE���x�o\n����4�~��M���x�����DU����mt����A�y�f���4��qITU0_��.QUi<����*QUY<�7.7U���\/[���4�z�n����A�Nm�!QUi<���0��J�A������rN�v9�G��� ��-U������S���x��B�8�G�j�
�n�^�DU�����v����A�
���?
V+T��({s�����_��KTU�<����,���>��`������W���,��_����*����!QUi<�|�L���xL�|�o������J{�Vy|Vk8^kX������!����w���yC�]!���������B�����
aw�����o�����F�!NYQ,��w���U�����=��GV��\�G�o��^����4�wx��QUI<*���1�>�*�R���c8�R����]�17��J�A���4�*�ywy�3G�bw���c?�hTU���0g�N���k����kTU�����9:�������p����}���qV����A�Z��T���N��rU������iTU0;ejTU���,��Q���J�7���?���J����?���J����?���J�G���?���J�e?��(����/�������?�L^+T�����
���wS���!�n��}d�:�P���Z!sU����E��QUi<�\d�5�*�G��sw��7T�� ��aU����B��QUi<�>��jU������v��7T�� ��}jTU0~\���5�.��}�W1��J����:%�*�G�sWs���P����]$�*��$y�U����c���,dm�5�^�����<V��x��C�DU�� ��^U��c���9st�P����6���4d���DU�� �sG���4d<=n����A��]��`�dm��Q�����Z�}�u{��������[<���kdm�]<���kdm�]<���k����z�6��)�����?���w�����������`���|���������Y ���lH#�-���X�e���V��xCU���JTU2?�[���x���{;$�*�G!����?�P���k��'�S���+�v�zCU��B�����
u���7r��D���xt2�o�
Ui<����ITU���]�����}�GU��c�<j���,�\/����X-H�`���^������A���zCU��S���x�c6����ad<]N�T�����c�U��c���.�����<@oy[U����O��QUY<
�}���7T�� ������4d�q�U���������C>*�\C���x���]5�*�G#����?6�`4p)rhTU�~�8����x4�.�>�.w�}�{�S����p�)�iTU�A���xCo�J�A��~jTUr������$����!����)�ey���<�>����
a}�|S������7��"���!�/w�}�{�<o�Cey�����]����!��r�w�����n{�w�����n{����y��?����#QUI<�����o�
Ui<����C���x����L���x��m�S���x��u8�0�}�����N��cbs�g%���$�*�ywY��2�����xj]���x�w�us��L�.wN2����7T�� ���U���<��C���x,r����6�p~u�>����~+����y���{��s�_X��"��&&QUi<�������,<������P����}�(����A�-��x!�[^�����B��������%QUY<�Z�6/da� ��s�V���,�][������/�����
-���^L%�*��������;�����^%�*�G!����?�P����_�C���x�}��t������^�*�R�����U����g����;�+y��E$�*���<�>���������Q�/W���^U���x�}��9} ���*���{���4�z��FUe� ���p�b�R�N�O���,��>�����4d<��QUY<�����9��V#��9s0�P������QUi<��e_U����\/�3�
Ui<���,U���������7e���/��0�kgy������!C���x���(��a��n�d/�FUe� ��Q��0?���������O����A��6���&��~���QUi<��qjTU�M�����7�l���.��J�A���l��}���v�?�v���l�7��������
a}��d��{��b�*�^�8<o{�����qz���P>�|�n\�zCo�J�A������4dnvU����^��O���R�����E%�*����:$�*�y3[���,�\/����4��e�C���x���9L���xt2~�)QUY<�����DU�� �����A�15����4��b�DUe�X���-��J����.��J����Q$�*��������,F����?���9�����S#����?��?
9Wh��h��?��<n����A���8�G���B����DUe� ��Y��?J�����������r����7T[���5D���xL���
��*�Y+���
���B�m��xC�����S^�%�*����y��
��*�O����,����9�P-�z�kW����QI��
��*�Y��N��X�Cmd<=o����A���.�����*Y��n������U�FUe� ��i�U��<�h�4�*�Y��m���4d���QUi<��2�FUe�P2�N�7�
Ui<�����$�?�P����J6�=�������5��R��QUi�
[w���4F�85�*�9�N�M���x����K���xt��]4�*��$y\U����&�FUe� �C+���a�!���o�9���s�o�`<����U���_�U���|#����,�+k�wh��B��<V��x��}S���y������y�����#3���XY�|k�s�CU�B�����7T�U�8���CI�FUe� �p��������^�����,��v;�G����M��������O�R$�*�Y�����c�������.QUY<�9\[sz?:6���s��>$�*����m8�o�J�A~����,J~���xCU������1l|�����N���u��!��33e`3d�w��3d`}���g������4�z�N����A�]n�3d`}�=��\�18`��vv������u/��Yw�g����v�J������P��������

l�� �v{U���O�Z%�*��$g�����&6Cw�3t�vHTU��a��74���I�>�� {TU�wl���1���I���K$�*��"y�U�����ITU�N���o�J�A���KTU����0U����>�K���x����%�*�����t��7Te� �N���Ll��${����?&�+5��w���w��|�m�=o{�m�3�q��&6���e���4��|��QUI<�Ww4��la}u����;}do���A�	��#[X��"�@���M-�d�� �r��V�����U���x�sRu��,lN�"gN���Y���E�=�iTUr��FUe� � ;gn��� S��8��1���(Yr��FU�� ���iTU�}��v����/���O�U���?�R4�*�G-$�����4�z��FU���sgS��J���gU����o^h�]��ue�p�!�����B��xC�y!Jz!�<4�*�X�z.���4�^�S���x�3BNs�!�f�����9��ao*�����QUY<�������{������XU��=���7d���*�}\E���x���uiTU2�w�������r��7���4�Wv�%QUi<��r�.QUY<:�^��7���4�zi�DUe� �N]���2l������P����A�A�t�����'����������SfX���3����M6���>�K��J�A�3��J�Q?����Og���*����M���x���!U����������,��o�%QUi<����U��������X$�K���x�}�w�%�*��^�JTU�K�����4���o��J�A��qHTU0_��ITUr����������~�w��y��aw�w��f��~2���m��vb�9r���mU�����w��X��d�8������F�}z������^���������������^�^����������!�i/�[��x,�GiU���@U4�*�������QUi<��mU��c�<����4d�]���x����Y4�*��^��QUY<�9K��]���x4�U]��2wW����o��k��FU��� ��jTUr��n��������U��������4�rN��J�A�e��QUY<:����7Tz�x�^�}jTU0��4�*���<����,`_�Q��
���<���yC;��E������<���yC;�M����1���9�����,0+��?��-r�,��X�zQr���`� E�|�<�C�|]�|}����u��������>#�����l�*�y�p��7T�� ���iTU2��FU�� ���5�*����>������8jqz�*6������U�����u���4��\mK���x�on�;�R�b�m%��qITU���N�7�b����e�DU�����C���x����DUe��d�0g6���x��su;$�*�x���ITU����h��Z�J�����S���:�����lNJ���������&��^���I���Bn����������,,7[`n����,,7�����J��H�7���T��5��jA*9�u����T��
��jA���tz��a�������
as0�����<o���\#kc�:�P�jc^)3���DU����mkU������W:&QUi<��t?%�*��^�M���x��/���
�}�*�^�.QUi<���.U����i��4���� ]������4�
�����,d�CoN/L�j9��w���4�z��FU����>6����1@��O��
UY<&O����wP����E���x�����,�l�n�,���6h��m�T���x��eU��CA?��,�7T��$�[���x���y������ry�}��9���S���xL���>����w�C<o����]�(�7����N������4`�>��QUi<��}��QUY<�7QFw�������Z�1�FU���$�K���x��c�U�������:V�+�-U����V5�*�y~�[���x��1cs�����t�6f��QUi<@ohS���x����iTU2�<�{7������?�w�z'����?:����SS�����Nu�vj�)QUY<�w�fuz�:�nP`>6�HTU2~�S���x���oU��c���No���x��cv��J�A��U$�*�?�%QUY<�w��:�Q:��V'kQ��DU�� ��6$�*�?�*QUY<�w����F���c]��qU���O��������:/��P�?%go���?��[������?��[������?��[C@�p��xCU�f�%QUi<����DU�U�����A�������A����.QUi<�|}M���,��o����*���j���4����DU����e�DUe� �-�����_+?�����d��:E����r.�:������
r.����?6�l�������X�����������*�YK����X-� ���:�����A�L���x�����QUi<�����QUY<��~�N�����y������4`���M���x��C�FU�� �S�U����K��3�b`s�y����QUI<&9kJwg���fMM!��C5�*��^��QUi<����U��������o�J�A������4�y��4�*�?�L����A��[u������
����FU���$�S���x�w���cbw�������QUi<@?�f���,��_����*�� y\U�������?���I�g�y�v�=��(�y�6esk���k�&9'�v�����I�5��
Ml�!�d�����7�&9�N���`L�V�.��j�&Y+d��
a�B�|�m�/fbo�M�$�[���x�g��U������U�/fbs&�&���DU�� �KoU��c	���7�
Ui<��2N��J�A���ITUr��������9X�\/�%�*�x���HTU��3g.����W%���KTUr��*QUY<�^g.���x����U���\/�-QUY<����r�����/�]��6��J���]�DUe������xCUp����?���5��R=�c`��|�co����������{�v��X����X����}z�6d�������~�������~��/v��l��"g_�������u��g������e���y��Q���}���xC���+y����DU�� �v�ITU�.w?oH��\-d<��DU��k�[$�*�9�~�oH���J�����)v�������FUe�h��rT���
Ui<����FU��X$�[���xtr�t�W�
Ui<�|��QUi<��1�FU�� ���4�*�y�}�3GG��m����FUe�����0g����x��e[U����_��QUi<��q��J�a$�K���x�w�����]���
^��FU��k����?��x�����XX� kN����A��g��l��*����?�?�w.����;J�sqv�����Pr��9<�������������8����*����QUi<����]���x����FU��P���QUY<�w?��9������R�14�*������w�vyx��Ur�=/�
Ui�
����FU�U���o����y;^�ao9���o��9�A��*C���xp������4��qKTU��jNo�a� F�cpu���4`�q�)QUi<��v6����A�}���d��#k�uJTU2~�&QUi<@o��%QUY<���37�
Ui<��t/U���<���DUe�0r����7T��������������?����?���w��������4`~z�!QUi<���.&QUY<
���uJTUp�[���4�tw���4F�8%�*����=6��J�A��sITU0?�W���4d��"QUY<�wPn�$�������2�n*QUi<�x���J�A���JTU�~�><��c���%t������A�����t,~���=�c`�8[���7�-Ui<&����J��Y�C}t��l��V.����V&K��QUi<:���FU��X �>4�*�?F���,����[���x��cU��CA�4�*�Xkx�N��J��@�4�*�y��D���x��c;5�*����c�4�*�?��QUi<��qz��a����qy��Q����_��Q���"��q�U�����9��FUe�k��R��`�u|w�,��?J���<n�����@��4��xCU0�(�4�*����Y����0d��M���x����e9�G�}�������o���A��E��(���OmiTU#���9����*�w�7�� ���;�c~P�<w:��*�y���P�r9��Z�C�Z���Z������QUY�
z��/�bg�
���U��������5�8}So�J��=��DU���GmC���x����3���4J��%�*�8W�������U�
�iU����kJTU2~h���,�������d�G�S���x��c�$�*�?�%QUY<���z8sc*��Q��E���x������ ����?�)?n��P,~(�5���� �G+���X����xx��r��i��?�10������S��u���jA*Y���`� ���1=��������6��a�AM���6��J�A�]U�����u����Q�����o�J�A�_�K���x��Rmw����K�F������*�Y�N��hX}P#�a�U%�*�?�[���x���v����;4�������z�F���eiTUr�e��l����ld�CoE���x,��a>����s@{�4�*�[�?{w����r�E���U��<��94�*�?V���,����^���md_�C���x���L���x�^{��FUe� ������i�]#���!U����B�S���x�����!l�C'����xC���B�w���4`�1�hTU%y\U��|����?:�&}'kFU��J��c�
��J��c�W��J�a$�[���xT2~���������4��J�A��55�*�Y;5��?:V;��^L4�*��^����,����9�G��nwr���=������J���l�R'g+���?��J}�����?v�#k
���X�a'k
���X�a'k
�8�R�5��Og�U���og-U����%4��+��YB���m���4�~;�JTUp��cHTU��9�^�7T�� ���%�*��^�!QUY<�w��:�b:�nr7r��)QU�<>������t��lnM����2��"QUI<97f������ay���������,d���oh`�B���R�.U���\/�%QUY<�7��8�����<���U��<��:$�*�?V�U���H�DUe�h�]���7���4`>��ITU0[sJTU2~�&QUY<�w�:����qdm�R���j�F'��y�G��9�om�����d���=��5�\�ux�6�p�����?�wYk�N���j
�{q���S0d>v{�V{9�wU�^����8�Y�ZD���x�����,�,C�N���f��A��FU�� �i�U������hTUr���Wj`�Y��s���4�yN�jTU�/����7T�� �[�U����_����$S���9�b�P����ow���4�~{L����Q@]O��xCU��A/���4d>v�U������"�����6�ohbs�fsU��QUi<�\�J���,��6��74�9m�5���QUi<�\���QUi<����jTU�n�����,�������P����?��QUi<��cy�Vk8���z����2���������I�������9~��%�����Z�9���{����9�������M�v�N���j�&Y;e��`�S�����?�Z���������w`7qz�&��$k���ITUp������4��vk]���x���n�����;������%QUi<��v�DU%�Xd��6�^���N-���m
��J�A�/Z%�*������������
���!QUi<�����DUe���z��Y1o�J�A�cG���4�z9E���x4r�������4�z�6��J�A�_�%QUY<�VZ|V�[^���9\�8����p����R$�*���<.����A������V��^��

l�,07���
-,7[�z�7���B�m�������E���O���d[
�M�����`<��E=o��]���<o������}��!�.w�o����
ao�-�.w�=o��U!���xCo�J�z���%�*�x��_E���x�s0���?�����c��KTUp���J)����w�Gqz���U����6��J�A��&U���H�FUe� ��:��+���RJ��t��QUY<�^�c:�R���+����QUi<&�����,d/�����z�u���T���x���64�*�������z���,��N���N)9���o��J�V�XrU��c����yC�U�7Q�����7Q��9n��jA���?�����~�N���!��Y�p��j��}8��
a�J�>������%k��yCX����gw�!�j��}8��QUi<���9U���x�}��r�!�����}8�jTU�I��5�*�Y�p��V�`d����FU�� ��}jTU���<�FUe� ��x�5�*�����FU�� ���iTU�N����?�P���?.qz��]7�w�*M���x�� Wuz���QI�DU�� �G�$�*���_}ITU�	���pz��P���?�Y$�*��$y\U����?�.QUY<�Y �:�b�b���
��J��o��JTUr��9�b�bd=��U���������\S29L����r�9=o��2#������B��Bn�2�!k������Z2307�����������dw��zKU�lw�.QUi<���nE���x��dw�$�*�x���.QUi<���*QUY<�7@�9$�*�xs�*QUY<��[���x��E��J�A�fU����_�)QUY<�w?��ITU2~"QUi<��q�U�����&QUY<�\��1������o���j�X����R,�E��5�*���<��QUY<fyT���4
���FU�� �ioU�����C4�*�O��QUY<O��QUi<:�c-��J�1A�5�*�?�hTU��������4d��v��J�A��]5�*���<��QUY<����?����?�<�\��a��������������W��(X}ag�]�4��J����FU��P���QUi<��
�G������Wi�7T�Z�Wxy��QUi<��:�FU�� c�,U������t��7T�� ���5�*�?T5�*�?lhTU�F�����
V�]?�[���x��c?4�*��
��4�*�� �������L�<wy����s��_n����2��r{����x�P���*X�TY`�����zCUk
kuz��P����jkU��<��.U�������^�bX�0�<W�&QUi<��1�DU�� ���U���
?�����4��qITU��Rm���4��eS����A�g���S���Z��qT��J�A��-QUi<���<$�*�G%�����b������U���?�4��J����DU��0��)QUY<?Zu��7T%������kQk����DU�}+dl�]���x��ux�V�P;[��
as�*�����
��� ��������N�S�����S�
����

����{���!l�_%k���yCXm]�w�v��wH��k��
as�*Yk�N��j
+Yk�.��j
+9��]�7�������W�=ohbw�]�^�7T���G/C���x��G�U���x�����,
�A�9�Ro�J�����FU����>�FUe� k��tz�*V�\��K4�*�?��QUi<�|���QUI<Y������Z�F����kTU2_��FU�� ��~iTU�B��gV���x���T��J�A��khTU��W����A�����?V��*��94�*��^F1����A�V��?6[����FkU���OG��������?�P���o��4�*�������;���/��?���F������
2�P��X�A��
�����}}���������F���^����V�7b��yC�1��R��xC�R;���8n��J�A���C���x�s���xC�S�Q/�v���y!��B�8�R�B:y����������g�Yn����A�J���Ju�W���h&QUY<&?��+���4�~;G���4�ynN���,�\/���zCUr��M���x���.��J���qY������74�������oE�����DU�� c�vITU�/f������t�/f*QUi<�:�yz����<�^�7d�Yw�}1�r�����!������4`�XbU��<��2%�*�9�~U����A���&U��c�<N��J�A���ITU�M�5oh`o�rf��]���x��c��J�A��uITUrf�R�����A�>,s���9d<��DU�� ��^%�*�Ow���X<d�8<�c`�c������?�Z�uy�V+4&�����?&��N�?U��������U��o��o��o������"�������W��G�+���	�����{��������g����/���/"���<��+������������]�����������|�����_��/�������Z�����~�Z����2�/��c��_��}�������&��������������������+������>��������Vu_yk��l��rm��l�k��gl����1��=����%������q^�gl������g3�g��X<�X������xz,������X<?��c<�M�c�Xg������������5?a3����x��	��t6s���z�>���l��OY�������!����=�MY�w�Og���O����p6�������~G����Y��y�>��_SO����SC�=�V?�|6��lj�.��p6?���}8���}������>��c�*��g�~�)��lL�x����>��wC?aS�����~7�=�M�e3����7�z8�)�e��X�����X���l��m�g�g�^�u��g�^��T�/���~�i��g���~���=k>����f�^zz,������X��=����b����xv��(������]{�bS����]{�b��{�g�^�����){8�9\�f>=������c���f>;�)��ZgS�^�1��l���1����b��s��{=^l��kj==���yz,^��o��c����g���!��o�=�M�kt<�Mu�Q]g��{fxvo�����cO��s�k�����������(��[6���y��{�^l�;�lJy8����)��l�{3e<��p{=�<=���������G1��c�Iu�<;���w3��L��z8�����U����M�g3��n�����7��l�=���gc���|��c~������)���[8����0�|8���3��g3���������x�������c���3���X�>�;�xv}8����C���{w7�������g���o<=����g�b����p6���?g}8��{[�?�M[�>5����}0s>=�}0s==���yz,�������b[n^����C���Z�p6�;�S��l�����l�;7ij8���O���;BS���w��==�D��=8���w6���p6�?��|8�V��F��7o�Z"g3���%O���,�e��Xln���g���Q�Z�%�p6�=O�"g3�t����Qqcqy�����U���~����gS��U���4w�����l�4��>��t{�W{z,^������U�3C{v,nR�55���g��g��{���p6����z}8������c�r��Vz,V����cq��n�7��l�;�l��p6U��f�������g3���������O�������c��o����X���C���gS�o��l�;g-y8���Y�V}8������gwc�zz,^�<��������>;����>�Min,��p6?Qc���l����p6�������x�gM{z,^~�gO����~��Xl�z��Z������O����������Gs�
������pk����S�c��yz,���5���S�!�gS��L�M8���Bj�g�������;���O����l������c�Zw�<;�O��������wM=���>�{������.n�yx��}�<��������c�7��O����O�����|���l���������w�b��o��l��g�g����,�J��c�?�X��c��g�g����Q�����}w/6��o��w�b�����+?53S��w�b3��`t>=/�=�O�������Xlk�l���O������{���^����^l���F�f�����}w/6�?���c��kL�����S�l����+��}w�}w��>�����'��g����4���}w/6}�kj>��O�7��X��>_���b��e��Xl�\6����C�7���}w/6���>�M�.�g����t��i���{�n?�����U|6O����[f�����������2>�����������W,�0�������������)��O��������/?;���������_��/u������������W�~�{e��P������?���O?�����g��_~���������?�����������_V��?_~���x��g{})QE�K�������������?�X�����~����o���:���K�������������~��������k�������������/���������>Z���_�����/xl���/x�$�B����%QUi<*�c�%�*��y�*QUi<�q����Q�qV��J��I�DU��X �����4��M���x4p�=diTUp�=J���4�~{��QUY<:�^��QUi<���v��J�A���U��c���1�FU��h �Y5�*��$y�U���O�uhTU�	�c��FU�����M��J�A���iTU2��E���x,2~��FU�� �/��QUi<�����;�,2�^����x��|������cJ����?����6{�h�a���x��b�����,�7�Xl509��
���^��
�^l�<<o���K�vg��!��v_[Q������~����G��A�?����w����~�#�����o~��������5?����O���y������_��x���}�����y������PK�y^�q��PKg��Zu����M!F:��049_physical_replication_restart_lsn_backward_standby1.loguxUT�fehPKg��Z�y^�q��9��EN049_physical_replication_restart_lsn_backward_primary.loguxUT�fehPK�=
#82Alexander Korotkov
aekorotkov@gmail.com
In reply to: vignesh C (#81)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

On Wed, Jul 2, 2025 at 8:20 PM vignesh C <vignesh21@gmail.com> wrote:

On Sun, 29 Jun 2025 at 11:52, Hayato Kuroda (Fujitsu)
<kuroda.hayato@fujitsu.com> wrote:

Dear hackers,

Thanks everyone who are working on the bug. IIUC the remained task is
to add code comments for avoiding the same mistake again described here:

Sounds reasonable. As per analysis till now, it seems removal of new
assert is correct and we just need to figure out the reason in all
failure cases as to why the physical slot's restart_lsn goes backward,
and then add a comment somewhere to ensure that we don't repeat a
similar mistake in the future.

I've wrote a draft for that. How do you think?

I analyzed a scenario involving physical replication where the
restart_lsn appears to go backward by fewer files:

This is indeed an interesting case. But does restart_lsn go so much
backwards in this case? I've checked the logs. It looks like standby
requested a position several segments back, but restart_lsn keeps
increasing.

I'm ok with adding the comments.

Thank you for your feedback!

------
Regards,
Alexander Korotkov
Supabase

#83Alexander Korotkov
aekorotkov@gmail.com
In reply to: Hayato Kuroda (Fujitsu) (#80)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

On Sun, Jun 29, 2025 at 9:22 AM Hayato Kuroda (Fujitsu)
<kuroda.hayato@fujitsu.com> wrote:

Thanks everyone who are working on the bug. IIUC the remained task is
to add code comments for avoiding the same mistake again described here:

Sounds reasonable. As per analysis till now, it seems removal of new
assert is correct and we just need to figure out the reason in all
failure cases as to why the physical slot's restart_lsn goes backward,
and then add a comment somewhere to ensure that we don't repeat a
similar mistake in the future.

I've wrote a draft for that. How do you think?

Looks good to me. I'm going to push this if no objections.

------
Regards,
Alexander Korotkov
Supabase

#84Amit Kapila
amit.kapila16@gmail.com
In reply to: Alexander Korotkov (#83)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

On Fri, Jul 18, 2025 at 4:15 PM Alexander Korotkov <aekorotkov@gmail.com> wrote:

On Sun, Jun 29, 2025 at 9:22 AM Hayato Kuroda (Fujitsu)
<kuroda.hayato@fujitsu.com> wrote:

Thanks everyone who are working on the bug. IIUC the remained task is
to add code comments for avoiding the same mistake again described here:

Sounds reasonable. As per analysis till now, it seems removal of new
assert is correct and we just need to figure out the reason in all
failure cases as to why the physical slot's restart_lsn goes backward,
and then add a comment somewhere to ensure that we don't repeat a
similar mistake in the future.

I've wrote a draft for that. How do you think?

Looks good to me. I'm going to push this if no objections.

As discussed earlier, it is a good idea to add comments in this area.
But as this is for pre-existing cases, won't it be better to start a
new thread explaining the cases and a patch? We may get feedback from
others as well.

--
With Regards,
Amit Kapila.

#85Alexander Korotkov
aekorotkov@gmail.com
In reply to: Amit Kapila (#84)
Re: Slot's restart_lsn may point to removed WAL segment after hard restart unexpectedly

On Fri, Jul 18, 2025 at 1:48 PM Amit Kapila <amit.kapila16@gmail.com> wrote:

On Fri, Jul 18, 2025 at 4:15 PM Alexander Korotkov <aekorotkov@gmail.com> wrote:

On Sun, Jun 29, 2025 at 9:22 AM Hayato Kuroda (Fujitsu)
<kuroda.hayato@fujitsu.com> wrote:

Thanks everyone who are working on the bug. IIUC the remained task is
to add code comments for avoiding the same mistake again described here:

Sounds reasonable. As per analysis till now, it seems removal of new
assert is correct and we just need to figure out the reason in all
failure cases as to why the physical slot's restart_lsn goes backward,
and then add a comment somewhere to ensure that we don't repeat a
similar mistake in the future.

I've wrote a draft for that. How do you think?

Looks good to me. I'm going to push this if no objections.

As discussed earlier, it is a good idea to add comments in this area.
But as this is for pre-existing cases, won't it be better to start a
new thread explaining the cases and a patch? We may get feedback from
others as well.

OK, done.

/messages/by-id/CAPpHfdvuyMrUg0Vs5jPfwLOo1M9B-GP5j_My9URnBX0B=nrHKw@mail.gmail.com

------
Regards,
Alexander Korotkov
Supabase