Add test of pg_prewarm extenion
Hi hackers,
I wrote a test for pg_prewarm extension. and I wrote it with the aim of improving test coverage, and feedback is always welcome.
---
Regards
DongWook Lee
Attachments:
001_add_test_pg_prewarm.patchtext/x-diff; charset=us-asciiDownload
diff --git a/contrib/pg_prewarm/Makefile b/contrib/pg_prewarm/Makefile
index b13ac3c813..617ac8e09b 100644
--- a/contrib/pg_prewarm/Makefile
+++ b/contrib/pg_prewarm/Makefile
@@ -10,6 +10,10 @@ EXTENSION = pg_prewarm
DATA = pg_prewarm--1.1--1.2.sql pg_prewarm--1.1.sql pg_prewarm--1.0--1.1.sql
PGFILEDESC = "pg_prewarm - preload relation data into system buffer cache"
+REGRESS = pg_prewarm
+
+TAP_TESTS = 1
+
ifdef USE_PGXS
PG_CONFIG = pg_config
PGXS := $(shell $(PG_CONFIG) --pgxs)
diff --git a/contrib/pg_prewarm/expected/pg_prewarm.out b/contrib/pg_prewarm/expected/pg_prewarm.out
new file mode 100644
index 0000000000..325e545cee
--- /dev/null
+++ b/contrib/pg_prewarm/expected/pg_prewarm.out
@@ -0,0 +1,35 @@
+--
+-- Test pg_prewarm extension
+--
+CREATE EXTENSION pg_prewarm;
+CREATE TABLE t1 (c1 integer);
+INSERT INTO t1 VALUES (1);
+INSERT INTO t1 VALUES (2);
+INSERT INTO t1 VALUES (3);
+--
+-- prefetch mode
+--
+SELECT pg_prewarm('t1', 'prefetch');
+ pg_prewarm
+------------
+ 1
+(1 row)
+
+--
+-- read mode
+--
+SELECT pg_prewarm('t1', 'read');
+ pg_prewarm
+------------
+ 1
+(1 row)
+
+--
+-- buffer_mode
+--
+SELECT pg_prewarm('t1', 'buffer');
+ pg_prewarm
+------------
+ 1
+(1 row)
+
diff --git a/contrib/pg_prewarm/sql/pg_prewarm.sql b/contrib/pg_prewarm/sql/pg_prewarm.sql
new file mode 100644
index 0000000000..29646f5835
--- /dev/null
+++ b/contrib/pg_prewarm/sql/pg_prewarm.sql
@@ -0,0 +1,28 @@
+--
+-- Test pg_prewarm extension
+--
+
+CREATE EXTENSION pg_prewarm;
+
+CREATE TABLE t1 (c1 integer);
+
+INSERT INTO t1 VALUES (1);
+INSERT INTO t1 VALUES (2);
+INSERT INTO t1 VALUES (3);
+
+
+--
+-- prefetch mode
+--
+SELECT pg_prewarm('t1', 'prefetch');
+
+--
+-- read mode
+--
+SELECT pg_prewarm('t1', 'read');
+
+--
+-- buffer_mode
+--
+SELECT pg_prewarm('t1', 'buffer');
+
diff --git a/contrib/pg_prewarm/t/001_basic.pl b/contrib/pg_prewarm/t/001_basic.pl
new file mode 100644
index 0000000000..3fcb438d07
--- /dev/null
+++ b/contrib/pg_prewarm/t/001_basic.pl
@@ -0,0 +1,34 @@
+
+# Copyright (c) 2021-2022, PostgreSQL Global Development Group
+
+use strict;
+use warnings;
+
+use PostgreSQL::Test::Cluster;
+use PostgreSQL::Test::Utils;
+use Test::More;
+
+
+my $node = PostgreSQL::Test::Cluster->new('main');
+
+$node->init;
+$node->append_conf('postgresql.conf',
+ qq{shared_preload_libraries = 'pg_prewarm'
+ pg_prewarm.autoprewarm = true
+ pg_prewarm.autoprewarm_interval = 0});
+$node->start;
+$node->stop;
+$node->append_conf('postgresql.conf',
+ qq{shared_preload_libraries = 'pg_prewarm'
+ pg_prewarm.autoprewarm = true
+ pg_prewarm.autoprewarm_interval = 1s});
+
+$node->restart;
+
+my $logfile = PostgreSQL::Test::Utils::slurp_file($node->logfile);
+
+ok ($logfile =~
+ qr/autoprewarm successfully prewarmed 0 of 1 previously-loaded blocks/);
+
+done_testing();
+
On Wed, Jun 29, 2022 at 02:38:12PM +0900, Dong Wook Lee wrote:
Hi hackers,
I wrote a test for pg_prewarm extension. and I wrote it with the aim of improving test coverage, and feedback is always welcome.
The test fails when USE_PREFETCH isn't defined.
http://cfbot.cputube.org/dongwook-lee.html
You can accommodate that by adding an "alternate" output file, named like
pg_prewarm_0.out
BTW, you can test your patches the same as cfbot does (before mailing the list)
on 4 OSes by pushing a branch to a github account. See ./src/tools/ci/README
--
Justin
Justin Pryzby <pryzby@telsasoft.com> writes:
On Wed, Jun 29, 2022 at 02:38:12PM +0900, Dong Wook Lee wrote:
I wrote a test for pg_prewarm extension. and I wrote it with the aim of improving test coverage, and feedback is always welcome.
The test fails when USE_PREFETCH isn't defined.
You can accommodate that by adding an "alternate" output file, named like
pg_prewarm_0.out
FWIW, I'd tend to just not bother exercising the prefetch case.
It doesn't seem worth maintaining an alternate expected-file for that,
since it's not meaningfully different from the other code paths
as far as this code is concerned, and testing PrefetchBuffer itself
isn't the responsibility of this test.
I tried this patch locally and was disturbed to see that the
code coverage of autoprewarm.c is still very low. It looks like
apw_load_buffers never reaches any of the actual prewarming code,
because it never successfully opens AUTOPREWARM_FILE. This seems a
bit odd to me, but maybe it's because you start and immediately stop
the database without causing it to do anything that would populate
shared buffers? This bit:
+ok ($logfile =~
+ qr/autoprewarm successfully prewarmed 0 of 1 previously-loaded blocks/);
is certainly a red flag that little of interest happened.
Keep in mind also that the logfile accumulates over stops and
restarts. As you've coded this test, you don't know which DB start
emitted the matching line, so the test proves a lot less than it
ought to.
I wonder also about race conditions. On fast machines, or those
with weird schedulers, the test script might reach slurp_file
before autoprewarm has had a chance to emit the log entry you want.
regards, tom lane
Hi,
First of all, thank you for your feedback.
2022년 7월 31일 (일) 오전 3:25, Tom Lane <tgl@sss.pgh.pa.us>님이 작성:
Justin Pryzby <pryzby@telsasoft.com> writes:
On Wed, Jun 29, 2022 at 02:38:12PM +0900, Dong Wook Lee wrote:
I wrote a test for pg_prewarm extension. and I wrote it with the aim of improving test coverage, and feedback is always welcome.
The test fails when USE_PREFETCH isn't defined.
You can accommodate that by adding an "alternate" output file, named like
pg_prewarm_0.outFWIW, I'd tend to just not bother exercising the prefetch case.
It doesn't seem worth maintaining an alternate expected-file for that,
since it's not meaningfully different from the other code paths
as far as this code is concerned, and testing PrefetchBuffer itself
isn't the responsibility of this test.I tried this patch locally and was disturbed to see that the
code coverage of autoprewarm.c is still very low. It looks like
apw_load_buffers never reaches any of the actual prewarming code,
because it never successfully opens AUTOPREWARM_FILE. This seems a
bit odd to me, but maybe it's because you start and immediately stop
the database without causing it to do anything that would populate
shared buffers? This bit:+ok ($logfile =~ + qr/autoprewarm successfully prewarmed 0 of 1 previously-loaded blocks/);is certainly a red flag that little of interest happened.
I think it was because I didn't have much data either.
After adding data, coverage increased significantly. (11.6% -> 73.6%)
Keep in mind also that the logfile accumulates over stops and
restarts. As you've coded this test, you don't know which DB start
emitted the matching line, so the test proves a lot less than it
ought to.I wonder also about race conditions. On fast machines, or those
with weird schedulers, the test script might reach slurp_file
before autoprewarm has had a chance to emit the log entry you want.
I have no idea how to deal with race conditions.
Does anybody know how to deal with this?
Attachments:
Screen Shot 2022-08-01 at 11.59.41.pngimage/png; name="Screen Shot 2022-08-01 at 11.59.41.png"Download
�PNG
IHDR � 3��� liCCPICC Profile H��WXS��[RIB %�&�� RBh��FH %���b/�
�]D���"�m��]Y{_,�(��.6T��t�W�w�o��s������ �|�,��@Z(O�a�L�`��"@0 �/P�8��1 J�����@T��.*���W�� ��g �������� Uz���2� ���
�Q��*�����l��_�L���9 0�A=�H�y�!v�
%R ��@(���bRP0^�+ v��2�a<���g�����������O���,�?��,����|e�;8hbyd�*X�[y��U�q�4+6NUk�?H����R����=j*Ppa��!�nB~h4���K�cc4��lI8b�[�I�B^2�F�)��46��5���l9���������|=P��p4�o�"��c��� �BlS$I�����"/)Zc3�X�����+U��@�(�F�����lyx����@��/�Q,��j��Bqr��>�)�/~�vY$�����#c�s�B���c�E��$
�YaH�z-N���k�q+Q~�Jo���(I�O-��S��g�
���q�����xu<�� ���,0�IKg}'��� | 9@\4��i}3RxM���D@1�.�oV�����V}u�}�E}+��S�@4����}���R�����;�7�����k�i8P��(�=���-�a�Pb$1�������?��p��l��?�o����V�#�uB��8�l�Q� m�?\S���k��AN/<���7�M�� �p� ��j���UUa�����{;���S~\�pbx
��j�}}��f
��;0���w��{����|l?v;���c�����f��
��'}���[b_<y�G��OVUI�[�[��g�\�hR���q��&�%9�B�D,�T�:�������]���z���A�����@�����C�tQ� �����o:6 �Z �;(P���:\u!� mx���9�0w�
�A0Q $�t0F/��\&��`(e` X ��
`3�v�}�'�p\��]�{��K���AHa"��b�8#� D��$IG2�D�(����Y��A6!��^� r9��"���H���b(
�G�P;t(�F9h4���As� h1:]�V�U�N�=�^D��m�K��f�Yb.�bqX�����X)V�Ua�X#|�W�6���q&��]���Sp>��/�����:�~�w�_ t�)���G�Fr %�r�V��ix�� ��D�!����b:1�8�������x��J|L�&�H�$gR )��'�JH�I;I�HWH��d-���N� K��������+�g�����G��)�)�)[(��K�vJU�jO
�&Ss����Z�i�=�[---+-_�-��L�
�=Z��j}����h\�h������v�v���N������B�"z5�$����pe�B�F%��q��J��m����]�]��_��v�E�N������S�sP��N�.Sw�n�n��B���u���������zs�6���{����L.S�����<�l�'�����s���w���w�x�L2�48b�f����
�3�a�i�� � ���j]��h�Q�����h��u�O�,�0�<������Mp'���&�MN�t��?X0�t���wLQS'�D�)��M�M����"�df��N�u������0?j�a����X��8f��e����Y�S�.KS�HK��&��+{���V���[S�����+����l,lF�L����cK�e��mW���}ogo�f7�������=��������!�a�C��5G�#�1�q��e'���I�T�t�u�v�8�snB�;D:�j�M����������k��l�z�WCm�f]:����n^n�n[���5l���ao�������<��3<<^{:{�<�{��bz����������[�]���c������&[��^�>�K�
���{�����_��>�?�]���w�?n?\4|���V��Mm�������mA�A����G��������8��\�N���y����\?�4��P,4"�4�%L/,%lM��p���������)�# ���K#o��x^5�+�'jZ��hZtR���G1N1�������G���������8^��������%�*�&K��x6��4.iG�������wSR�)M����S�S����-Kk9t����M�%�
��������F��>�kt��c��Ls~�����G�i�����I�L��������wg���fu ��U���`�
a�(@�L�,; {Y������9� q��S�����������>/.o[^o~Z��rAf�A��4Ozj���I�[e��Y�� +'t���[�b���P~�7+�?)U}��:q�$�I�I���&/���8���)������SgM}8�3m�tdz����3��h�1s�,���Y��v��l�_s��4�5�;s���"~�)a��Kn����a>>_2�e������
K/�����}^(Xx��a?W���({Q�b�����H��X�t�2�e��/��nkE���V�[y���|�*�*��������6�����F��zeH����k�}�N��������6�m��Q�����MuUvU�����6?�����/�_���l-��e�t[������}��w��X\��(k:v��yyW���Z��M�
w��{�{^���{c_������������ �@iR7���^\�����z0�`S���C����<\y�������s��+>�}\v��D���M����y����S-��O�;~��Y��c��>�w�������������������K>�.�^nl�z�J��WC�����v�z���)7n�}���������_�)��sw�=����:���>������m�mG�>l~����c���OO>��}JZ���Y�s���;�;.������eOg���}����?��l����Z�������o����WSw|��w�z��~0���#���Oi���L�L�\���K�����zz{e|9��S �����6 �� 0a�F���Q��}�'�����Z���� �nn�gl� �6�U�� $���c`hD�������>�����-��H�����������f,��K�=�J��g��%� �Q�������"�?���������F VeXIfMM * �i �� D� �� ASCII Screenshot��YH �iTXtXML:com.adobe.xmp <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="XMP Core 6.0.0">
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<rdf:Description rdf:about=""
xmlns:exif="http://ns.adobe.com/exif/1.0/">
<exif:PixelYDimension>2334</exif:PixelYDimension>
<exif:PixelXDimension>4064</exif:PixelXDimension>
<exif:UserComment>Screenshot</exif:UserComment>
</rdf:Description>
</rdf:RDF>
</x:xmpmeta>
��uG @ IDATx���v��&gwn���������BD��J%K����9)��D�K ���?�#
���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������i��o����/x}���u&�f�u('�N�[l�)���:#>���o��f<�{�cb����F����:#>��io��f<�{�cb����F����:#>��io��f<�{�cb����F����:#>��io��f<�{�cb����F����:#>��io��f<�{�cb����F����:#>��io��f<�{�cb����F����:#>��io��f<�{�cb����F����:#>��io��f<�{�cb����F����:#>��io��f<�{�cb����F����:#>��io��f<�{�cb����F����:#>��io��f<�{�cb����F����:#>��io��f<�{�cb����F����:#>��io��f<�{�cb����F����:#>��io��f<�{�cb����F����:#>��io��f<�{�cb����F����:#>��io��f<�{�cb����F�*�{���*C B ~�����b������G �c��c�mK�'������zqO����O��>����������3�P���{Xf[��N�gK��?�����o�e��&m��+�����i?��Gs��6c��hC���{k����8_�<~8f�m�'����5.���q�K�_��mL���Qk��6���������)e������:b�mK�'��3x �f������O��:E�~��1�m36��6��]�r��o���)�liS�'6�b[[�<�M�L����xe���1����h�c��fl�m���o��o�<1���������Y����%�S3�u)������S�3j�c��f<��P:c2qc8�����?uC�PG��mI���zD����V����S����>9f�m�������k\�a��m=�:��-mJ��F\lkk���i�����q��/��6��P��q�~��M;�
�7�����m�'��|�������8�����j��.e���1}�~F�q�~���JgL&.b�|������������v��
�����{��-�����M ���u�3�y���|�9����g]~y.��@g��s�sX��~����s^�7��%Fb��������m;�6�����}�8�"�?��:V|��h3�����k����}�6��[�Q�U�Y�}}VK�'����A��c����G}���?�.M(���)�?����(�,�,�,�,��>+���������}�����zFxf���@��uLU��c}F�w�w�w�w���Ya,��,�^���3���������3�3��{!Q�yS���S�)���'V.`"��1�%<���6%t��{|���!���hQ|%��Y���Q��:G�|'�N�:$|�Hs��Y�K�`�5)���u�,�~��k9���kR�K���W����� �+�
}�mJ��;�s���&%�������)tRWS�l���:�����3��%�������)���8������� �����YW�(������OA' u�1u�v�'��N�w,����:E /e�'�3}
:�+��k��?�uB�c9�g��)Jx)�?���S� H]qL]���������?��NQ�K����L��N@��c����O�G���XN��uu�^��O�g�tRWS�l��?��~�r����S��R��?��������f;���Q'�;�Sf]����2����>�����5�����:�����3��%�������)���8������� �����YW�(������OA' u�1u�v�'��N�w,����:E /e�'�3}
:�+��k��?��<�L��,�[�C}b��Y��\c�������?
�o����M��� m�(�����f�q���#����1�����0������:������o�6�����������y1��)!�����_�����6�E{b����������~�/S�������������7����Q�::<w,�
�C}���8%�����t�v��':/���7����Q�:;=w-�
�C}���8%������[�Q�U��9Q�u}6���)��wY����2��qJ�������������s����l�SF�+�*�2��T7��e����P�W�W�W�W�W���D����(.����W�U�e�e�n�����)�������_'��[L����MC_�����%a���O o��R���*�:Jt�'�����1�A���������_��#<�����<�6ud�0vK���:���E����!�������-�(�*�,�^1?�Y�?v�U�����s�I�w����;&,�p>7������8C����������������������������V^}�����PX��K�/��t���z u�������������������~�����������������^>���?w���������O�o�?�����q&����Hs����r���g �%-N�pY��du$�[���KI�<����a>���\_����8��_c
N���e����>���P���A,:�?���YQ��|���>��{���Q�Q��}��w�pS�)������������aE��g��S�g�'���{Y��-�M��)��I�_�_�_�_�_�_�_�d,�����C�w�w�w�G��:+���9�aA��u����?�?�?�?�?���?N_I;)�.�.�.�.�^^��{�����K/�B<��l]Y(��������{�Nm�!Q��o�;��w��{z:ne��7F �����YR�������H� ���cI�uy)}�����}��2o���F�.f��Y����qH���G;�Af�
6�H����1��R�0�C�1�h�?�l�����Y2f]^J�!y�;f����7�@`#Q3K���K��8$u���� ��l$�bf��uy)}�����}��d6�`��D]�,�./���<���v����l �����%c����a���c����x�
6u1�d����>�C�Pw�>��2o���F�.f��Y����qH���G;�Af�
6�H����1��R�0�C�1�h�?�l�����Y2f]^J�!y�;f����7�@`#Q3K���K��8$u���� ��l$�bf��uy)}�����}��d6�`��D]�,�./���<���v����l �����%c����a���c����x�
6u1�d����>�C�Pw�>��2o���F�.f��Y����qH���G;�Af�
6�H����1��R�0�C�1�h�?�l�����Y2f]^J�!y�;f����7�@`#Q3K���K��8$u���� ��l$�bf��uy)}�����}��d6�`��D]�,�./���<���v����l �����%c����a���c����x�
6u1�d����>�C�Pw�>��2o���F�.f��Y����qH���G;�Af�
6�H����1��R�0�C�1�h�?�l�����Y2f]^J�!y�;f����7�@`#Q3K���K��8$u���� ��l$�bf��uy)}�����}��d6�`��D]�,�./���<���v����l �����%c����a���c����x�
6u1�d����>�C�Pw�>��2o���F�.f��Y����qH���G;�Af�
6�H����1��R�0�C�1�h�?�l�����Y2f]^J�!y�;f����7�@`#Q3K���K��8$u���� ��l$�bf��uy)}�����}��d6�`��D]�,�./���<���v����l �����%c����a���c�������m��\����C@%��v���H�����/iP��J
��� �q.�%}m��M�c��q�S*�����\K��������"���F��uB��v���m(�������9���w�3�o�K=[�?���?�.��L�V��vT�Q����X�U�U�U�e<U�Y�]����7��J{��n���%�s��������g������i�G�G���'f�@al�������d|�S�Q�Q�Q����/y�pvt���t��4�g�x�u�nl�?�N�Z���������������o��������������O���\��J{1�(�����%M�?�?�?�?�?�?8�?8'83����7�_�^K���_ ���G204(��8}�|�������tl����g�|[x��8���q/J1�tL�(��m���e���d��6����������w��c�����?��G����`1��A���O=#����K��K�����<��e�������}� �O�~�X:�\��O���Qo,�?XL�}���g�SO��~��;��1�R��?��zc���b�?��>D?C�zF�S��9��9�2���A?x�����A�!���0������t����������X����������������w��c��������2�����}�~�>����n�s,s.e�'��~��7��,&��>�C�3��'`d?u��c��s)�?���G����`1��A���O=#����K��K�����<��e�������}� �O�~�X:�\��O���Qo,�?XL�}���g�SO��~��;��1�R��?��zc���b����;�����#0����o��)��>�n�aC� �o���!J
z����k�/w8�<�~����9��W���$��_z��-[�v�?���k������;���W���v������0���������7�����aK�S����u�t�����0�C����]��9����?H/8i;�S���fbd]|���0���A�3�!����(����C���#^���|�����u�:D[}��������P?(!uH��?�������P�Q�Q�����/������_���P�anA�`>A �l��#������/tA�9���������)����Y�?1�����u���B;�
mG|�/1�<��\�s��/�C�������aA���_�?��\T����H}���v�t�v��?���/�I���������Q���@���C�)�,b A�i�����^����
�Z�O��|�uJ�����aaB��'S���6|P�����h���������
��� T�U���4b�~���g���;�'�.���-�6�?�?�?�ct�v�v��� ��&8'x�?�?���>�q!�lS�g��m�f�>(���UG�F����?���o�mm�alm���e�1�x��o�WY����������V��&���j[������������o���o�mm�alm���e�1�x��o�WY����������V��&���j[������������o���o�mm�alm���e�1�x��o�WY����������V��&���j[�����������e��[�?��XT�@<@`��*��4��;�1y)���>�a�������;��s��7�Cp�&���1K�&���9��s^+����Y���-�����?�?���#�,:����}{��
8IS��K����,�&V�31�.fg,���n�kb*~�[� q�U��0��vf=�[>[\���O�G]�zhO�8�������8�*��~I�����)}b�������J|&f����e������/S���-�?���j����������r�')��:&���E��-m��">3�bv�2����z��L�R����@����v�6������
8I���0Q��/��oi�����Y�3��_����e���c�e��XM�3x������\l�IJ�������~QfK[����������L�:����/S���-�?���j������u����bNR��uL�%��2�[�2uE|&f����e���7�}�:���o����5VG�m����/p����3`�.�_������+�31�.fg,�����7���)��~��$���8jg�hc�o}�����'�������!� ���yt�������O]���\�c���J9��%c�h����o��z6���+���Y~4������Xv����o��hO`������.`�W�'��.��M`��������
��������~�PW�����o��C�C9���S�����".�K���J\���G�1QW(���u��W��������n��E[�n�'��.��M`�4��Yg��)������PW��E]�n?}�������p�8R�:c�%�bO�o��������_��.`7���^@��f�1��)�f�tB]Q/�u����Q�������A�H9������<����+���������zM��u��W������ uE�@_����G~��j��#��3^b*v����J\�K�����e�v�N��4mn��_�rn���A'��}QW��Ou��;�� $����x�����+q/��n������:�~����Yg~u���_��PW��E]�n?}�������p�8R�:c�%�bO�o����������c�7�'���c����7����6��}y��B��d�m����s
J�~�q��}<�A9��=�/$
��g�1�>+�wc����:�_�e�Y><:�������Z�?����e�<�"}--p��o�W� �j���g�G�����xC;)�(�*�\gJ�w�w�w�w�7��"cmZ����_�����_�/i^��C��>���}��������4N������_��t���s���?w���R��]������y���_������_�����k����v���{�����8���������������{���{�uIf���6���6c�%�q
J�������s�|��<�l3��{���������f�H�?���?������6��i�s�Y|��h�����u����>�0bJ�R>����q����O����=�r?��<����<�)g2���/��|�N�J�B�_���Y~T���.��Y����[���C�W�g�w�G�W�g�w���t�����������\������`��3(,����������Ut���3g����_��Su���K�/��t���K�/;~4f��e�
�
�?t�@
u��p�g�/��t���Ol����_����X������d�9U����v���k�������2&1N���1��}����I�}�&/k)�~x��4_���-���?� 9�{�@5N����4`����W�c�������a
�1��#���v ���d����|��wT���qy�I?�+c���9����m�qy(Yk���9��?0��O����h������-\�?K'��X�������[�Q�5����k��4�(� �k{)���6����0�n�?�?��um������v�^�:����W����
���V��l�g�#�����������ZG���������oc�����<[�?���?�?�?�?<#�%�{FP���x����F���������/s��/=[�l-�*�*�*�*�*��� ���AY�U�5����k�f~$�r���_����~�������o��O��_�w����������@��7�|��P����k��`s�u�1�5��z��:���������|�
�<��_��d2�=rH�+���������\K���1�:O����{QF�n������/�������-��q]���������6D_�������gH�G�>��k��~��^�]�]�]�]��c��oN���������a�[��v���������)��v��>�������X��������c�?�f�A�l��8��?�?����m���z�G�G�G�G�����?8�?�?����a���v���������)��v��>���������
BW�y�;�}��C��g}�����o�@z�,����|z�1�����YS�s/�w�}�������������*:�d����6<��s����G��~�k�wT_��?#�}L�����)��L��C�����P�����`Mhbq�C��<�U�g�;�X�"+������[uK=O����O������8�3�����O����?�������f�9����_�>���������8ZY�Q��N�q�u���zC��������{�����R���i�w�w���#�������;�.��X��m���s}(�.�.�.��9��[��Ov���C�;��Gv���C�;��� �(������}n�������V�������O ��;?ubM�<�R��3�����O>��I�Ys����R9���~D����8�����P��x��;Pq)���%m� ��}�c8��C�g�V�>�9G�Q��;�G6r�E{�rI~���� ���&}����ss ����i�/�I������o���s���s��g�����_�����'���D���E9I����;~(�,�4�,�*���U�'�����#m��(�+�(���B*�*�B�?�O-�,��-�,����2�2��<�%|��9���m����4����������[���~T�:y�J�(�s��u!�<���i�7��
������+!��~u��;��Q�����B�y����o�W����o�WB�Q���Qw(����yG��h��7�����6����N�����������P�G)��������nL���_m(�����_ �G���G����R>�]���w�_���W�}g��G����K�Z�7?����8}>s�~Xsmq�������� ��k@iU�i$�)!x�;+��.my���hs-���<�<�y$�_/8���1�����q��>��C/��8}g��3o����QJ�:����B>k��=��{`�?n�������w��/�������%������?����,�x.���G�������s�XH�S��)�*�*�*�*���E�W����������''��g�g�'z��]6�*����JH������^:;���y9C�?���?�=���C�����������s�
?���?��[_���������7�������k�C�W��9~*�.�F'x��^�t������un�S�8�����O�E�������7���������?�
������k�Wcv}
����%���g���������������:�E�z��3�q�i�w}���le9~���-����wu>�;GY��o�Y>c��!0�������Qy'*7X����1D�}����i4�SB�3>J�p(s�-���t��q9�:���]W���� ��}�'�y��)_�G�9������]��|��s���[gL��eom��|��C�5��l���+x��1�����m[���#����/���]gn��>o�P��>S��s����c�S���PO�eicK�������������/����orFB��;� �
J����O���B=)�\v���E�G�G�G�G�G�G�G�W���7������S��y%O�����sc�����+��������9G�����k�[�T���T��\��m|��6�I�W�����Z��>�;������;��F���S��q�gJ�����sc��b5����Ai�B��i�\>�.������:I��������)���(����S�
����^����E������]��5��R��uyo����}�9U��
�
1Qj����P�(���9��O���u�G��O /�Z��������aL�t�4p���t
��E���G����w=J��u��g��|��)����.�3�]���H>�|���p��QPX��-����>��=��
����?�N�01���-�@/�����}@�_~�'x �JuC{������0NWg�+�X�[�_�_�E���A��=O�{�0�K�����?�?�?����_�#���?������k�.�,�$.(�$s,�4���oPX����!@�\B}��X�/�?u���[�o��u���N������������������������� ��e��O0�������1����������C��t�����{��}����3%DyO����|�������{2W�d=���6��m�(�|�}7�@��������:c��s]O��-�����!�BNRQQ�3���O���wM�R��>^�>��Um��5�����|��A�O�X�,�y���k��3������t]H9���9��@���,�����w
K�SB��D����/�����3>���~��'�}�����3��:�3���[���k����/�C/�������C�+��o(�&��
�$�[�A������ 4~d��o����
5���v,����k���/�s����#��������}�0�Km���}-�@������ 4~����o�w�
���&:^�������������/m����s���5W��{�P�]�]�]�����L�r��{��Oc���}�������f��?������4c���U]q\��<���������X��X���!���E��P�&�}���z�>�3�����6V<�5d���������/���A/�u�2�������'����r���C��<��~M��w��������_�~g����l2�Q*���_��|_������K������K�hS�}o����|�b�$�g_�w8��{�/L9+3�8�������9����|���a=����4
�|S>�S���6�Hs�]�>�B����y�����Bg��Y_r>m�������y���m�����a��})��9f�=��`�)��W>�)�w�2���buT������|��c��?�����-��Y:������]:p�
����$k
��7���w��������?�?���������ot ���9V��?t��|?��7�?t���C��?t���������_���������������Ww�x}���c���?�;��7�?v���c���?v��U���������_���������m$}�g���|����n�?�����\d3N[��z��P��K���3>��|����g��+�e���= ���#���|�}���:�z� �
��uIeWq52
>�h��M(!��~��~�1
y��>����R����{hd�����|��Q�8_������R>kK��}����w�]�j������?����?���������_��u�g�W���/$������������A��c�M�����_�����u����kaQ�U�U�U�U���a�G�G������?�?�?�?�?���X~�(�s��N��>l��81E�//���=)�.�.�^�P�]�]�]���l��)�,�D ck�������1*�(�*��>��������3}������������ �W6/�|��#���d.�y�G�������)���j��!�=F ��Jf�P�r�r�J�\����������F�|��q��9��)_����e_�{d\B�2��u�X:G��:�A���N�-������G�(�,������g����u�N-����������(��6"&��/<�K��1�����o����X`+�_PX����r��#�����g�?`��kI_�o�G������sm,���_������������[������g.�nK��������m����{c��,��E����������z��o���9f��;,�+�(�(���Q��c��������������?�?��f�9�X�y�%}�������6�?w�U����W����_%��,���P��|7�?��[Cb\=���f-��C�J�c��u� �3�����Q��������&�3�hK�O�s]��w��{������,�9kf?�"