no test programs in contrib

Started by Alvaro Herreraabout 11 years ago32 messages
#1Alvaro Herrera
alvherre@2ndquadrant.com

What's the general opinion on having test programs somewhere other than
contrib/ ?

We currently have a number of subdirectories for test-only programs:

test_parser (a toy text search parser, added in 2007)
dummy_seclabel (for SECURITY LABEL regression testing, added Sept 2010)
worker_spi (for bgworkers, added Dec 2012)
test_shm_mq (test program for shared memory queues, added Jan 2014)
test_decoding (test program for logical decoding, added March 2014)

I'm now contemplating the addition on a new one in the commit-timestamps
patch, and I'm starting to feel that these are all misplaced. I think
we have been dumping them to contrib not because they really belong
there, but because of the lack of a better place. As opposed to the
rest of the stuff in contrib/, they don't serve any useful purpose on
themselves; they are just demonstrating some coding techniques, or
testing that some framework work as intended. It seems impolite to
continue to pollute contrib with these; and my crystal ball says they
will continue to grow much more rapidly than normal, useful contrib
modules.

What would you say if we were to move them to src/test/? I could also
see putting them in a brand new top-level directory, say testing/ or
testprg/.

Now, I know there is some resistance to the idea of moving source code
around. If this proposal is objected to, would people object the idea
of putting the commit timestamp test module in src/test/commit_ts
instead of the patch author's proposal, contrib/test_committs?

--
�lvaro Herrera http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#2Petr Jelinek
petr@2ndquadrant.com
In reply to: Alvaro Herrera (#1)
Re: no test programs in contrib

On 24/11/14 14:49, Alvaro Herrera wrote:

I'm now contemplating the addition on a new one in the commit-timestamps
patch, and I'm starting to feel that these are all misplaced. I think
we have been dumping them to contrib not because they really belong
there, but because of the lack of a better place. As opposed to the
rest of the stuff in contrib/, they don't serve any useful purpose on
themselves; they are just demonstrating some coding techniques, or
testing that some framework work as intended. It seems impolite to
continue to pollute contrib with these; and my crystal ball says they
will continue to grow much more rapidly than normal, useful contrib
modules.

Completely agree.

What would you say if we were to move them to src/test/? I could also
see putting them in a brand new top-level directory, say testing/ or
testprg/.

Now, I know there is some resistance to the idea of moving source code
around. If this proposal is objected to, would people object the idea
of putting the commit timestamp test module in src/test/commit_ts
instead of the patch author's proposal, contrib/test_committs?

I'd go for src/test, but I think common subdirectory there is needed
(src/test/<something>/commit_ts). Not sure what the <something> could
be, maybe something like "standalone" as those tests get their own pg
instance?

--
Petr Jelinek http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#3Andres Freund
andres@2ndquadrant.com
In reply to: Alvaro Herrera (#1)
Re: no test programs in contrib

Hi,

On 2014-11-24 10:49:45 -0300, Alvaro Herrera wrote:

I'm now contemplating the addition on a new one in the commit-timestamps
patch, and I'm starting to feel that these are all misplaced. I think
we have been dumping them to contrib not because they really belong
there, but because of the lack of a better place.

Agreed.

As opposed to the
rest of the stuff in contrib/, they don't serve any useful purpose on
themselves; they are just demonstrating some coding techniques, or
testing that some framework work as intended.

I actually think that test_decoding is somewhat useful in other cases as
well, so it might be prudent to leave it there.

What would you say if we were to move them to src/test/? I could also
see putting them in a brand new top-level directory, say testing/ or
testprg/.

src/test/ is good, but I think there should be another subdirectory
inside. testcases/?

Greetings,

Andres Freund

--
Andres Freund http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#4Tom Lane
tgl@sss.pgh.pa.us
In reply to: Alvaro Herrera (#1)
Re: no test programs in contrib

Alvaro Herrera <alvherre@2ndquadrant.com> writes:

We currently have a number of subdirectories for test-only programs:

test_parser (a toy text search parser, added in 2007)
dummy_seclabel (for SECURITY LABEL regression testing, added Sept 2010)
worker_spi (for bgworkers, added Dec 2012)
test_shm_mq (test program for shared memory queues, added Jan 2014)
test_decoding (test program for logical decoding, added March 2014)

What would you say if we were to move them to src/test/? I could also
see putting them in a brand new top-level directory, say testing/ or
testprg/.

I think that test_parser is arguably useful as a skeleton/example for
user-written TS parsers, so I'd lean towards leaving it where it is,
but the others could move to src/test/ IMO.

Now, I know there is some resistance to the idea of moving source code
around.

Usually that's when there is (a) a lot of history and (b) concern about
back-patching fixes. Neither of those arguments seem real strong for
these modules, with the possible exception of test_parser.

regards, tom lane

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#5Noah Misch
noah@leadboat.com
In reply to: Alvaro Herrera (#1)
Re: no test programs in contrib

On Mon, Nov 24, 2014 at 10:49:45AM -0300, Alvaro Herrera wrote:

What's the general opinion on having test programs somewhere other than
contrib/ ?

General opinion: slightly favorable.

We currently have a number of subdirectories for test-only programs:

test_parser (a toy text search parser, added in 2007)
dummy_seclabel (for SECURITY LABEL regression testing, added Sept 2010)
worker_spi (for bgworkers, added Dec 2012)
test_shm_mq (test program for shared memory queues, added Jan 2014)
test_decoding (test program for logical decoding, added March 2014)

What would you say if we were to move them to src/test/? I could also
see putting them in a brand new top-level directory, say testing/ or
testprg/.

It's revealing that two of the first three responses each doubted the fit of
one of those moves. I think that shows the lines aren't so bright after all,
and this specific proposal is not strong enough. The line between a test
module and a sample-code module is blurry.

Now, I know there is some resistance to the idea of moving source code
around. If this proposal is objected to, would people object the idea
of putting the commit timestamp test module in src/test/commit_ts
instead of the patch author's proposal, contrib/test_committs?

I'd rather defend moving source code or defend continuing to dump in contrib
than defend a src/test/modules defined as "test-oriented modules added after
November 2014."

Incidentally, +1 on "test_commit_ts" in preference to "test_committs".

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#6Peter Eisentraut
peter_e@gmx.net
In reply to: Alvaro Herrera (#1)
Re: no test programs in contrib

On 11/24/14 8:49 AM, Alvaro Herrera wrote:

What would you say if we were to move them to src/test/?

Yes please.

Now, I know there is some resistance to the idea of moving source code
around.

I think clarifying "contrib" is more important than that.

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#7Peter Eisentraut
peter_e@gmx.net
In reply to: Andres Freund (#3)
Re: no test programs in contrib

On 11/24/14 9:35 AM, Andres Freund wrote:

I actually think that test_decoding is somewhat useful in other cases as
well, so it might be prudent to leave it there.

For what?

src/test/ is good, but I think there should be another subdirectory
inside. testcases/?

What tests are not test cases?

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#8Peter Eisentraut
peter_e@gmx.net
In reply to: Tom Lane (#4)
Re: no test programs in contrib

On 11/24/14 10:46 AM, Tom Lane wrote:

I think that test_parser is arguably useful as a skeleton/example for
user-written TS parsers, so I'd lean towards leaving it where it is,
but the others could move to src/test/ IMO.

I think a useful dividing line would be, is it normally useful to
install? A skeleton is still useful if it is in a different place in
the source tree (arguably more useful). It's not useful if it's
installed as a *.so.

Usually that's when there is (a) a lot of history and (b) concern about
back-patching fixes. Neither of those arguments seem real strong for
these modules, with the possible exception of test_parser.

Have we ever really tried to use the various git options that are meant
to help with that (in a recent git version)?

(If not, now we'd have a chance to try.)

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#9Andres Freund
andres@2ndquadrant.com
In reply to: Peter Eisentraut (#7)
Re: no test programs in contrib

On 2014-11-25 16:07:52 -0500, Peter Eisentraut wrote:

On 11/24/14 9:35 AM, Andres Freund wrote:

I actually think that test_decoding is somewhat useful in other cases as
well, so it might be prudent to leave it there.

For what?

src/test/ is good, but I think there should be another subdirectory
inside. testcases/?

What tests are not test cases?

There's infrastructure for tests in there already. It seems like a bad
idea to me to have individual tests on the same level as
src/test/regress and src/test/isolation.

regress/

Greetings,

Andres Freund

--
Andres Freund http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#10Tom Lane
tgl@sss.pgh.pa.us
In reply to: Peter Eisentraut (#8)
Re: no test programs in contrib

Peter Eisentraut <peter_e@gmx.net> writes:

On 11/24/14 10:46 AM, Tom Lane wrote:

I think that test_parser is arguably useful as a skeleton/example for
user-written TS parsers, so I'd lean towards leaving it where it is,
but the others could move to src/test/ IMO.

I think a useful dividing line would be, is it normally useful to
install? A skeleton is still useful if it is in a different place in
the source tree (arguably more useful). It's not useful if it's
installed as a *.so.

I agree that where it is in the source tree isn't all that exciting
(for any purpose other than back-patching). What is exciting is what
the context and build infrastructure look like. The fact that test_parser
is packaged as a .so and can be built with PGXS makes it very easy to copy
as a skeleton for a user-written parser --- you don't need to invent your
own Makefile, in particular. Now, maybe we'd retain those properties if
it were under src/test/, but that was not immediately clear to me.

Agreed that it shouldn't be installed as part of a standard binary
distribution, though. We could potentially fix that while keeping it
in contrib, but maybe relocating it would be clearer.

What do we do about docs, though? These things do need some user-facing
docs, or people won't even know they exist to be copied.

regards, tom lane

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#11Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Alvaro Herrera (#1)
Re: no test programs in contrib

Here's a patch. This creates a new subdir src/test/modules and places
the five initially proposed modules in there. They continue to have
their makefile with the same ifdef USE_PGXS pattern; they are no longer
installed by default.

Because many of them had either "test" in their names or some other
now-useless particle, I renamed them:

worker_spi -> bgworker
test_decoding -> logical_decoding
dummy_seclabel -> seclabel
test_shm_mq -> shm_mq
test_parser -> tsparser

The renaming is not complete: the extensions continue to have the old
names, for instance. If the consensus is to rename them completely I
can finish that, or we can decide to keep the original names, but they
all seem inappropriate to me.

I haven't done anything about documentation. I thought a new chapter
after "Additional Supplied Modules", perhaps entitled "Additional Sample
Modules" would be appropriate.

I tweaked make targets check, installcheck, installcheck-world,
check-world: they all run the additional tests now. For buildfarm, the
client code will need to be updated to have a new stage for
src/test/modules running "make check".

I haven't touched MSVC yet.

Opinions on this approach please?

--
�lvaro Herrera http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#12Robert Haas
robertmhaas@gmail.com
In reply to: Alvaro Herrera (#11)
Re: no test programs in contrib

On Wed, Nov 26, 2014 at 9:27 AM, Alvaro Herrera
<alvherre@2ndquadrant.com> wrote:

Here's a patch. This creates a new subdir src/test/modules and places
the five initially proposed modules in there. They continue to have
their makefile with the same ifdef USE_PGXS pattern; they are no longer
installed by default.

Because many of them had either "test" in their names or some other
now-useless particle, I renamed them:

worker_spi -> bgworker
test_decoding -> logical_decoding
dummy_seclabel -> seclabel
test_shm_mq -> shm_mq
test_parser -> tsparser

The renaming is not complete: the extensions continue to have the old
names, for instance. If the consensus is to rename them completely I
can finish that, or we can decide to keep the original names, but they
all seem inappropriate to me.

I haven't done anything about documentation. I thought a new chapter
after "Additional Supplied Modules", perhaps entitled "Additional Sample
Modules" would be appropriate.

I tweaked make targets check, installcheck, installcheck-world,
check-world: they all run the additional tests now. For buildfarm, the
client code will need to be updated to have a new stage for
src/test/modules running "make check".

I haven't touched MSVC yet.

Opinions on this approach please?

I like the move. I dislike the renaming.

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#13Fabrízio de Royes Mello
fabriziomello@gmail.com
In reply to: Alvaro Herrera (#11)
Re: no test programs in contrib

On Wed, Nov 26, 2014 at 12:27 PM, Alvaro Herrera <alvherre@2ndquadrant.com>
wrote:

Here's a patch. This creates a new subdir src/test/modules and places
the five initially proposed modules in there. They continue to have
their makefile with the same ifdef USE_PGXS pattern; they are no longer
installed by default.

Because many of them had either "test" in their names or some other
now-useless particle, I renamed them:

worker_spi -> bgworker
test_decoding -> logical_decoding
dummy_seclabel -> seclabel
test_shm_mq -> shm_mq
test_parser -> tsparser

The renaming is not complete: the extensions continue to have the old
names, for instance. If the consensus is to rename them completely I
can finish that, or we can decide to keep the original names, but they
all seem inappropriate to me.

I haven't done anything about documentation. I thought a new chapter
after "Additional Supplied Modules", perhaps entitled "Additional Sample
Modules" would be appropriate.

I tweaked make targets check, installcheck, installcheck-world,
check-world: they all run the additional tests now. For buildfarm, the
client code will need to be updated to have a new stage for
src/test/modules running "make check".

I haven't touched MSVC yet.

Opinions on this approach please?

The patch is missing...

Regards,

--
Fabrízio de Royes Mello
Consultoria/Coaching PostgreSQL

Show quoted text

Timbira: http://www.timbira.com.br
Blog: http://fabriziomello.github.io
Linkedin: http://br.linkedin.com/in/fabriziomello
Twitter: http://twitter.com/fabriziomello
Github: http://github.com/fabriziomello

#14Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Alvaro Herrera (#11)
1 attachment(s)
Re: no test programs in contrib

This is pretty bulky, but really the vast majority of the changes here
are just "git mv".

--
�lvaro Herrera http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

Attachments:

test_modules.patch.gzapplication/gzipDownload
��uTtest_modules.patch�]mS����L~�n�H�8���,{6�Z�������b+�/���l {����-��c;o^2�T
�R���~���$�5�.��T�k�Z��i�j��~W��Uw��ju�����j�rM�{_�4<�o9�a�Q�"���0����q�������i)�]�����c��B���F��;R�%��Ae�`�N��J�(�Z���@���2�����g2���E����tr~3��������+������>+����������@w��z=�(JBFf{{;)��_���S�%��w����g��������P���L��M��My#z������/��2dc3���k3O���!�s�d���vj�RX���� �8L��
��{�1�B�B4�
��n���R��S�Q-�u�����M�>�����U���/���S����V,�.c����T$��H�tTva"���.N�������9$��mhC7o76����mX���M�T���m�T�v�!�0��}M�1U&���vW������r�PW�C��S.Tjd��_�OQ�����K;�z��_�������1��t�)������=��o�AY�_�W�IU���B�;�z������-s���Mx]D���Hn3w����e3�s#_2�c��@�nv���7c�#L�����\@Q|�.!���SZ��e��y�$��8%���L�R�K��C���2�NF��%A�(_.�o��8���2�������q��nf����1�[&���$V��}F��G7��������yF��\6��bzWc]rs�l_��~����.�?��@'v�
w��~E!�y�Alo������{��StS5<�&���

��aT��h����Q\�nw<��d�b�T,F�E��K����=��P#^���A�����]��j&8�\�5~YT';X��,G�����TuNGKHOs�����J�2
yG��P�8��#L���HO��N��S�]�uN$���7-7�F�9t��l�n����:���P�b3��Lu�;V ���e��4�E�"h�����A���l�wu�?�2�z���-���nz#�/A����e��wIN���������5�]_��9^A��3,C��8�g��BZ��yi7&��hL(9����:EA%��I�����"G7T B��x)�.�1�?��J��n��=W78�i���)����qrz��J�Hkh[��,���+�wg����$.���e^4D��U�Ez���_��6t�J��c!�_����	��N�)yS�S������!�.��vxH�o����o�; ��;�[�1�`)�JWgZ6����&j�����gL1&�u���J������(�#�����=H����v�9�7�5[��VAml���B�eXztq�l��_�|�tzt�<�n_�N�?i����x/��L�6����e\���|K�p�@B;�q
##���K�'E��g������@�P��.���;�s-#	��F�4�a���WM��d�iin'��B8�.��9Tc�ny?����>�u:ZU�+5U}_����bJ�q��R!I��S� ��J����d|�����j��D��%
G�-�b��	��k I��M��v�/���i���y_\���i�����C��H">��u-H��&p��@b5��C���o��P ���������V���}���|�	��l�n���9.���3-'J0'U���+����rmR��(65�G�	3a!�=K��b�y�
� _�������<��\,%�H�#�^�y�����+�2M�������L3�{�����c�{�N�y��������@B���������=����n�dO�-���0���{dU���Bd�o���p7���J����u��1�
�`�
��B��g���4�
]�]�X���V�}t�l�����i��m�$O�I�������
"6C���z�s\ak�����_����<D���F�@�y�{	�5 �jE�C[8���
�w�!���(\$b(]�`�u$�y1�Q��R��0k�HL�d��������!�K���<��{���t��Q�/YL|AwlzqK�yAI ��XAXb�s1�@v��w/Y�W��H�e)7q\r�cbmk�:������eD���|bl�w�"RB���	�%���i�=���'���������W����m�@�(�m ��T�b���4�~��-p-$S���������=D�+��73)I�������y�@q;�:bw��~n�*
2E���`�p?���$.�w���(�E����a�T���R}P�0
�z������M9��5b�hD�9�4UO�.�����g
|�1��im����
����6��n��;Dm���6�>�q��N�L;��������J\���c��'����m�j��xO����/�������Q<�A����u�-4=Y�A\!QIfZIb`fi"�M�;���j��^}>:�&?���"��l�	����n�j^>�8�iy�t����=k]�-\�o�O��/��9�
m���S0}K������"��[�5�����?U���?	*��;�(�
q�{�(�6�T�1��x<����G��s�
�*�Q��*��:�s!���c<MW�X
�n	�P��qe���	u��QYh������u4�M��������T��e�y*��1����e�ii�+`n�������?�Y"}�������^��m&[=�$�t�����\��rz,k����P�.��I>0�������������;��4������%��jD�a�,�'��J��,���q��,�s���������;�S�
�m��Bx�M
���j�kX��R�K��r$B�Kf=�GB��(LF��_�KP��5RF��|l���������_5[����f��Q�R�M�j���8�i^�T�����H����"���gM"l%�.�n��i���e�����T�T�Q&�����������
��|P��,��-���k�[���<i\��C�6*�����k\� �����@?�PA��Gh#��NfF�-�������x�������?*�r��d�������Su0!DZ:�Q�Wr<�����������2!.+����tOu1E�b�������?A���qWR����^f@G�&�x�f`4��J!F�-���13������X�9P�aP���2���?@�WM�� �/�������WN�R�u~_���6�#�k�5|,%��o]�^� ���#�k�X>`<eY��:����p`�AV��`�f�wH��l|'�f�^��������>�8X57�Y=*��Ls�>���{���+/�h������������	��-kX��5$=�V���v��]e��B8��j~(�D��C"Y���Ob�g9;�q�P�����0���Jwh�@����
�L��~���)�J�p�N�=m���0����\�N��9��teh���0M������������c����khK�6�^i�v|����<i��T���AI���+�&#��b"^1`'�/���~�gc&F���(�����#+�Q	�N{�f�A�h��jb�����q����o���G��ut��X��(/�0�\%�<�i�5Mc�N�c�0��qk�X!��Q�6NS�;����i�]~Xty	���FvVS-@��&�;�jD�����6,gb�Rb|��St>n]\F�~�m���!���e���HZb������|_����V�03f�&K|���R�U��TZ��M��y�],��K�1�<|
���k��<l�'N�xI������Ex^?`d�'RkO���g��H���t��'U�(j�����N�Y�����D���?g��^3�G�f��eJ�������5���?�q�$2��	���Nx���_���Y����|�E>�����<�k�_�1����;yN��B�?e�`^��g�;��gZ��Y����uk�_	��E��v���W��K��?�[A������x����A����wqh7�?� �;���E���d�p���WyJ|�s�9++�H����e@��70���?si���_���5m���+�������J��-��������.��~"���tl��;��)�&|h�}�2-��sH,���GbL���S@f�8G��T7H�����X]BMB
PC��s�����|�U����dc�����Ic�MpY]#&�G�~�9!����lT@���Q�P��3�g:��J�����m�a ���C3^ �7��7����g�ww�j9l$�8��{��l��l�>`2u��t�M���\O���Co;���jyL��������_5K��Q4�EX:��I���p�Wl�C.��R�
ehE�P<����u�z�tS��)���b�8��"��l�E�dd��������BfXe������2H:���P�!8�l(`=��x�_�.
�����YG8�E�j���`#��{�����A�l�|� C�<��4�kH`�8m��|b���S�����Nt�46���G��`DI�O5���
���z$���w��>�Ht0]���g��b�����E����<�	�+���])��`L�?���BR)��c�^��0e.��������p\D����~�H5��Y	f>R����
��2����mp��T�H�
��I�qk����=���$���p�x�M�)aN^����r��&>*(J��J�y�����I����e0��o�c��A�����ht�=��b��#G#|>�@���f��r����?�LA2��[���'��@1�|G�f���/��3�(��������qF.[�_����������)�]�-��Gv��5M�)X�GW�i=����:�	���>\wG��)�����qd�^��#�b'��xk$�U}yO�S[����=:����0�5�G��k5�W�����	Z����f`?�%����B��mF��}� 
�p��	7e���#�o��b;O����g������c;\)S;�����vW0��2���������XOU�I���YK��:m������iR_L�j�&��xg��kK�xw������g�e��ej3�}I]�_����m��jKd���w=H%�m��V��rAIg������E�������C|H���/��zO�A�*���h����&4��LW���_>���G9Ff�Ju��?!��<��$D���`�S�oi����w!0�D��zT��GuL���������W�%�7^u��,��^���^O��4z��i��ri���v��|dit,��jK�4�y�tZKv�$�������RT�'U�&�����(�B�u��;9� ��;���:��.�N�a���"�����N�3��<���`�N
"K���D�`�&y��2�JH�U�q�+kX���e�dM,�"8��W�v��"���Nv'�px1{I�"_��f��s�8��xa��G�+�#��m��v1�wl���&�y3�r!�����t5������w&>����c����r{#8��x#GX�����e�v����r�6��q `�e
<�Or�7���c���+���z�d��Xp8��-Wk�<��t��P�}n���?��r�5o.�Q�h%|BE�vH�&l�s�,�V�x)���J4X�E��R�85Li��d��r���>���C����r����$��u���4��~�&v*\��W�B�P���	�6�OS��I-����"��v>2��x����
�*�����0�	�����"E�\�����X�^=-�����1�W�,��M���|���3[��:��TT��Y�����������\����_�8gGRKrc�;�9j[��O[������K���k�T8��������H���){�m�,T��5���RAc����[�k�:�f��2���2��"�r��m�O�{����^�7���P�4��j��k+�G-��7���/��_���Y�� }}�By��=89������
���h"\�p^��m[������_�k��_rWN���\����g��R6^�����`�J��J�s��*��T��K�����i�V��b�U��
k��T���^<{9@�7q�e���� �������"�����]����EM�o������6���j�`��3zP�-"���[�������n�/���U�u��V����m�+&)�.E��?�,��X��VuE������h�����s�(����;+�����Iw.x�������6�u������6D�.z�A^����~���O��|���Y��m��g���������k	KkY�5j����l�R���Y���^�$����d������4�H�=�27���U��}g���{�z������Y���W��S�<�l�x�{���=�5D��E�#����\'��8��0�N�cn�z��e�k�n���G����� �!���$;3:�t�K6�R��^��=t�m����]�&�s��	}1�b�����C�zi��
,,�N��[W�6�rgL�4���W2A ���.[�}�L:B�mC��T��-K���lR��h6���
���������mOQ_;]�oP|��L�����[����N��%��i�X�SQ)�	?�.�e9��n���@=-�z'���� v&���Rv%<K�����2���n�_��n�������am���z7��L��:�������lC���l=z�q�G��:��3������m�y����?�V7�%��\)�2��+����**Kp:�Z=���d������������
��$a2�>�G���<��,ZP�����^:�8��!�������~��P�m��hEV�)�9MW"�;*�*�*�%�|[a�����BTS����E�Yz��o�+���?�;d��.�
�����\%�Il�L/��]�?S�{����q[���������Wn��.:����0oe5�����������|	��~�%�[���Sr����]�����X��\�^��U������b��.6^|�.V����j�LJ�_)��=�h6e�_��������k��s���g�����0���17[�k��Ti�3�z�C._�hW�L��]2����-�1+� ��P��w-+�%���w�`�VNi��pf��3N�7�9�cv�_�p��Q�<�F�������}��u�Y�t�j���f6�m�sK�g��+�����x��-�5DQj�/����YTk/y
�|����k�3�8���a�e�
��v�����6��
�_??zz�=;|yzt�7�G(�e|��A�hnm~V�lYwy������-�'����f�ERi�S������h�KK���#�P-o9�M��;�v��)���������G/�J��dts�XU�|)J+�{?�]]r�������"W�wg��b@)g	�f�F�
NO�'������K�>��&���8�xaz])�}YONf;1'2�T�}e]	){��,ya��Es������=��fs���g�]�C>�N�y����j�Ch��<�nn�����9|���3
��61�NN@�f���P�jq,9X���������z�����E�y%�����3�Ol#�.�����=;������<�P���Ni�aI��z�f�����x��F���G���IHx<����;�������|�{�������S�/�}?��'G@��p'?��:�L��&C9���_�3�=��W�Y/bi�|n��x6KrY�p3CO)��o����
�F9|�)�W�v&�/����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
��������?�����Y?���g���C������N'�w��#�������#����7�$����G���L:��
�	g�	Q��W/^��������������p2��'��tg����~v����U�����;�x����[��3�������7Q�������]U���1[P�m��V[��`�j��Wg����O�����_���y��K%o�j���?�I{0���~��B�R�����no����s�\���1�����2����k��(�9�fq��J�V�R]~F$�+��[$��W[^��3��7UJSJ$�����:I>N~{��Q��h���� ����F�ZA�a�a��z��a+�#?
�0��ZT�Q3jEq�����j�z�Qk�Z�����zX���z���7��z��A#lD�Z��h4��V#n���6�f�Yo6��f���V�
[Q�����f���c?B1�QQ�B1p��6�R�M�T��Q\��N�W�����g�Z��_B�0
�Z����� laD>_�0 �n-��A��f��(j>���A
�����Z#�5�Z+��A�gS�0�GA���h�fPo�8h����(h��F����M�6���Z��MC�
�q���{+ZQ���z�j-�
�����-RGA\�z7��� %h���~�Q��B����o�~+������p��������!_#'������a�s�K���Q=�a��V�a������\Rk���k���u����QX��ea��[a=>i��Q���
p!��6Za#�>�,�Q����z����Za3[>)	[Q����z�j�-�08�������0��q#��a���?��G�_��z�7"�������d
�
�2�� ���|r
G
��>�c�(�8b�A$D�A� E�(�j>y
C�_j��zTkD�fTkE�8��dC�.^�C� \�������G
���G}�Z��tB��Q�5����yA4��E�z���B�ZQ3�Z>���Z��G�F��lC!r>X���(�Gq#��Q���������_���������.�)(0��y�����w�2D�B��������O�� F�-�3:��b\ccJ�5Tt�O-��}
%x
C�_�PC�Z�Y��j����)�`C�.^j@kA'5k�V���>E��G}�z�	���5�Z����yA4���Z�Z:�
���_�\���7jq�C%B'��
`yP�����������W�j��("�T�P�s0�O�B���-�
�L�I|*r[��9� 3h	$|�!�o���p�������#���5�k*lhl��z\o��^J���4����F����M��
�
6����&�=Ty����-�:�����V���-�^���!�`^�MA���f=������)��� ��
���[
z�����HIjX�Q�J(DH�O�J%���)P�P�]���b���"�
�Lj���d���A�s�@f��Sas�#r
G
��>�cq�(TQ���+G;C��M�j�B	^���&�^���-��
�
6����l$, ���Q�b�Q�`#�	�
�i7�!�`^�M����j�0>M
m[D��)"0*�Py>�
�yD����P���r����+�4P�}(h��OE��((0��y!}�/�hD"K��`pP�i�H����Al�`��&����X�%���f�l���P��^J�����+�5�a*a�� �`C�.^�����[���0�yep(����K����	�(���
6E������ET�R
bA�m��,S�G�
��
"H5
��i���"�
j�q����4������`�(*��O;O���l�m
����^�tH��z����`p8�;���%�����W��}8��P��^J������}�>L%,�l���K>��X�X\�X��X��X�X\�X��X�y,�9������b�b1E��X�C,�>����E���cQm�(�X�M,�#�0�"��X,������0b,,s�B�X���2��G,��X���X|Q��(8S�G���#�KJ��N�O?[����'�L��t�����GG���2�^t��F�Y�KD���
��*tH�v���AG���>M;
8�4�1M.
+�'�$M!
��M
�
�
M
��=U:7�3�0U-*�&�#U ��U��	U��BNQ��R,)|1
��BA�'�����dIq������A�I�@eG!�Y�7�"��g��4bcq��	(���kO�n:�q��t�A)�SF9����6���:����A��x�SD9����
���� B�=�E�;���5�����T1�t@��t����Q�SEQ�X���Q�Y�h����(�1�[��V:ct2h<i��(�6���=[zl�Dhai9�)�;8<<y0�`������H
��7C���������j�E2$�x4��H����f���j���DpMP�a�	�����=�\C=��(z�5��r�T����p9��mE9�v��p��A�[x<�mC9�F����\
<(�`�I��@hD��o������r�#�m�=`���01xP��Q����f���6����r�T%�=���0��
�����"���=`���������d�j�A9�&����C2I�r�e�����M��`hE������1�a�� ���CD�����1���D���O�����u��(z��A9�CD��������C�������y���/}(�=�=Q=`������������;� �=`����K��9����T I��(8n���XQ"�FMr6pZ����	���2������r�<6<(z �2�����(���5F:B4�����I����1�b������!j�@ ��	4(z����r���:�N8�k0�B��@X}�B��C�(�=�2��C�r�\9�2A8_xP������:ttT|Q�pI���'��0�x�����=���(3�z����������M��.��K
�/�=�2�C9�1�=���A9�C�|��:�=p�A9����oL�5�BHt�r�����{�W������#�DII1�C9o���bR@DDxP����+�=�g�������������=�W�z���r�|W<������������@xtxP����y3��8�1!p<�!IE�>2�X�(1�b1"���P�!yM8�xP�S2TD9��"�xP��	S�s1e���@�xxP���	s��z v��0�@�7xP�@i�2SlL1%"�>�14c�AW��/M7CY�K%[��.2(=��������`
C=�=��@X��@x�d�C�7�:�=�^�A9�1f*}�J��;�@��=I������wC�w$�)�Aj4%����o\���(���F�4� ��r�BR��DL�28E9��)�=������kz >��P�@D�xP�@�j���*�]����p
���"1/�|�X��H��'2�a(N7�a5�g���%�������j�������3��;O���!r��r�b<(z :����o\6��-X��-�2���GK"	r�r��b�E*ZB
��@q�B��(z ���r�"J<(z�{1-��@�xP�@8��7.$���a�=�A9���q3AD�x��fp�r�X<(z�+
z .��r
f�*����
��o�U&���e��I5&�$	�rZ��K���<�u��%��0���/n/�X<(z ���r�B��s��kz ~��z ���=dRC�=	��E�r�ZPCQ*H���P;dX�r��j<(z ��	\p���'d�����`����U=g�a��r�bm<(z �6�<������������������\�s�Q�@����7a��(����08G9���	8��:3���2����dd��/��A9�� `���Lp����F�A7��;����(9��{��o���;;��1N��+a�+4t����&��f�0�k�,�u��|��=�}&��Der�I/&s����������u1�������T�<F�y#�Ct��5��L32}���4�\���p��m�l��d���#A��x��P�D�L�2a�DL�2s&��8���f���eV��:f��[����sj�SL�3E��'SzLUI��{�u��
�%�og��Q������a~Z��<��`R��f&Q�d��C��O~�<�?��g��yX���B
��Yfh�}af�YfD���
)$�&sP�M���M��b�gF��z�2Ze$�(�$����T"6Fc��E1Bb����QKl�.��F�����+��Mo:6�!.�Wz��:�Q�[�'H//6�#��*zL��������B�#6,&�=-9�4-0�+-'�bl�P,�-�-�>5:��$'}�A����������i�Eb��B
�!/��!��!���ayI��������i�:�`^N�FQ�������%'&9��IF�sw�GqF�@��A��A/��@��k�QC9�#=B�#=D�=B�#=�:g�P�A��1e��A��A����=B�CD��D�#=B�#=B�#lrF�@w�A��A��A��[��K�Xr�!��!��!��!���6D2H
�!/���px����Q-��%EIh\�?��%�U���2��r���4��8-�t?��TQ��r�V&cQ���>�$)�B9�I5�<*��Q���(zD�GzD���:�ZA���@����=�="�#=D2zD�GzD�G������!*�9[�#="�#="�#jrz�@Q����������8�!i{��F�G���GzD�GzD�Gz�z-
%j�?���G
���5?6*\R����j���K(V��%n��y��CN���Q=j�G
���5�CLs�\� s�(��Q��q.�s4�{��`��S����_��T.'l9-��W���A��Q=ju����Q=j�����A��Q=j�G���F�=j���&��A��Q=j�G
��59��r���/��A��Q=j�G
������dEr�5��z��v���5��z�@�A��j����=W{��\���s��j����=W{��\���s��j����=W{��\���s��j����=W{��\���s��j����=W{��\���s��j����=W{��\���s��j����=W{��\���s��j����=W{��\���s��j����=W{��\���s��j����=W{��\���s��j����=W{��\���s��j����=W{��\���s��j����=W{��\���s��j����=W{��\���s��j����=W{��\���s��j����=W{��\���s��j����=W{��\���s��j����=W{��\���s��j����=W{��\���s��j����=W{��\���s��j����=W{��\���s��j����=W{��\���s��j����=W{��\���s��j����=W{��\���s��j����=W{��\���s��j����=W{��\���s��j����=W{��\���s��j����=W{��\���s��j����=W{��\���s��j����=W{��\���s��j����=W{��\���s��j����=W{��\���s��j����=W{��\���s��j����=W{��\���s��j����=W{��\���s��j����=W{��\���s��j����=W{��\���s��j����=W{��\���s��j����=W{��\���s��j����=W{��\���s��j����=W{��\���s��j����=W{��\���s��j����=W{��\���s��j����=W{��\���s��j����=W{��\���s��j����=W{��\���s��j����=W{��\���s��j�������-o�t�_���Y?��G�yo�~{��4��{O_�xqt�?~8���%��t� ���N���D�y��y����������L��d�����I�}>��N����m��`��-�T�$�P��	eL����*%�X�Pd)����n��%����61�b6������z�����
��d�Qo4�F��!h�64��M���l����@<����f����@(Fc1*�Q(�Y&�T�d���h��2�XY�z�n�_�z�������G���]�i�e�a�]�e�K�0P�yH32���D�0/��3
+
#
Jk���0#�\ND����vX4``�� Fm�J��l��@�A��0���0����
�{F	z�W�y�u�q�m���N�0W���:�"l"L",b(�����R��,����1-G
��>�c�(4��#'������O+�(Y�O�Fh=(4�*�!���/A�!�T� ����%X_�l�i���������&h��U.�4a�`�huA.`�����������������@�[�S�����������g1�S�
�
�*[�n�����Bg@@�cZ�:
����%���3��B�>�c�(�X,P�Q� C"H���6'��h=(4�*�!h(Z������?W6&����G}
�SH'$�	C;CK�M�T�����B���E*�����B����~�\�1�-�)�%��!�iC�����[�6�cjp�^�nQT `zp6�7�n'���1�2�� XL���
9��@1{��D�P�@�@�@�@���5!~�C
5�Fa`
hC �`C�.^j@kA'5a`h] ��P<�k���������iw �`^�M��P���P����HP�z8�u(z�y�yhy�5����A:�A0/�W�j��("�T�P�s0�O�B���-�
�L�I|*r[��9� 3h	$|�!�o���p�������#���5�k*lhl��z;J���a�K��Yo�����
�
6����&�=Ty���a{�� ��P<�k5�-��u�qv��t�/�����Y�a*^QS���k@,����B��T�T�)I
5
]	�I��_��"�:��*��S�R,#��RQ�<��A-�Z���5�7`p��|*l}D��Ha8�gt,n��*�5�b�h�`�1��yh/%x
C�_�0z�F3��A�ybt�R6�-���L��G��F�0�v��=](��11�x"0>M
m[D��)"0*�Py>�
�yD����P���r����+�4P�}(h��OE��((0��y!}�/�hD"K��`pP�i�H����Al�`��&����X�%���f��j�B	^���|��a-a�� ��D0��k�p�V�]Mr(s�,�OK' ���f7�M,l�O�K�Q�J5��
��O�LEQ7P/7� �(�����j��6��������S�#j�^������>�<�7��!�5�c2z�� �"�!�o�����[�X@�G<j�<�F�
^<T8��P��^J�������G A^$�l�l��	����#�K�s��������9��0�bbc1����XX,�(��y�E����cQ����Xb,�-%���Eq��b�X�2�ETba�X�7F���ba�X��b�X1����c��Kc���/�&�&E����-����b�)6I"I1���
�2L�0��T	� �I$Ij��S
L0�0�!<���$�$d�L��a,CT��-6�&!%��4��4��1�a8���
�
M
��=U:�$����j�P�6��������$�D5CeB�A�@���S�)�� ��Q�(H
Y�N6&��%����Jg�N�'���8�M�M:�����&Bl,�0A:�t����M�3N���5v,�SF9����6���:�� I=V1����r�
0Fl
��I��V���Z���R%�A�z���E��&���*��'	D�z���E��v���z��)IFv���Jg�N�'���X��:�A��=ZXZjDJ:�F={0�`���Rc���%�JN���j����P#�x4��H����f���j���DpMP�a�	�����g������mG9���=��L��$=�r����r��"�=$	K��p��0x���r����$j��\
<(�`�I��@hD��%��0�xP��a�C��r��$|�b�L�=`�0n���%)L6����r�T%�=����&q,9�P�l��w�{���x`AI.�d��d�j�A9�&Ol�dy�!�$@9�����{���V0��XHp�`��0|a��P����?�(z���r��$�)^�|_<��C��3�'6	q� ���5���D9�6�$�)��|<(z�K�C
�@I�S�A�{<(z�B�a��>D,�w�;� �=`����K�'6	z�%�)I��(8n���I���
�5���p����!�~���!V�
�=���A9�C&�~�K@�r@�X�a�#D�0�*�!��=~�C)L��pR�j�@ ��	4(z������:�N8�k0�B��@X}39Auz���r�\F<thQ��	�L���=�.�an�],�T�pI���'��0�xb3"s3������D�z���������HE]�Q�,�_<(z��
Ux�0�@�\xP����'6�.T�H�P�@���@8>fb����f!$�F9FC�����+c�Is���A������7�h�8�C�z "��r
��]��?�L����������=d���	��'��@��x�
�w�d��C<(z����r�|0<��p�y�P����(3�z�G��I)���h��H����&i<�����*���H�	J<(z��4�[4�SvQ�@���@��f�&�@���a$���o���!�d4�L�1u�����(���!]i��4�e�2,�l!CL�c�����m4��B3<(z ���P�@���z ,��r�	<�?2��e��n�u<(z����r�b<����9�P�e�2�=$�z��6��I�b-����B����@� �K2E9��(��xP��ID�-��NQ�@`��@8�f���
���CU�=Q�A9�C&#����T�0����@�Sxb3aI�yQ����b~F�(�8��Cq�Q�<3Df ,�\�(���t�@��xP�@T��_���L��C���@�:xP�@t�'6�2�YK�f�}@���$�A�d�6���Q�h	5���L�����������(��f���a��4`�=��A9������	z ��p�@��xP��I_����a<Lt38F9�,��L�=�A�3��Q�@�f&���2��$-��L�1Y$I�c���]Z����3(g�-9v���LB��E��@�xP�@�pnB&�e.������<,��F���I M/������RAJ,%�t�C��(z ���r�kN��Iq��'d�����`��9]u�q6��(z ���r��L���=q���p�=v���<]~��7�kp��8�����$=��Q8�=��ap�r��L�3t�3��3�3W��a@�	�(��SL0
�`_�?8�ag����f����vvl0��+'�h��I�������;�����<9<>��^����y�mwn�;9|~���OF��e�sy�}���������v��_��.�A2�L��8���v���+;��vo�����}oz�Eox�����������`����������v�I����t0C?'���Q��x�w�$F�����^5�����OG��!��@����w��������]x�����Nu����pt��z������j��b<:���vx�;�����p��L&m3���Qr9J�$������|��y������?�&�{�1~��������~ru=����9���)�)((((((((((((|S ���������������7�kTPPPPPPPPPPPPPPPPPPPPPPPPPP�����fe��H�0�#L�S=�T�0�#L�S=�T�0�#L�S=�T�0�#L�S=�T�0�#L�S=�T�0�#L�S=�T�0�#L��a
R_�Sh����Y0;nt_~��v&��5�_��=����=����=����=����=����=����=����=����=����=����=����=����=������V�j���4���u��d��%�g���F�uL��������x���l�����o�6����� .-��"V_x�'�C�������;����&o;�jP��wz�}�a�]6d�
������s�x�����������k~��{]�G��3�w��{���J�������Ig4i���b�v����r�;����Q���o��7�:���Q���	j�E���������|�t�O�i�m���p:��6y�~7�'�������x!$�S������|���3K���o@x#�����z�����������������{���H���n����{�r��7���
���}>����<��s��E�������t�;-����(�.����o�3��3�����7y�A�����{~�_����Q2�l���|���M����������
io��1���d"�\� ��!�;<>~u�������R�����1y��������dt1]��F=�r�����?<��Fc9����|;���k���:w?�9|�����w�]<����;}����H����<I�{g��PN>>�����+e�1h�c��!�j�5�rG���Q�����p�����O�<=>�M��������%�5����Q��3���%7{�Hs�
�r/0�����/���l[�N��b�}���gy��h8��lM�����&�����'����	/9^��P�������[l^���S�����-��r��(��2�[:�����?�Z�hoQeQ��h�"��|�uC�s2"��]���e>����o�s:M�:������������C�BS���;�Ox�{�sd��}�
y��s��U��C��m��
�x�#P�p�G$����5=�I2��I5g����=
����A����������z�[�i�����`�0�'�K�q���yy����o��Z�:k�M!�:'F�}��*�.z���Z�����e>������Dq;��@_'��O5��D������������>.��%G^��.�k[����4`:��3�.�U���l}�������%�&M�Sz;t��g��^�����_�A�z�;��sg��h
6U���C	�f������Y�k�H�����5�A�����;7I�-s���U3ds/-��u�Z����v~l����X���c�;�1�����������R�"����t"#��gx>x��9$�y�?�h�S�w���7��\��#c=���W�N�^������9������G����������L4��en>wc����
�l����.��y����8=|��O����,y_@��(���ka��ql�����u%[����5�
s]X�{^t��DDi�	4,�V6t_�����W����b�!��������/=j����J�Y"�48n�������\����������5����U>��2��bR|cJ��d$\�5�o;������x��_�������]G��?R~�?�
XG��_��S�����'W1��f8�����w;������=���P��W������;��|T�!qM[):��B�_S�~q��F���������_A�/����
0����O��j���3������ow��0V��y�O�mn8���y�&o2�&�+.<�������2�,n�|0N�f�d�~��k8H�q[�G=���
����z���w�yl�8V?_w�LI;e�[-��-��C������Ze��/��D����!(O?����W�J�E!G �TK����<{��/�<:�/���rY�H� �B�
�i�����y���t�I��fr�T�������)��f2VJ?>����v���M���0����\�&7�5y!(��fM~�d	� ����Q&9��bx���6�gl�j�r���K���t�������� �o��i��
g��_A����`8����}?��)D�;y����
�;_���k���������(��ov"����
���1���^����l�pu��d��E�-h~���WXhq�5U+���O��b���/����0eR���P�����0{��r��u�A��r8�����}����"v��wz���'mM�[��2��962^M�g������ U��d?��7���9��Fi#���������%s��pY7���l�=\����`d<���!@��7�X���Y�u0>�e�?N�u�;;Vb/=Ub�)�� 
�?��b�c6s$G}f�PK�d��o�;���m��;��Ig����$Y�>7��o](�P�'g��5�����Q]Q����Sz�%�$�kG�ne!}�v�������8_*J{p�co �~u��)�n����5�2��SQ�f�l�����=���E$��ml������c r|��������
/�>�z�e�l�g�eVh3t{�9�&��E�b/Bb�R��p�~��~��0�	�_��_�/u��&ug�9��,q�Z�
�WG�wg����m9]Lwj�L$��h�����i`����@�Yj����p�`����P���M�#=�]����;�b4��O2*���1���q�m�g	��D�l��(����0X��)k��%{��]9da6d���l���U����'S�g�>����^�<��m�8�;3V�1��W��T#O1�����������;��TyATa�7�z�J-������W�(��y'��7y�Q�~�:�N�i�U���;����1�2h����D��V���K��y����t�JO���_t�����_�NNO�p��|����:]�D�9����XG/����T{�;VT(�tO��}gm>�Bg�����V�St�n�����ve)T���T�AHiUX���J�c����S{�R���k��~l�k�3K�02��TX��=���h����{|��Dw&�Mg�a�M
=�f:����o���~�Q;We�
����
���^�J��x��������N��r�&�m5���<�2'���oN8��Z�7'G/�>���n��:e��<V�b�<����U6%�W�xo���'\W�F8��FE��o)o�=O�d])���jmc���J�����W��4���������������o�D����o���[����d��L�fME%ME�r�c�we�jw�����^�Dm$B�l��j�`Z���������m� ����Bd7��U�[s������������5d����I&�E������	~�U���k&����a�u���d��^�:=zz���<��_?��C�<�T���a��ej��J4������O�3m^��'��NN�X5cH
�8|y������Q��#�S^=��Z�&o�x&��s���^I#�7������E������������*���3_W8[W�j]��m�]&:�9��QNF�'�6�1*z���no�
���+������������G�Oo�p�o��;���G.�A���6~$Z�=+;��v/�3�
�9�&�vp�0I*	��_P(���^��1��^w94��W�~�����3���EY,p��l+a��0H;�/?�)�x�>�m�p~���zc��3������3�{��H��/����TFq*9gN�f��E$��
K��$�(LY:��������yr�����C
�<x�n=�[EE�����m���f���e�-�NZo4[1#,p	X9�)n5u^������L�I�V��P�@��M�kYlvd
���������j���>���g�����4�����u�~�y���n�1
a�}!8Y�mMV#Q��^g�x���G���
�>^���
���d	��M.:�>�D�w{]����)�%;�M��P�g������j����)/U0���x�]���g��S�5=�
�6Y	��v�]r�n~�v��\BTEb45������f��5�l;�kk�r$/����a���6�f��c���(�jQ=jD���r#nX�j�Z���5k�Z,7����^����z����r#h���F��h4�F,7R����|f��oaY�$�+]r�\�7�����-��#����_�7�4������\d�e��\\��P}���%�J5�u~�����I����Z4Yw_~����U%!S������p����S��"��h.�P�#���Z�o�)����>+sD������m��a��/_|�$����[��_u���V���U.v�����/��xIQZ��������J�����F%�&G�^>*���(���AU����T�*���AUqyU�
�
���Z��U!��&u������
�6�DA���M8�`�`�*?����
�6������M�?�`�`�+�?�D�*����n"a����WH@���n"a���H@X!�&VH@���n"Q���H@T!�&UH@��Dm"Q�D�H@T��l"Q�D�H@T!�&UH@��Dm"�
	�6��Z�D�H@�Bj�H@�Bj�H@�Bj�1P�DjU��&P����&P����&P����&P����&P����&P����&P����&P����&P����&P����&P�
�7��z��7��z��7��F��7��F��7��F�46��F�46��F�46��F�46�UH@c	hTH@c	hT��6��F�46��f�46��f�46��f�47��f�47��f�47��f�47��f�47��VH@s	hVH@s	hV�B7��V�47��V�47��V��6��V��6��V��6��V��6��V��6��V��6�	����&�����&W�l"q��6���B�M$ ���x	�+$ �D�
	�7���B�M$ ���x	�+$ �h6�B����*D �hF����hN����hV����7���&���f����1��1�jr��hv����7���&���f���)2#���$�UW5M�o$�S���WOo$�����WNo6c\9e���q���f�������WNo4sTNo4wTNo4{TM�U��F3�A�r��rP5�l4�TM#�#U��F3�A�Tr��\rP5�l4�TM'�'U��F3�A��r���rP5�l4�TM+�+U��F3�A��r���rP5�l4�TM/�/U��F3�A�s��sP5�l4�TM3�3U��F3�A�Ts��\sP5�l4�TM7�7U��F3�A��s���sP5�l4�TM;�;U��F3�A��s���sP5�l4�TM?�?U��F3�A�t��tP5	l4TMC�CU��F3�A�Tt��\tP5l4TMG�GU��F3�A��t���tP5)l4+TMK�KU��F3�A��t���tP59l4;TMO�OU��F3�A�u��uP5Il4KTMS�SU��F3�A�Tu��\uP5Yl4[TMW�WU��F3�A��u���uP5il4kTM[�[U��F3�A��u���uP5yl4{TM_�_U��F3�A�v��vP5�l4�TMc�cU��F3�A�Tv��\vP5�l4�TMg�gU��F3�A��v���vP5�l4�TMk�kU��F3�a��v���v83�m������M�R)�m���W�4}~YE���Va�Bz�_/*��t-;T2j4/�~c�C%�'�&���o���I�{�����_u>�����U�>�N����|:����n���^�����X����i���/:��FgqKe�;���+�����CU~h���������^<B�m���������Oa�i���p�;���L���;�0(��_�����dx���Y!v������0Y����4I�������oo�sEgZ+9V�����Yr��9s|�7s�Z���FSy��>|��0��u.�S���iG�������Q��E��%�`Va���9o�u������9��v�?IFf��pS�W8��#T8�Nx��o��i�n���x��:����\Y3m�:5�|eeg�!/H[�>�J:�%�v������"���>����A���43�����������2S��a��q��^�z~x�ra}�D���������+�.��������m�A�:\Y��P��>����eR.��pM)	J�|m��$\$%�U�N��R2_�b)	I�|e����$�C4b`�/�M|������UE$ZWDX��l� &�����Cq{	�{��zw�l����T�����S��'��V�IW���ww���[;����a+�:�um~����w����s�{�:^���V�u��%�A��[7|�fS���;�Q���;�D���mw7������"+�AX���pd*\C���H>*_��2��������#�O>��WE�6��xwX��(�+��o�n���T�f��js4W���-�@��� ���b�p��t��:neM�6j�6�0k}N*�k������b�W�n�1/��j�X�K(�NV'���-�|=�������������	�h���	�I�s�t��Ig4�^�2IX������E�
��!,m�t6u�����-�#�M���m�^=��l�L��b��}��R���O��tnp�M�yG'����z�=?���sTp|t������;fg��Ne������K�3�O3�O� �Y�O6)�4%����I2p��81�����v�������+Z����[ju}p���*Z /�L��N�,�t��}��2��Z_��W6t����+F��#�3�Q���K4�f�3e��s��7{����\]O��0Hk)�[�b����~p~�7H�/����;up>�&���x�3��M���d�;��������w�q�I0��T�����7�-=���l��Z��j��O6H����t�~o�i4
&[�%����3��7��O����������hF��t��a��b��Q�V#n-���??7�s�)t���T/������p������+���t�a|^���:����2�Ysn�����pt�x�q�Rn	5�xi��x����������9��L�>�l�������\#~>�|��8t� �mr��zh����|����_��B���{�V���#�N�g7cY}Y��m=����:`:>|
�t��������v9��^��,X���f}�����>������>Uo�yT��M�e��O����\e}���o���:�1l	;l.���{�(S��u.���r�"�����w�$�
��uzG�u~�t��r��.��4�cx���u�o�|@���g��-�Sjw*��~��'��h���������������a�L2Z��d�����C�L����Q�?��s�F7�g��+[f�A|��g+��b�ev.p2B��z�t{���Y����p�B�xxO�����
�j��k��T��3���'Iw�'����z�)���3Yxz��2TVT�K.z&_'�f��� ��E��:��/�M�||,�k"d���(�x��A�W���'gE��v�K��Y&�~�n���������\��'��,X��/���Gh�������|��G|	Dz���>���s�l�����%*)o<o~������5���i2�B��n��u��uF��75����dx����
.���������[�,7|[����tA���u�&`�+��E&�.Q�G���,6]���oo���r�w)��)�k�Yf���Y�>�Z����w��&�CG��'��w1�5G���0v����awz���R�T{�}�a*cFM���E�jrs�����O�L������;�F�#(�F\�~�F8c_q���t��)�8�)�A����C;.4o��Eo���{?0�g�y=����WI��^�c=�������{�s����f���Y��<���#����D0h��W���M&;W�}I��i:��������1��'�
��n�'q!=������!�M��������Ve����v��C�o�@����T���P_���0���9�l����lL�km���'��zjF+�9���xZG�Wn�u���[��9��/^�!��F��`z�&��r|j����}����To�qP��QZA$�1�w������m��15�-L�r�::7i_����8i��>���f�����F������*k���P����~;�VY���^ZA�pS<�������A�U�7It���O�q:o{�S���\r�����=�^������Q"	���'1����?���tn�|#��A/u fG8�������e��`�C����������e��I��_�B�����r�;���R�No��?Cg@�@>2��w{��~���x����/�|��u�4���e^��p�nl�T���]2���o��I��L��kG�������d����Z���F��r���f;C�����o����Q���g��-�D�����7d��)}����W6����'i�8�\�{�����=���+��|4��g!�����_�y���7o<=CB�=�t�k(������p�O��Cb����835c'�1��;�.�������,&�P_%7q"�x������<�=��#��s���-�ip���c+�G-�����9�yK����AZ�/���18����+���q���t�F#��x��0[�m��|5gEy��f�������\�����1�\R�����h����.������K�U�.����o��_����� ��h�8�.���
24���������K�&/E�������8M*������a���?���K�s�Jg��&�����#DE�����Z��-\�����z�����fX�ie���&2�Z����x���|s��M2�|�%��X��c-{��>���(v�����M�����|?g���O�{���=�5D��E�c��:���tym������V���b>cf|)�Hg������7�f�%������CgH��L���/�V33;��qN��O�|Kg�5�T�+��%�����y��d��>n�	�������J�W��6�G3�<�������#P����go{����<�A�	:2MP}�{w��Ei���v��^�<���{1bH�����V��{����,s6����Kp���(s�|S�+N������m�s>���&������B�����*��RMJwy�T�L��\�[Y��i�d������|�
B�^�0���VS������kII�~����~7�����3N�w������!x�r�9O���)���Fm�n�)�L�-����4�g����{���\������ �OE=D�K$O��U����bm��%���O��^w�rf��#/v�.9}��I3X����\�����==����<=:���#�`5\�Z��x#��������g�[�Qf����f(Fb��S��#���h�KK����#��,��&�k�1x�yo<���������?�%8��������KQZ���9��x��#�Cu���R����VR�����4s�^��F��dF�ufD�RK����&7�-Z�1���$e�sB3O��W��������6�Y4��}Y��s|l�Q�|v����y�	D%�����W��~�5W@��s������OM1��n{���;9=Q�1���/@[/����X���X|x�`V�d���pIl�o��f]X������l;�E�w��[%�o������Wo�n!���L�+EG9�z�"
�S3���/py>>n��Yb3s��\^n_>�=zd��mm�T����gS�vy�m�	3|����d�Ak2�#�����Y�*8�yu���,����s������%&�.�{Zd�'�>��s�$�Q_:T��,��b��]K�=��7O��'������
?!�
��|�>����6�zf��a��zc�r8��-%Y?���g] ��%I�i�I��|!,7�?�}aa���	Kw}I~2E��U�{����m��Y�����e����h�56��5Rz�Ap�Ma����n��<,C��m����L�\.��es�2��[<���
{���|x;S\�����^���Sgt��:<3�e�
�j��2c���||�i�[�\���S��T��%�0��H�I��L�����#�0M���r
�}���yz��ba�gOX��m@�,+6o�����2�k�B���p��cwi@,�6�������7Xp�G�
����Xz8O����u�.��Rz�e�`�����s�)��#b���S�A�9�C1�l��o�y�t���w�C)�<
�	|��P�p�e��)+.��n�����T������=
�����}b�it��&����{��_2��o(hB�d~�>�������9sJ���?8)x�ee�:�.�s���qE����������}�Qub��_r�����3)���7�K��L��W�6Z�y�������L�7���'6�o�C�?j���N�����)��t�w�������|!7N�	j�xF
�$;�]���{��Bs%#4,���gsH}b��u�|� �h���_�a�(;`V�p`SZ��\�$�J��'�u��^���[��V#K&�J�O,&c!�t���oW\����a��J�mG��[> \�!)�X�������vJ�,1N�u�?w"����,Ki|g�����*f������l��7v����`~(���[���C��:���{�N����7�F7�p%������?������mH{02��c�K�N�<2�����/�"�&��(���m4��j��k���@������S9u������,�����J���fX�W�l8���������yUO��J���})t =�C�|���5�S�[?U,�,X����jn������E[�N�����S3�"�*���,M�~�e���a���Ibg\��������y���|���'�������03u�\p�.�l��dA)��=�����qZ��L^�����5�h/�|��i��d
��	m2o2��v����w��P�����,����������X���]����9��fK:�(�W��i���LIx�LI���%�f*>����;�m��qv������g%�-���f��g$9�N3�93q�w'��;���t����TC�����������7/d�5���S������3�^����������xX����Z��f��:����M��m#m-��q>s����m1+o���a����N��%���O��ZesB{��#�II8��N���hRA���[�^�����9�%6��I`tW�5���������r����R�_z�m"�������,J\��d���W�q�j����5���7���i>^O�����_�f�f�;kZeOt����+�xfk���/^�>S���|1�Z+�M����y�K�+��?�����O��}��e�� ��V�{s��g[5�_��a������"o��(��7f����������8�H����EjN<RV/�d�����8<'���~:D�P��������z���J������������g�@6P���i�@�������V�Q�Ea��TLx���I��m���L�������������.������V�����������"�	�Y������a�4�Q��=���R�;��ll]�)�rz|���~>�vY�7-������M.:�>�Z�w{]N]Me	s���cj_�d�"=65giD��e�)54;���1�.������>;zy?�7�����������/�K����/�K��V�����>��_KM}��^����/�K����
���_�M}t�����o�����[�����8�������>:��C'u�6��|�9��pR�
��8��,pP�[� ���.z���~��_�B��a���/~��_�B���~!��B�:���/r��_�����/�{�����/~�KT�9�E�/r���_�����/~5����"�Ws�����_
���jt(�j������9���_����j~5�Ww�����_
�����y�:��;���_�����~u�Ww��������W~
�:�k8���_����~
��p�k���_�R���~
��k���~
��t�k���_�5�������~M�&�k:�5�_���I����~M�&�k�����������~-��k9���_����Z~-��r�k���_������Z~-�����~-�;�Q��~1���b�;���/v���_�����/�nv��E;;��������������]%�SK������}WQ������}�j�U�>����k���w�O�]������}�\0+bW���8L����q�R0/b_
F,L����)Z��`fhg���	��8����	hm��`��kpZ��59mN���V'p�N@���'��	\�����	h}����ogZ��5AmP�8qv�P@;��(�%
\S��1
h���G�k�Z��5ImR���&^��3�R����)�\�����)p�S@��*��
\�F��
h��L�S�k�Z��5UA]|%gZ��5W�UP/8L��5YmV���V+p�V@���+��
\��v��
h��|�_�k���xx.��a�k�Z��Qp���k�Z��5emY����,p�Y@{�-�E\����Qh���M�K]�i����mA���g���o�k�Z��5qm\���V.p�\@;��.��\S����Z�M�8����h����Rg���z�k����5|-_�����/p�_@���/��\��	b�\�c�\�iC�A�9������_������E�^p@��s���a���c�����u����/s�D;�
��W.5�)�l��E���j��g�.=
�V������]/��kif��w��y^�s"=�7;��^�l�jy:���.�N���0J����y���	�s�������3���w�
�y����h����s�����������q�������[n�\����}���������f��LFs?���O��H����}j��Xl��ug4N����@|oh�6��i�-g�:W�t����?�����`S�c�<���MJ�J����yzb���5.l#��x��O����y~�~q������������:O����������a2��]m����y���������0����h���`������������r�}w~fV�����GSn$�����^$W���S�8Ww��Q���p��w�v�Me9���w1���?Q��E����K���0N�TU�����gV���ST:����r�d�|��&�����}��R��;�|���1xe/��nx�U���Q������q\*�z;�t���~�,!M&�n1�w�G�d���{�N����/��m	.u�R��{�c�}'�4�����g)���7I��k���_��Y��x�89=���q�8���s2�7X��qz?"@i���d��LKF������pI��^CoM�9��:]G<q��=�l�Z���
����wqS�jr�����&�y���������s���.N���P^��g�����

j;?���������d^8�RFf�db��2#;[,;{��1�0[&c��\*�s����Q�qgg{�~��s��x��m��?��1z�O�&���IQs�P��*��g�A����=F/���o�6)�14X>���I2�x?��}�@>+���`� 5�����F<�)w�����'��m����������=\V�����*�^����N���^�9�cf����"���)A���%�z�{�
4O���XV��?�zs���i���7?�l������������cS�7lr�y%m�K�#��{�\��+n3�.�O��\b+�j�}�E���]zO�H��]:G����=�D6���o�.<n�;�����*����!��V�1��5hx�a2������^�{���Z3CWI��c�;�>A����3�!�c�b!���K@7b��;qU��3��/�~^������zvlP��e�}x|��8���d4��������_�r���Y��������������D/\�/����^2D�v���c��8�_cx���/s��J0/�d����?Y��P/�y�>��<�z�����i��������3��~� K��)cer!a��{��I�6���{6:���J����^�-W�+q6I4C�%���l,H�u}��tH��Ei7������DY����
�+���H���I��=�1���`����n�������1������)�x���\% 5e���W�4F��������:0���. L&�z��$I�]�=w�� ��dQ��^�H�Gx�
��|���$)��H����td���7���\�������I��p����Sl�_���f��8��9���l�.��1(�U���:t��y4�n�cmj��?���h���T�������K.�����gO \��V�lT�n���3�d�j�����wU�;���i�r��T�c}2�*��v{��\�����x�1�q�S������a��M�fJ�
��@����.�Ix=�}�u���k������&f4���s9��=\DN�����������%�������;�z��X����&_.o��<��S������#7���z������0���i���������W<���=�>0y��G�>��E�a�����9	��������Sr����.+hp<����������?�&�o�my9��;�B�^�����=r���~�*|���?>u0��|U|�����GO��h'_����%�����,��O�@�����c��0
m+�|����`<�3��;��J�?��������<�����c��`��_�z�U������l���������`'�d�� v�A	r�(��.>��@x}��[[�]����mx�U�����<�������
5��x��tv0N��y���������n���3�?u�+1;k�Z^�_�v1���37�N9[�%�l���]!�X)m�^�'��}�b{����9���=���s-_�6�!6�����3P���Df� ����m�h�����35�x�����ri���!�D�l�����S2AS�R���&r������'L��}�(�R�!J������,;�v�_E�;rZ�9��7�����S�M�nd���@O��c:���������`�#�m�GaN8�<�@�L��h�C��������,f`E9>�$�Cjo0t��y��c��0������4Y	V=~�������L�@�Q�#*�_���Y?;���2�jzc2�A�^k������zLDz�q�������X���hg����e\'�������nK�[����}2��)4jk��aI-����Ap&��u��7�-�w�.��9(�o0W9F�U9a;5��<�%�9���c���U�0�L��2����a�S��gic�16mXzJp3�� ����)��58������=6���,h��1K�(cN���J]�YUXmP��i����E/m�D����B���%����N�}B�f�����Z�r���,[!� '��?*��xV�S��!��=�;�����#�!K��hk�]	Tr����y�B��g�.E�|������I;=
�������?o[6�Y�Lvi��(��.�~����F�,:��ivl�@���h��i�mg�3�����U������������+Oy���!������������W'��g�o^l[���r��:��+����:3�{�.��Q(���`�y���ta��c&�M�/
�����������_��M��{V�=�Mu�L����
96+�&6��d�	����[D��i��M������T��M3B��_�DCr�SZH�v���8��B93�������f�n��X�tM�qb���d�������O�UN$h<�� WNx�����=�V:��t�A���$�V�������0���h��;�����1�bH�����O���������vjs���	�����!x�&f�@������b�~|�����q��7?����|���C{dy�7��g��a#%%m��~8�~8H>��8�B����	��%t��f�b����=r�U�!>��)�K��-:sX��Cg�/:H����C��+ ����dm����(�X��\
9��n����y���\d�m]��l�T�� Y�����{�g����6�[3'�v<�~����cp�~Tr�]
?�<X��j&=*+�=��'7Lm���������A�"{�d\��s*cv�O���:(�)DK;s��1M�R+Y����� s��������WD�-)�l[C�{~]\,��0_i�~�|7�������]n5��x����w����x�c�q����k�E�����w�E�]"])�x���n7����������;��_�����%������W?�?'���������(<><�����>;<y�r���~��C��>��'�+���p����W7NxG�,�g�������;vP�n?x���
�/��E�:�����'`|2[�������99l����'������?�d�r^�w���z�=z����r�����
��5�/?�O����r|��0��`a���^�9��5e>���C�*��������z/e��la��ik��}S���;��X�b9_'�!#I�� �)��������g��*|_�D�f�\�9�9�9<��L���
�����_�")����Q�wrxp��g����c�Fd�i����_�q�g^w�	_�>��yq��5/����1/��z���l��4HO�������i������unr;�]���WcZyd�t+]�3��^���x;�\?��{^H��~O����������z)�s2�>�O�5�Vow"D�A0�'�!�t~4hV�����G�/z��7���'�I�O�#u;��BE���@�&��bzq@����0W7�������MF|��J~�_1��7�mI�[�"o��f�Q�m��G5o�����mM�[�v�=����3��y[\P��NZ`I�/�J���&�n�7H�q;���������rO��3�Hq�~�@����.;��G����lL <�����9ZJm@��8}���l�����?��ewT��~�����%�#U�\����0���/~\P{��Z+��5����;��3:�3k�����U�� �K%��-���K�k���������/�(t7w�F��2����~#��C����,42KFe����<�w��Nd��@���{r�v���=X$��k�?�t�Zqz���c��k2������� ]��f���L�:@�v��9~y��?@2O�-��>8�����C���/z��Y�z'��GO�.���.�I?��\%�g��d����.i����E��5��UO\}hUg����{�q�'E�Z9�������_:?g��E_>3��2�������<�����e����%����><q��#����,Jb�UGYh�D�4�Z�u�][��5Uju��JY���r163Gi��1V��"Z�l��B��K7\��3��F��&�i�*q�>�+�K�z�4�JY�eRr~v�l����,��T$��g8A%C���@O���r����S�����-�_���������;��rY�����O���r#���������0������fB���?��6���X��l�u9y++#���/@��Z�7�5���� �w��Y�k�p2I!�f�����������i�pIX������,�g�����p�1������g�C6���H�dH�����_��l�'���B�b\V�nY���-�\u��(�r�����N�Zg�����\�]�ngv���k�6
����R��L���"������ri����/�:Rl��BY��� /.�%����-�
e��3�-������2�w�M���7=�#oMLik������b���P�?����Ypp�~�-n�dc�G/�?��Sr���;���~�&�/��! �g��������T
���b��gWq��`o0���$�9�������4c��h-�,�_����K��dg��� ���*���n1�BC�Y��^J�l���Dr\~7~+�o�m��:����/������T_�I]�;�
��(IR�u0����g�U��nZB����8�����a�"5R��3�r�X�����(��a����0�g�����W���,�&��,$�����a1�����|���>S�%r1+^���|QkK�{(���5�l�<�2����Ncx�!�B�z�,�v2k
>�^�y����~�{(��N��XP�����z��7�2)�Y�_f�y�F�d_�U/�yw���������?v�yC�FEJ��d�����
�pZr�W5�B�m���^����yu7��am�s�;	�,Cm�9�u��p;=|� L��������[Y:��W��iey�[g"��j�d��j_�c����w�rc��/�r�"Q�rc��e�N���__<�1[��+7f_/]�a
Vn<��&�k���n�5�g
�/�x��A��v����s�p��4)_����.�0�-Z����%Wg�8|��3,+�B�/�Vg,)�4;Rk�[g�Wg,k�t2��l��T �}�r�&g;��a�:����o���=��dkD����s�����a^'f�olR�\���@>��e=�������.p�M�������4��g�%���N���`��g�������mm�A�����qG���e:J'�����J���4
�����=��O���v������n�04���������G�vl��.��n�@Aeo{@���}���=��
�;���?1����uB���4�V�.;6�&�
�m4�m�v�r��,UQ���%i��.�)���E���Jk,���4��<3��.'I?e?&b|��5�B��s����qrIwq,��c�%]S�`zuo����.G�)J3n����01�aY��������E�H���������L�^���������|������g��-*���>�P~s>����=L:-��N�����vv����:�:��f�C����?�k����������z�\�������_�����7I��J���Ia��]�U�2h��T���m����6�c���R�����U�2���w��:���2oe�>�����"Vc~'��y�����9�����A;���Ej�C��!��=k���UV���{v�&����C�7����]n8K�`$m��]������Z����xe��As����i;�N��m��������(��JFC�AW��!������j4����S'�n��Y*
s�y���y��X��.��:�=g���;K>��X>���|+9g����G1G�;�S:���M�8/�y�������V��=kf���#����������7��!ij�o���s�\��)Khoq0��k��n��T}0�t���3.��Z��FC���6�
����?Y���f�����������P7�-�����t�3���aOd8��RQ7��Y�u2���Z>Hu2�r���5�6��m��
�<ap	R�EM]�x�O�������1?�l�{|����z��X���*�ME<s����y���D����M�&2�2���2������"2T���U����N�O�������9��dG`^�~��v��I�������=���?e�$}abq�@��,���b�Y���-����L
�&J���D�����a��*��N�n��$���j=�y�PSrI�Wh_[�'�z���
���@w��age<��0����g���������3h;��6��w5�2_s�� ]� �����>�	��������wv�N������������wO������O���}2��?��c{�`ggF��H����.�ZQj?$���n1����w�y��WO!H�o�2������CAh�W*w����a����'*]S�(���9H;I�{�v:x���o\4~1����Kn���5zDM2��L�U��^��2s���I�d�4�z�iEE��k�T��kry�����9#�<�=��{����(�Lr\U��U����$C�����.ZP�<��b��Ky���
��F3X#��d�f��\U`&+}S��9���o��e��Gaqc+B��Cbz�J���~P��9�bx�`eK���}zxr�>��E����B�
���`4��������[�3��/M�:�q��d�����'������;���M�n�O�;����|���/�����aJ�����,+�K���)Y����N�e�U�����Z[����;�;�P�rK���]�#��fh]�yv��(�����)YW�(��Urc�x(�n:�t���'a�
��<���|'m_�}}q�z4<���>���u{�`�t&m������>��0��Q3uaa�+��A��a����r�/OJF��_�4�������������=����Z��O���5�w���f�0������� 9&35<$A���������q(��=���������"l���\/���NG���`ljI;����f��������p��7N�����+-�p�oP�Y��M�l�"��`���mB�^vxO~9M���x��;�p�F����"�����|�N�exq���u��gG{���KZ�\���q���4��\�l	E���d��3g�����s�.��X����q���I��j����]h��YYe��QSz���,Z�Jhi���UA��F&�2$���0����p�ex��3K�rD�@���q��d��;N�)z��9�1����������7}� ""��{)
*�l���e}���M2��:Cf��b=B*9|&jv�yjX������h����7��!�gCl�3.��������u�SR�^!���`�I'��U<3���A�;5!L� ��}������h�S��g�k��\!t'92d9��|��,^�t�`���`�o�hm�^�W&�eV���V�T_2���elN���;B�	p�9��:�'�1������6H�x�r&V��������T|xv��}��\R����/��������������''��e�cr�9_�4z�D�DSc��$]L����v���~i�<�;>�}[3�I�Bjt�|H���LH�(`�h�w6�@+p3Nzh�X�8L5��h���}-�{l����.,yG�/��4/��/����eY�3�m��0��#f�3����1,9H�����
'�������6��R�P��K�^��x ���P�������n�[�����������h�Ys�������L����=�s�K_N������������Wo����w��7��J�FN���}�&:�����6�J��&Vy"5���W�|L�V���I�}/���v=_���6�yhSyP�s�����<���A6��2nm������w�{�Y����Lk0����?��Gxc�l\��&�b����w���[z���h|��63p��[�'�����[������Q�8+b"�������I���*��t23q�7Y�mF]���c��7�:
����7�v��\6����O��!�elh����1���K9��h���4��BM�	��e5Q�k��o�=
�f��_�����h�g,���9�����Y�������5X:k
w)n��B����	����Q����������D�$_�y�<o??8}�s���t�K7H��Vm4�����.
�����gd�Cb.��NQ������������,�>~���d��]���	j��Y�7����`U
�����3�W	�"�4+���?��e;;_�|���}�i��!�:��E�)����+'�-ce��52������_u����$3�w����{��9eG!?
���&,>\=���I{"�X.2��f��Y#�e�N~�gqm�l���
����z���g�f~y������	'?�>3bj�o&��%�&B�z7��z��l�%�)c��
�"��t���$��������$��� ������+�����jw���_����f��_�TJeE�"V��RY�w����[a���F�/a�����S.�z�
��.-Yq:���Ls|��"��\��u��W~��EP�O���h+�������{m��I���������������%������d������^�u�|����&^S_�A�����
Y"hg�pT�t��������>�z3+o�;�������^P�s�u>i<o����MF]����/��
�#��6��&L�l^'m���1
�!�bz��?r����a&d�n����5dk��|������D�iYl ��v�FR�����Wtu�����]�G��0����8U�[�e���{�b��5���3�jqq�t����vv<�-�N����_��;�}��o��gg����O���!�������W���=�i[���t��-�L����v-]r�rM����{���6��?�)�"��1�\QbsG���s��$�?�C����g�
��u��^u�+�PW"K��BqA��T��j�9�_t���GY�(J�46w
M��r���|��]t ��&����pb*���������y�U��T�T�� M����F�7b��"�k�h����x�xg�}y�<�s�>�h�ps�K�`�k.����\�;�`{�Bb�������z�k�R��EJ�|�)�m�q>����"������g��������������g���S��������?���"pDp3G�<�����g�c��"3f�������0^�\v���
�`8��c�F��c��7�bd��$�$����4�Ry����IB��0���Ub�H���_u��s���+
7�]���Yq���Y��l�k���Q�+��+��`���]���}��P���C��uyY��������~�����������,.�����)w�:�1�^��h*�����3n�2�
�3'�)�=K����N�./=*%��9��x[�`�qr�����$����*��y��x�R���b��^�T0D�i_�<�1���!7��Z�9�J�z�����s-����`����g�l�T�gk�_OP:_�i�6wwY�'YR�!]�&���e�-w�
��.Q�����z�+x�f��Hr������u�Y����e��o�����&��Q������Q�~v�H��n������V�B������FX�@��Z�@/����~�%3����~�:N�&��K���n���-�=0Wb!0BL��&,�l=t[�U����A��h��CY�O/z�q�v��a�����������?<���{��q�2=4Ueg{	�h���j
��)�*��R��X��k���D<>n�������5(V,��df�fv���\��i������M|R�&�	���;�l���a6w�g��k}5���t���������N}/`]k���o���������8,=y	��h�V���jr���&��V2j�����d}X�,?���dV�6k�������o����E�g�~f�m�!7��5�b)�%�
��������["@^5�z�A�'�6����^�^��~���Q/��� �"
��-������,S�D�?����MaK���)r~�����������;c�;;e�o�������o8�B$��������y$+���k�eSa5#/^&�7dl>�[N"K%���+�x}�&���d�-^%f����
����<�e��a��k��Y��f��4w)]dG��0�N���B;Z��y�����%������UQl�{����eIT�-�
������=�^d��7�f�xEf��gzN���A�n[LS�sv��-�o�L;����������$����s}�
mr�l�����d"}�NB<�z���R��%L+M����`�}��eGH������:�>W}�Z�����E���]�5�k_���:9��N-���|��pwW���`�m+VT���
�����z����Z�Ki�r2�mn�A�ew�x�5��������)o�1NQ90(-*��]
�:^u�ou�e���;��ysM�^x�����9�W�����6���6<����d�!~��&�Z�G�����|X��aS��,z��;zf��2�}�L|?�B���s3�_��Mf�.;����3��z����eP���[�/z������t�Uv���Y-���{�d�{������,�����*{0��1���X���ae��$�d^K�z��$��w/n�gz�������&���G~�H5�I3���i������u�����Jj�:�O
�}��:Eb��t���Jv��e]�����Q�N��������Y��Qq�Y�?1n�D8{R\�F��qi�$���F7����p����B�;��eBi�ks�!��J�����������W<���Z�5�y��6����g�,]�~�U�Y��I��,�a�����L_,?��H��{�����m�\�x#��x�L��K��'$d���wW�Bqg`�'�
8��� p��������b���t����xz���f�-��@0;�9�Z�Gf���}3��	Y��jin[�{�T�X�f2V2�:�{�1��SNo����W�O!��������q���'���2�.�|}g����w={8�{�lg4��ldV�;4��h�����_�
�k��m���'fe��q��1�ji$�d�iz��wKu.���!�I��������i�%*���
~K�J���I��V�������X�����v��]c��P9����N�q-�T=K�[�|%S���^�'��:������ND��;^��(F�$���M*#�I�
y��u�5�'���=�������Gi���f�x�Dz���g�dY�/G'dN�u�����Z����7��%w���<��}�1C�~��,O�4cejcc�<�c��\b�T�5��a/����8��	�&�[|�l��T� �%�����SY�`���:2�s�p��=��l��:*���KbLHy�8;Zfxa��Y���t��rr�Y���i 8_>�B�.[��C{�:�j&=d�s(�],P@�����������<t�K�d0L�����w�-c�����i��}�;}��J��jK6�]��}I�s�N��%���1��T&���DbD����(Sj�99s�(��(�n=�6���g�aL��
��0}����������/���Y�������8����3�;��iY�|��|�e���n�G:2HS��������Toj�Y��������\}4�70QCs���X������Wi�����2�S�X���1����"����Cx��=��>sy������KJ�l��s"�9aK����z��]��E�c{�Q��^D�f��
@�!=��������;�(|6Gam�D��i$�f������4��h9�d;����jy���	�RO�q�2��5��-��h{����Y'��O�Ig��J��C�g�&�����l{�B}��
:�X\*a�l��*=���D�����&s�������;���������YN������	����e���Q�z�
��<r�S���!�������}��l�5{�i��s��X�f���x�&q�^��+iVlQ4��jw���L����-��3����?��J�d8,9���7��G����J��(�^G���Y���s.�D
B����v9���g
�]t�k*�5/?0�+��91$[0,K9���L2�>1�'���+_�i���q��g��9�L[���������j��Y�P8L���m{��EO���p���9lLP�5-<�����:OV�K�WIg0�l��W9	I�2G����%�����;�IWSR/�����Y&6�{�#��h��uyR4�����}.����T<	��8�W�[Y�� Z�~v����XU�`J����n"����c��=��6�����$[���6�J�,�x6��?v}F1�12Q&��s���D,��I|���9e<L��Td���d��T �;&�$k������H��CaZh+ZU�m�W�n�L����4f��,�do�rc�k]�5Q������B�YR�KXr���v�_��s��0�y�F�Ra����lFvG��kY�^���M����}+!�!�Z��Jm>�����>�4�Mf��K�|l�Fwo���Ft�'E�����}q<�Ht��L�9wC��]�2����=��t�������RE�d���J��m.���]cW
�Q�LQ��k(��,��8�)�\^"j�%��4�����g��gJ��T��� ,�t%E���b�[q����;U\�`����c�Oot4'�'�X����_xt'L��3+XL]P�qa��c�w�Y�q~�h���nBv�?�l��������l�&1ua�LL�kam�<�RV�45��p���R���~�f��0��y;&b�6��_����}}���_df�x�_E^��;>��w�,�c��e���V�C�g�$�*�C1��g�5'�����4��������|;��O����2����{D����C���/��z��s�x��}�w��m�����'���9�of��_��������h�����K~]����<�u+����X�t�Uv�s����-��9/0{�����k9���j�x�s^��/����|����^}e�0;�*�r&+���)����������2�+_���;�w�j��z+V�����t
5�Hr�7��-t����B��u����.t,������ 
[���r�FU��+��f��w:Y�,��(����Y�Q2!*���q�O�Y?[�5�P���G���9\�V��g4�.�c��*5�&N�dUM������3?�y*�2=6>��$�C����f�#[�qb�v�?�v�=���sH��	n����������+��5�2�'�u�R��;fiK~2'�cu��eJ;�#���kpd���mre7���vwzu���W2{]�8�./��^���Sn�I�������������������}X&8����(�\�cP���P����o����b�/c-R���cj��)��Io&1�4$��;����k�>���%��!��g!K��~��,�+Y����)�����1�O2'��7���K�gj������cD0�~�����j���$Wy�'�m3Eo�1�u�L���*M�lYa+BGVv~��>�l�19��i.�������>���o�\gG����t����q���A�z��	���Y�i�S��������;�/�}�-r!�����b�cW^�����	O�a��vz�L��������@�`%��:9��p��0�qU!�2�N�'^(���������-����F8���|�������Mw��Iq�F��VK��c.^�=��*=�@ry����x��*%�	��T�����`��M�"���p�0�"�\6bp	�l����#f/��Y���T47������t��\|��;����eqEau��{d�3Ia�������x�e��;p�����q.��i;�;��0DP8����dz�O�P������H�N>�N~�9������]�!��\�?F�S�����5[t�w��c�>�����m]7�������l8�*�N�J�����-�b������m��m�y����O{��ll���w�����_��W����`�<l�u���������W����NNO��=�u�c����&����/���,�����5�_��2\b�k
������oe�g����'����D9�����6�z���N����l�g�Wn���w���N������}��^^%.�t0�=q2^|#_L���Z�L����0�1r ����i����dr���z2|B);�f����s�	��2�����g��a������HOe:��T��l�8��p9x)+T�B�R��\���1�������?<?L�~�.�y�����$��z����Ko{K�����%����vj�wOB�{�����������9DU��*M����?��������#6���������&�L8;4���~4WMU}p��4��T�����b���i(C�j�?��Fd^���=?:���|��N~����W7���)]Vc�g�Jpx=�����W������������9sZ�^���)	��x����Cnl�������{�������t������m���*5��^jf/03�)�H4�\�b��(�pR���������< �����)�i~��)���.������y.�ls+e�����nd+{����i|�����YzaYJ�����y�e���p�A�`��(�_������.I�"�1~��H�|��+�%���W��f)���)���e�/��z^��S8���h�J�3�i�)mq/=Y�. "��k������q�;;��D�p��`6;���{93P�mFv��,�K�����s���W��h����T�?�����,up�m?��c� +������/����+�7~�I^9�����{������<���o������7��[w����~F�7�����i��7�������l+3N��gi�^^��_���!���{dfW!�����]������,.�x�^��;'T�/Ntc���yf������6$���,9*o*	���b��^��l�xd+�{(Ks�����S���%��L��]�$���^V�%��P���@���^1C��'cqMY��9�o��Z�r�HE7����y�U2�L�7�	m#._x�R�[�g)y�����������Op�~v�,��|'W���7��\��Y�����>��Xq!!o�r��;��P����fV���(�0�x�����<D�����+\������sFWi����	�e�?���_���m�-?�O\O��L��	�="\�7��.ld�(�I��S<���	4b�lj�g�5��N��r�X��� ���N�
Jr�������{�v�������4��&��H�Zr������Y��]7=��v�k����v����+�q/[���?�����
0���7J�����N���0$�'r��K��!��	H�����dS�������4��0����-c+1$���^d(�b�y�4;����e����"���pk���������j[��_S
$�����@Z�A�O!��CZ1��F�����H-��4W��6��I�ty���K�I���Ph�B<�[2�W%�Gf.uc��E�w��)����n�����K�~/�n�7�s.v\3�C��4��B��{I����W�O�����'�\p�jQ���?F���*��hv'GGDe&CP�"X�#X'I`1]���0?dh�����
���{���
���\�T�y��f�l7�hi��j�����������X�F��9vk:�{�e�j_�����}9>)y
Wbx�����v��=�~�sH��gi%g��C��i37Jl�x�8���w�s��V��������w���<zy���/r�$���jq����F�m�@�ce������RG{��a�Q,L�c�r�0���P_^$,9��X������4��ZV��Y�2�����������\�������O~~q��} u��������7�r��'�\t��P��k�m'i�4�!&�}��r��U3o��R���~i�<�?>�9>�).���:L�f�P�5��w���/!�ruF/=!?Y��N�Mv0t7e�����,�N
�T�V&����Y�:�d����svb����^���������fH���=�?1�����[9w+���T������fn=��t
�q���7{��
������Wr���BZ�Zg��.�7))Qy��M��vr@��X�F�*kY�$����kn4��,�L���<�b����!w���'0���g����Wf�T�H~�O�i&R���q8'B��YUYP#&%�:�$1]��Y���48��Y����A��^�6���^����)����R~C��_��\7 1�|��Aa��[�~��:i��q�����$��kA<x����h����]0~��G�!OE��qv-v�r*�nmz�gZ�������l�x���{s��-�
���k7��}��?�9W�(T��7o�$���]Xn���V�������wv8,�C,��V�����������	��w���}��C��6������n7�Z� ����#SV��Q���v����m�H��J�zx�l����������1w��%��]z��9,����m7Fhj���������e�E��CYY�>
a��6�Q�
:2�9���oup���l:W���[���������}������v7�v��f���o;�]i������]�v�;��s�r��%���j�3���{�vK� U��|+�Z�WbJ�-iM�,k���X�s�MI��;���{�MI�g�MI�K6%��nJ�����
do�jW��Oic�@3+p��e�����}���Ki�v)���.������{'��vo�K)�;���{���v�v�����R�]�K)�Mw)����R�]e�R����'z�.�]Qk�R������t��n�.��_�]Je�e��J~Lw)����R2���.���]J����v�w)�.���[�Kiw�.���]J����v��+�R2���K	E�w)�n�K��g�.���w)��Fq��Aen�RZ��]J�Jv)�����v���n�.���]J��]J��(���v�r����Ki�H�L��]J���}6�O�.���F��emXM�F��-1�R*��v)�.���t��v)�>z�.�O1xw�Kiw~�R����K�"Y)�[���;��`�t�9G`�E&������.1�]s�����Rb�6���[��w��w)��,�����Kiw�.���w)��z�v)��Z�K��l�Ki�^
���
e�Yv����.�RJ���R��G�����[�K��T�Ki���]J��6����<�Ki��mv)e�W�R�M���.%�`�.���������L�.���~��Ki����&-�A�-_���p�MXX�d���9-�������v�v)U���]J�v)���Kiw�.��v)Y{��.���v)���K����.��v)�
�R��e�]J���Ki���v��R2]��f�����R�uw)���f�]J��y���4��Kv)������}�.��Da��n��X�K)}a�]J���]J��3����W��T�y�.��d�.�2/of��E����;����f�.%�&bg������d���]�R���.��[�R��gGu�]J�o��.������v��RJ��uv)�.��D��K�����.�|`gw)��3�Z�K��/���{��v9�����T��.������{'��v�j���]�R���b�����b���]�R���.��~m�Kiw�.�\�VL -� �����!��K)Up��R�}|9�Ki.�\w���2�I�T�R�t�l���KI��|�R��Y�K�Xh6�3�KI
��K�������cv�R�UX�K���AU�`I�`�$��t�������I�;�����R2�o�����$�����s��l \�Kiw�]J)+��K)}��uI?��RJ�.�����l�R���K)���jq����\s��n�Kiw�Q�����e�.���6�K)-����RrG��������Kiw��������xw��z�3vW����h�����.�4]w���T7�����.�]O-��$��U��w)iv)�y��]Ji�w�.���u�.���]J��]J���r��.���w)����.����}ef��]J�j������
v)���Rb��RJq����;��G����x�O��.%;�x�]J����t'��.�l��p����]J�~�.��m��:���N��\��K�Xpms�]����mK�+m[������������-������t����(���2R2��4��E\���j�����7wur6�lJI�'C���'P����>�6D�z:�wvS����u[�����E{�*��m���U��6��=M��jOS����MrivZfv�R�Go?��d���/����w��^�V���Kn�Q6��!��>[�������c���r�
��~�����2�8�wx-������Z���O��u|�~����[�����z��~[^���3��e�/�k��_~W���YoL]�uf��^[�����|�}��b���&�Y���ZX�s`�q&���>yj�wn���t��3��x���6��c�������� Z}�p�*�k����b*�x2n��]�Y�(#��'{�6�||����<g����]H_QI�u�p�}Dx��p�;[���o�,���2],�0�K�������8����_�����'�����������U��w���T�(��V-�:�|�YNv�����$���H��xo�UOD{�i*&����b2�r���0�\3y���~$.�?����J�gz��gG���;�����]��v��3�GeW��v9rQ0�+{�����*-K=y��H��Q'+��%�M�- ��L�����v�d;�C\��Gk
�3�����A���>:y�\�Y���L���$]�#BU��eA�s3�����W"E	�e�\�V`�y�eF&��sr����l���ag~4g9j��-������������=*�mN2rY.����e������J���O�����a�*�n�{����fm�}�+������RP5�C�w�M�f������
l4�,s=���c�*k��8�����+:�2S�N�����`8l�N���/�4�@�-���>��W���1g/!���p����'>���'Iw�'K���6�z�����W\Eh��Y��W��Q(����:��*
��[�;�fT���.��xY_v���rQ2PM-���4L%��[���K���N���>���i|�KIg��x�gW���������3\:�F�_B^���cf���D�q���A9X�r�,wG0��%x-��T����k��:V����~v�Y���1p�q�a����HH�^��nf�v�����%�HO`40��P�2!����|��h{r��q���'�����E�����hu=
;�&����G��& w:�-@�O��a�r���n>�~8����L9�Y�yG/O�O���+O����Y�x9x���������T1?P�������v+��������o^�������>��x)2�2�*��$y��^�8:u�t(��B
�����'�f�v��p����-����o�hc��VP:6�����=����������f�A�8�F��K���B?�+�,�����d|��
~�6��G����y��p����T^%�=
�TbF����+��'f:r{�T.W���B.��r�����I�����H�<�D���#����
�]
����/������4F��STa,5����8K���3�A���3*`�v�=�_�����f�K������6�}����}�:����(�T}��l��B���!J�+
i���P�q�
�S�,�o��P_������� ����z3��*i5g����Y��TO�K���?GW���|{�T�fZA�����r.�����9�����:���(����o�oQ-��������o��YI��`2�g��]�����P�����"~�%��<���g<�c<�:�����U��5<3����J���V�������Mq
�����{�W�a�N��s��s^���d�	��.�aYw7�����t]���6�qiG@@U[�j��U���=st@�6:<.�d�+%�oTDJ��/!�B�/(���E����g_S)}X���E�N�|S:j������Z�VT.��Q	?>up�
��WFd���'�*�����
��B��W�����d����E�F�,��^Xqq���oHG)�:fS7�;T��~�C���X��9<�/������h�T^�3����[SRw��\���D�+G��g��^�H�b�v����������]�p��2�XD����r^��:�N���Y�f��.sH��ty��X���4�nX�ib�������pU����V?���a�X��d�O��4��i�0U#+�H�nq��'�U�vH}MFwv��aU���5D�3!������?�w���?��������-q����Y�����;�5����0�P�L��P�s&�M��;���i�Ob�W��9;_�:o��J�@u�:��0���fA>����������j������DA�W���g�u���	��������5��Y��_}*���_���V��f�u"������v��
'���������'��R��Y%�-��5\�j5|�K:���.T��	];~�����H���mw�\�m_Z�F�f�B�{���&�+��X��F�����;������
�9?��7�����`8����7��Z�����K������N���%���8��^g�u�@�{�%{cQ�l��������.�zf^P�n\���,��z��U�1�G����dM��������w>L:P�r�.���3!�9.�g�]un�6���
��L��x�L�������M�&��?�GI^��|�&z�I�X]��UbLKJ�Y>n��q���������3*���p����k^KoP�������A��[�����PO9��y�k��������I�3��(�3��x��Y�����`8�&��k��j@�����7@��������oh�e��H����I��l��Z�!>�rU(���xAy��+S��������H�Ei��mr�c��x��uA�s1����Qc�P<]!��/�%z�������\��4}���>i�v�^����G���G��px7�;����I��;�b�&��Eq2{����0�&P0�b%����y"�ig�}�}�#!0M���=����)E���=�x��$�t���G0�wt"�����=N&��X�K�S�w
b0?�����=�m�uM�?������"P�������*i�@�S��a����u��)m5g>g������c�W�j�|�"Q�Q�����]��e�Y������Tl���v������w3�������-��������>4\����Ig
V��t�����[Q��==><8=���K��c�s�����<�^�88��������H��B�{2�����6��JS��QuYiU���8���|?����@IEnZF�=[��=���J����h����n[OtG����Yk��|���#�#������-�������/�A�A����Z��wr\jvL�
�}���}/K<��e��,/q8����0��Z9��saQ�[����6O���n:,�����2
�aK�z-�l����;�4.�$�G^�vw����$,�d����5�Y�����4l��w5��d�%�~GM��k:�\���Z�����_�v-5%��x;����%]�V�����l�R�n`��?�&��5_��h��|����k�y�<�8�����p:�������k�xnc�����~�^������a�Z������a7X�#�m���7�#�-a�h�0ca�j�QSro�����uW~��/������i�{V���;�yg*��Ok�7�ae�XIa*w�h��U�h4�(]�T���2_���<*�<3�v�Ph���n�er��9	�����{D����3%F�	UI!{3����?����9�Q����7�14#M�����mcA�J��Y�LcX�����f�$�u58�d����\x�����{�Jn�73^�u��M��$�%��t���3���>����w^�7��w�.O��B���5�Z��U�U��+��+���m!�]����
g4�Z������:�)^g
L��_�}��?G��6}����� ��W����v��-T����-�]>���L���-��4�F��r���fx;C��������}�G�7��k�W�nO�}�G�����2�j^^�����h���xB=��R;����4���yW���)��|4���E����t���k���y���x2���0&�k(����*
{a���Y!iWv6e��p_�|\G���;SV=���"����L��fV��PC�)B��hr�fF�S����0�1�1���}~�U��t~�Cb�lr�d��;2Q9v��z��4K	��J:�o��!�(�1���R�\wP�d�m@?���>��	{%���C]��6�����`���������~��^g�����5^��cP����+��:+|:_��p}��Ex���my��3W���J~�]9%�rUR���m;J�x�*��*�u+��+��m.��VRI�>.��j���QZ���Y�V!+��S��Bx���a��Q�������F���k��<�^?v��*5���o��_��|�<�,��w������64z���������K�&/Ev������8���I��KQl�4Fk�?���U]�zf4��(Z���/�i�7
�������(��fys��^:�d�5��Mw��!*����
���^t�W� ��_=����?3��ieV#|"��%r#���G7r�Z��Z�v��Z96�%8���q%j��x��$����&�pm�%$+
�=�q����
?$b�:v_������x~�i.��&����?&�;���x�c�u
��w����i:;�Ig4N�5���[�{f����[+����;;3�F`�mgF!���� ���
��"�W6l�q[�+�bW�	���a�FB_Ak��z��@u����^Z�kK�S���������#��x��L�<���z_%���d���<�g~����|?�T4?�
`c��������/G�?{�S��NW���#�%�/���"��j�S��A�4oZ�V�TT�d�O��`YN������%PO�����d8�@-���	��3��]	�����g���|�[���PZq�Gng�fX[��_�2��M.:�>>���;}��gv(�P���[�Ay������~��<�svtd��e�z������aI�)W��2�Js +�������V���;?2,��t91�����$I�L������7/=O(;���ml�C��*�l��p�}p||��_�:��g[�-Z��i��CN����������s�8�VX�y3a���������~|���m����9/�������K���;+�lW�pD�%��+p���T���9�q����G�p?0{����[���N|�:�[Y�y�&��e�����_B���}	��~�������c~m/��'V�"����f��c����2���_���U6?��Z9���W��o�$�MY�W#����;{g�Zo���������������>����F�������2U���F������+�8�k`������I���P������:�����d������[9��������8q���������.G���-nJV:r����6��g�����^��,���-��}�������)~��N�]D�q��z�gQuT�-|��5t������Q�lx�����a��+���9�3�D�*<>|�����w����������p�a��:������Yy�yd���3��������n�2n��Ie�inHLk�w����.-5�.�8B���H7_3�x�yo�D�k2��W�?���v(%����]bU���(�L�E�hvu�iJT�k�_�\Y���J���%t��q*8=9s�Lf�Zg`�s/���z2��&7�����u�p��e=9������Se��u%��������Mz�)k[V�����G/��u�{��8%������ag��^�X��}c'�������CS�40���@�;9=I�1���/@Y/���,�`m6�������%�o;�M0��D��6���?�����;�������7�O�dB	�[;���%������;��:��\�3z
�S3�&!U��||�~g���^�v��r��a��#s���N�^����l+�u[l�������3�v����x"�~|a����_�f���q��]/;��,��e%��=��*O��;4.ZH7��-��]���t�4
































































































































































































_+���WPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPX��z?�t��N:g������{��C�Co�v8���%7����'�����^���`�\&��^�3�8�7�'��'D=O_�xqt�����>������������M�z����Z�ctW������a��/_,l�$���N��2�D2w�K�nwUq��.�lA-�2[mY�����k^����S?g���~e����Z.��u��z��&��p�L����J�J��Z��������r�n��_��b��&�k�},�|�����nZ(UZ�Ju������n�(�^my���x"�T)M)�t���~��$�8���VF�z���?�0��ZPA3hq��A�QX�a#l��0��(��(�jQ=jD���5���ZT����F�Yk���_�a=����z�����q�o��5j�z��h6Z���7�f����f��h6��f��[A+lE�Z��j���V+���h,FE1
���'��H4�P!�Gq�;�^�[�:���kA�>	��(kAX�F6���q�|)����� �Q#��A�
�8����5��^j���j��u�M���u'���A������F4��Qm�J3h��F4}"��f4kA�4AQ+h�A�'��0hEA���A��@+���G�0HAq-��A��f������a�G�_�z�7B�����;>���>�c�(4�|��@^3���0D���!�/�F�0j�Q3�Za�5����j�#pI=�5�Z3���Z�}<��Gal�i��fXo��8l��	�jDa�6����f�h��8l�$�hFa�6�aL
fj��8l��$lEa���a�����,0�"wpT�����0n�1X<�����E~-������f��"���5�7`p�Z�`�
���5)���{�<��5�E2!�A��8���5!~�A��Q���Q������
1�x���p5�z3���z5|r(�5jQ�	IkF�V����O�M�T�5�Q��kE�8j��k�X�jQ��Q�
���`yPB�����(nF1D��S@d���j~��7j~���j>����P��3�
�L��b�}�Y
�s�@f�CK>���Q������q��d(�;�<P=�=P>��V�)��5!~�C
5j�f�����Z����
1�x�����5Z�F\k�ep(�5��&�T���k-�R�M�T�^k5j-�<h+('
|
r��Z����Z���S7��AI ���~��7�~��C\}�
j���Sq@;@@���>5
e/b�(*�0=8$��l�m{L����%����8����>�c�>���������������q��S{A(�kB����n��z#�7}*6�+�����P�P��z3��|�<�28��Z�z�zj��:���yA4�^���������_�\��o4�f�o5|�5�J�*;"%�a�F�+�!�>�+�TD"S�@q@;@�w}�^�eD�S� *�0=��S+�#������O�����5)����
�PE��ZC��]#n4}�yh/%x
C�_�0z�F3n�|Z(6�+����Z����0x>�tD��G}���&6����:���yA4�7�~����4)�m�������r@���6��Y��8B�BWB�}"����@u��8���>m%6��P��3�
���i���e�,�N�9�@��e#U"��A�}���>�.gc52�8t�q���B�C{A(�kB����������b���
1�x	.C3�o����8@�A���x���Z>,�OK' ���f7�M,l�O�K�Q�J5��
��O�LEQ7P/7� �(�����j��6��������S�#j�^������>�<�7��!�5�c2z�� �"�!�o�����[�X@�G<j�<�F�
^U+��8�B�C{A(�kB��*�}�0��Pl�W�!F/�t�bq�bq�bqnbqSbq8bqbqb1���XLl,�2�����bTb1�(�XTv,�75�B�E����bQ7�(�XT@,��X�"`��J,L������T,��c!X,C� �2�t,ci,��b�E}��x�L��CJ��.)}R:�>�lqZ��t2�J�a�[H��.9�kt��z���Eg�.�7tb���!��A��.�4�4�4�4�4�4�4�4�4�4�4x4k4^4Q4D474*444T�T�T�T�T�T�T�T�T�T�TtTgTZTMT@T3T&TT
9E�K���Q�(H
Y�N6&��%����Jg�N�'���8f�D2� v�#�D���A&H�@���=x��t��r��=�HHO�@�j� �V��C�&b�AO�@**`*
�i
��I��V���Z���R�pB�=�j���k@�GUNE�c`!(��G�g��]����|2��n�tZ�������Q���3�����l����������{����$k�o�S`<3e]L�w{�]�f��%�$��d��B$$�1E2iY�����S�$@��;�4gSD�Q��U�.}�F����`�����A����zt? 5����B:��l?\0w�`.�]���gD�Q��#�"�=a���j���xptMP�n�	�th���?�]�z4�Q��i����(���X
~���E����".�?`�)��0�p�y���r�@��24���P�N/�f����:e5|��,.�?���(~��?1�P�(���J��:.�0����r�T%.�?��p��-��
~�S~����
���j����,��H��&.�?y�P��!/>$�(G[�6mb*����B�k:C(G�����"t8���?.�(~���r�,i%^�l_\t�iC����r��� ��������D9�-+1?`��B9�V
.�P(~�zP�~�q�����HmbcY�(����.�?�4�S(+�~��r%�~���
�.
Z��� 7��������'�JY��.V�\(~�b��r��,�~���C�rt@hX�`�!D���GE�M�t�P��&�Et~�Qc�\���A9��.�?D��0�q�\���(~��
�J�0@q���
Z�?`�)�	~����r��%\������R�
���0"p�����(NY�^��.�2�Z�,[\������8n"5�FM�h0q��N�p�n����p�������+ ��C9�.�?`��

�aB�k��7D+��+�2�����t%$E�����E�#~����p�\��+zW(~�������p�����?`W+h?`	�B9��+.F�h]�j,|�>��r�,:\(~����YYA��F<�!AE�62��XQ�����p�.qM��P����*��O�J\(~�����V����r�\<\(~�������q��D9��
.�?�B*Xf���#�D��G9�ft9hJ��%t����J�T��t1Q��"�B�C���k���8S�����'G���\(~�����#]��e1`��B9��5.�?`�b���L	�~'.h���+A]���X�bnzWDC5D2���D�a��)+���;�r��Q\u�q���T�-I�������0�a���i~�?�EW��x��P�������*.�]����w
��b"1.�x�X��H���'���+N3�n5�g��t�%�K�����bj��q���#��;�O��������:�P��w�����2��������[\�e����x��
r71j"M���r���~]^�?���B9�%.�?�<�0,M��8��P��;���LH�>0.��(~���r�\aef���q1�M���8��P�S��_������UF9��L��2W�f���G�,� ��ieX�&-]|:�t������;�h:�e1{���B9��'.�?�*��M�yV�1��P���#����x{�H��"r-��(���Rp������F9�^5.�?�X3A����
t�Q������8�0���T?�g����r�|m\(~��V�<��St�Q������1�����P���q�?�/�%(+������8������g\��@0���1#���1r%:�e�t�q�C0@g_���7��?����F3I�M�n?����>o������cL��#^�#�;'����\��,Ja�7�h�P��2�	��>���28���9RD\cO�����5������[��q�y#��w��5��32|������X���0��6c��E2������x�R&T�(`��],�c�IHf���.�&0J��/����1
%�b\(��S�3D��'CzUI�{�0�����#3>���Y�=��@�1�����63��� �^�B�p�O�1���>����2��)����a���FV5aD����b�D ���T����������gz��z���[�'J/�$���b�xl���i����D���
���b�x������N��7���b��z�eJ��%�EZ���Zj���E���!Z:�bh���h�!&��HN�&]��D����TD!"���@�O�Nm-��������|�j�X�F�4�"-5���\^��?<��?<��+������'n�'�XMLNOL���s��$5�rLs2���%�L?2�H�a���*�(��������!������^�5�?<��?<�CD�1@��?<���1��r��~x���)����~x��~xufTP���e�������������"��7���������5Q�H��$=�?<��?<��?<��?Dm�d��\^��~@���	Sn)�"�;OBq�kb�W��l
���a�S��(�t$�lL1-�p?��TQ��2M+�X�cb��S&I�
e��j�qT��~T�Lo��Q?*�G�U�X+�Q?*�G�������~�:d<�����~T�Lo��Q?De2f~T��
�Q?*�G������V�?*�G�����~T�LoH�^b������G�����~T�Q���<�DU�����U��Zn).�TO�EU	S�����3G�<��S�(~T��*�Q?��G�(`,�s$��r��2��\s4�=.�f���aI��S�L�2-��+!�1m��
~T��j��V�?��G��a����U��
~T��5��Q?�?��G���U���`�
���/����*�Q?��G����&sM�C�{���U��?��G���U��0h�����s���-�[<�xn�����s���-�[<�xn�����s���-�[<�xn�����s���-�[<�xn�����s���-�[<�xn�����s���-�[<�xn�����s���-�[<�xn�����s���-�[<�xn�����s���-�[<�xn�����s���-�[<�xn�����s���-�[<�xn�����s���-�[<�xn�����s���-�[<�xn�����s���-�[<�xn�����s���-�[<�xn�����s���-�[<�xn�����s���-�[<�xn�����s���-�[<�xn�����s���-�[<�xn�����s���-�[<�xn�����s���-�[<�xn�����s���-�[<�xn�����s���-�[<�xn�����s���-�[<�xn�����s���-�[<�xn�����s���-�[<�xn�����s���-�[<�xn�����s���-�[<�xn�����s���-�[<�xn�����s���-�[<�xn�����s���-�[<�xn�����s���-�[<�xn�����s���-�[<�xn�����s���-�[<�xn�����s���-�[<�xn�����s���-�[<�xn�����s���-�[<�xn�����s���-�[<�xn�����s���-�[<�xn�����s���-�[<�xn�����s���-�[<�xn�����s���-�[<�xn�����s���-�[<�xn�����s���-�[<�xn�����s���-�[<�xn�����s���-�[<�xn�����s���-�[<�xn������[<�p&��������3��~�
}���o9�����?��o�o������(���NG~8�_�;����;m?w��_��ipL~}�:R"�u�����4�4����]�hR��%�.{��"
��*'�XPR�������`d��+`%8��m�3��0����j�Z�����u�E�P����F�YG4�

��Z�h4�
tI8��o���f��l��Z ����PQ�Z�e�M%�!�����>p�%(+�B��,�
C��4@q7�B����
`���4��D�A�B����`��B�k�Q�(@J4��j�h.t':��t9������N����+
&��lz�� `5%p0	��m��%�A�^
�t8i5��-�4$��P&����!���R��,`�c��l�)t����z�:���`G�F��?Q��(Y�O�Fh=(4�*�!���� ��f*d���P�\�W���0����k@5b+x�W����J0
1~3`Q�
h|(�@���I�@��]@.p�H�!����PL5�
p��V�YeQQ4L�3� �-�	����6��`��"��=
	����z�:Z�@nE�"�A� FP���]�;�zPh�UPC�0PD����j?W����0B����u
���54�"/x�W5�hk���B���@E*�X�T�)DG��[P�5�	�P$�
����Phi(`�V�Mh�58e�c�(*�z�l�u;G��sp`���%���g�z�v����z��<p9�D�P�@�@�@�@�\�5t!�����P���1��a���Cuh-��@@t�(c���Q_�����O���c��'xU����}OD�z��3Ac�E=5-O��6�HGxr@\�T�D�N��9�-S�P�*lE��A��
���l8�*l1F�^��2�����`w��h�o�H�K��cT�T���P��p��B���.��:�w�Vo��- ,�����P�P��Z�����(c���Q_�^k������A#B�1~���^k5j-@�+jJ�4
H}=�0z�L%J�]!'�a�F�+�!�e�W*�
�L�����[���XV�JD��An���9+7`3�+Sa��+5�)t�����$���b����q@Wo�������Pb��q��k�-�D(6�+�!z5��@@�[����}�*� �n(q��=M(��>1�X"�2!��V��&��
�*�L��6�p�S��F�Q�Jy�@D�U�4P��|(h�21�[��P��2�
��,�8F+�!)4�#���l�J���N��`�[
R�R��eU(1h4Z����P��^J�5t!�4a+�4���@�Ad1��x��u�(�����JXl@�2�F@�RN���U�X`C��K��P�����mX&,S�W����$�j�_&bS�U�6������#�L0�0W�Q({u6������*��:[���V�i�a�!�o����h5�0��G:��<>F�
V,T�C�yh/%��w`_I��'�"�l����<G��%�TKL��7-1SZbp��th��8o	0�b[�-���XK��%��xh��o��n��m�m�Bl�jk��j��i��h�
h�0�D,["`-��������������%kI���[�-iXKHl��Z�XKl���Bm��Bd���b��!)��Z*H$! �w�aX�!�S*a��I��q������O����M�2��qB7�.*�O��t[* %��4��g�Nt�����i����pCP!t T�T�T������B���r�
���:������	U��BNQ��J��G� Q\(�����b��h�1F#��IP����Z*�&�����x6�D� ���Fn�8
4�i�����Nc�&7
k�X����r���D�J�AY���������r���
���#�?�
��I���O4�����TIp���45iB�4 �Q�SEQ�$�H������h?����(�dd���4�hd<	
Tvb	D���-[Zl�D��DjDJ:�vzt=�{����A�R����$��IL����~H�S���?��|�YD�'�Q=S�����	����3A�������]�z4�Q��i����(`%K����h���\��r��a�v��.:�4�P�(�j�@-��S���e�lA9�Qs9|��,.�?���(~H��C���B9����~+a�%AaC(^\(~@U�B9��
WK�%�I��"����P0����H�Q�LM\(~�p�T�C^|H	P��,m4��Tb]+��8�t�P��
�:)tE�p0�M�?`����r�,\(~H���~���Ew�64���a\-����p�\�~=mH�?�A*hN1?`��B9�V
.�P(~H`��~�q�����Hm���)�@A\(~�p�����Rz�x���
�{7�������<�DU��r��1\(~H������Ua�����p��!��:�����4i���QE�e���/��+E��n�&���8"� �C�r�\-�x��?`��B�:#)4�Q�����!���0q��E9�CT���/\(~�\���
��$9�Va��B9�F.�?��Z*"�O��5�{�Q?`���u~H�D���	7jE�����I�P�{t�P�������~�Z*�B5_a�N��p8p���G%f��0
!�5����O��V]N��G:�����rt����c���~�#��ru���]��;K%�;��\(~�~�E���I��X��P������0Z�-I&�`�B9�.�?`��j�����<��%�^fP�������R���h��H�Q��&i\-��"TztQ����%.�?`E������G�?���B9���J�r�����F������$#,3���C"���]3�4�������a�[*�B��(Gw�N!�m�w��.�?�L����r��$�h�pKp��G��tuZ����c��0�q���WK%�$g�I^�!��x�C����m��K��h���	'�?�?$AH���;�r��Q\u�q��!ID�-I�������0�U���
��]U�?�Q�B9�C��4�x��v���r��)\-������(�}�c1>#q���H���8�(��t��"��@.�Z�����'M-�>".�?���b��~gK��4��9�B9��.�?���j����=��5%7�~��u%�~H�U�ZO��)�Q�h
7���J������������(q�T���a�ai:�(~����r��)���		~��Ew�����P���/�L��0.����WK%�i����q�\�q��(~�{S�c��f3H��#�jI���2,@��.>y��t��zK��ntK��4{���B9��'.�?�*��MH�Zr��3g�<��������x{�H��"r-��(���R�������F9�^5.�?�X3A���4�+L��F9�6.�?����9Mu�~6.��(~����r��$�i����q1�@�����Z*O��������A�G9���J��-?���B9��8.:�(~H"��3��3b�H(#|�\ID�9�t1P�A� `����?���67#��h��1Og���� 7)G�3�r�V�������[���O�����������Jfn�9i�_�:�t�^t�����n��s�z����t�=>z�\�`�O�NL�AXr�6e��(�7_<���qf�
8�s'��a�A�����s���S��3v/��E�{����eh>'��T/8/��=�����q���P��h��?N8��u��@v/�t�tp����?w����H�:��s1����G����o�V�fM.��W��/:��E��:�`4�\������1	.&AHv���m����A�����;����O�^�{e�'���W����'�;��9�����������������������#�����������������������>�5�����������������������������������������C~V��T-�LoaZ�[��-L��vS������naj�0�[��-L��vS������naj�0�[��-L��vS������naj�0�[��-L�_��R[{Sh����,o7�#7wz�tv����6�gS{6�gS{6�gS{6�gS{6�gS{6�gS{6�gS{6�gS{6�gS{6�gS{6�gS{6�gS{6�gS{���*G
���wv��hl;�� p�Qw�$�e���l�����F[q��rB����&�q� \��H�T�W|�~�x�v�ny���N�2�~p���T��*����g1uO�.�aHj����U���3�.�C|��7c�����=��?�C��.���OWR��`HG��6O���3��Fm-|��q����I��bJ�~���\����,�t�MA���Qo6�g���C���g��q���g�/����!�;�M�����x\;�}H��d��Z}���ONY}vwa�3��MqP��g�z?��������:;�����n7����������Az��r��7���d4��Nwtu��{������s�?p���?y�%����I��W#���������;����!{�%y��|�)~�tg�I0��6��2����>�#5`��yj��* ���F<��� V	��!���w�f��������<�A��\���N��B�~9��CgL�G����\O�x�������o�^}_�/������Q��D��_������~w�x�������vN����y��� �m;���~�}�V�r�/��!x�P�����5�^e����/ ������,	<�������I��9\R�_�����On����q�������c�����w��}R��O�DS�\�&��1� N�DS'�];7�t��c�_�Z���[��I���o;��N��MS���7�+$��6L{���{�����+����~/��������UVIUV���=�8�z�t�w2I�*V�I%�R�O�� �4J��Q��_4
�m���o���
�<$�w�A���a��/u��Xx�po�9E}!~@��v*�z1�O}>�P������p[�9C?�'��(D3k��B�c��P$,}��1��f]8���)�n�Rw��{�������{�N����T!=t�N�J��]�v�M�r�u��^_I�)��Cs�1
M���Y���A���z���}Yc`��=��%As�8��I�9!�m���z�x�j����m�}5����=�����?�$��"�Z�t�3����G�20�E�N�	_�#vO�?���/
�}����W��k�Oh��B�[{�~�
��C���[�s���M��H>z6.A[�`��Y����y����_oD�*M����'a�S�O�������C�Jj`*cL�fS��s't�p];���v�U�&��~�����
��%�+tu�O��N����������{��������u4����u$���Q����N�0\?
����p�?���������1���N�O�cbf<�/<���jz�%]kR����k�#���6=�a �6g$�!�0,��>w�Us��Rj1jQN�"J-���G����O~V2��!�$��E�������&��{�z�{W����ET�/���*�SVPS�!%����
/}h����C*�����|�<��yJ��%����u�|�s�F����Z?%*������h6���n:_;����0�Pq���c�������f���%&�e��}.r�k������(<7��<-�ww������!��Qw��`L�6�_m0��%������>3Uj�=w�N��:������U�3
�i���������Q-��N���K�O�h����F�@m��������h������_�����Z���q2�n�v��]M;�3���+�/O+k�+wdR����F�
�]�H�C*� ��s�����{JN��{�_8��2�OD<�G�y�.p?K����Z����^�{���^�;�	=��J������9d�����x���������������j����K�h�>\s,���P��f�xk��a��GI��[)|@<%~����s�6����{n��H:�jF�J��B�0.���� f�Ig8�\����3�1�h9'�����������4@���W���%Q�M/�VJ�������
��Qjy�j�I_�rS��F���M�;B�<m��w���73B�[v�p�s&�~�����h��Qm
������'����D�9�`���>��s�������_�p��HO1�6�OWP�b�#Z^�04�C��A�\a�v,����G�}�R�Qy_/�M��2,I���2�zI�d4O��V��%�%�I�oL�O�P|�?w����/c�s]X2�� X���m1��]1����O��>����s��_P�\���� �����?WK�n�C:u�Q'����M�j�@�Fz<3�5l�(���jr��xr�-V�A�����7�k���j1������8�T������Pb��<�T��7�3��������c��7zL��I�N0��4��tJ.�����n�������X�F����/�(�.�:��
���V�g��������
�������[�U�)��M��Bp��k���Z���\9#4�V�������p�O6V������h%��D�6N&�����\V�lo�1�MT"I/t�2�]�C)�gV��h�R������J��^Q�\�C����e�g��@�l�6(�Wh~��*���d��s������y�������@�D��t�
�����+��9��6����
���E�=O�"�#��������YqM�=.��=+��E���R�w/��p�Wjld���ZjE������z�f������j�Zz_B���I9	$��Ei<��A������]
J����(�b���@��u�?������r'���.�2M�BiY���@���{�?s&�����A�-V����@�OJ�W������*6����
+Eq�q��O�j�`J���W��d`�/�8�0���7j�L@e��

o���x�4v)J����s�|6!���8nb���Kc*����1�^BM-����������:�B�(��U�o����������h,3Aop���_E�/�m���U�\��P���3a����'��x.�����7���Q��m���m,sH�{:><5k��X�d�:��������n�p4����V�vDL�������VK]�������vj�B���AO��%���>�����?D��y�-4���f�����n��b��d����U�x���LR��H�S��2�� �3a�A���Ai���lJW��W&��Al��������A[�m�|�L4��"��}	�5|���9�}�PC��J�������w
4$/5�^�r�q�O����N�_��;z?��O����_�p:x �XR�_T ���_��������4���o����FR��o���2{Av<��������\T�59%e�d�N��	��zz��[�;ku�����6���C���J):76�����V������K�d�������d��r�1����j����=����p:�����E�b������l��-�{�m����S1v(�L����l:�~�s��	��I)4��$��@��o)�$[h���)��	��{L&����)j�>�z��5���EYL����R��>\��6��k�9(_:L���S�<��*<�d��k����"yf�~�����q��+���TF:�<� fs��"+4c���oA��T�R�F�����3n�?ON������(t�w�n=B[NE�T\RQ�����7-�����[k�F�E�C9��j6�5b�2s�� ��P��GH�#��M����|��z�e�������+����_���t.�tz����8��]{���y�������71L�������&��(���O4�hA��������\0�:�B�:����
 %R���q��LN��o�q�w��}Mt�j�����[jN
Ly(g@�S�����=9}M�;�_�3����Z(����S0>����?c�!����jr��#>�#�kr�'�����L���=��U��W�^61Ol�*�J�R��+�J�����j�Z����j������Z�V�Uk�Z���5k-91��W��z�^�7��zKN���������yYm�LP:���J��H)��C`��(������]R��j�j�j�"r��'�Y����[�J�r�T`(��6���=��r�`P�&�������U.##�+����p���((\{�H��I(�,0��������N�����GD��&������m4���_*���zm��������m�u���V��~bq����J�U���{k��T�{�+�+��^����R���J�^�gWU-PU#��Z����U�T����Q�*��]W�H]9��*R���;�E*�9��&r�9�`7g��E���3��"#���n����~���ws��[d�{9��-"^��/G�"���N!,����x9��/G�"��H�WD�	��H��#^	��H�WD*9���J�T�H@%G*E$��#�"P�3}�H@%G*E$��#�"P���J	��H@��Ts$�RD�9P)"�	���j�T�H@5G����	���j��_D�9P-"�	���j�T�H@-G�E$��#�"P���Z	��H@���r$�VDj9P+"�	���Z�\Dj9P+"�	���z���H@=GjE$��#�"P���z	��H@���s$�^(�#�"P���z	�����H@=G�E$��#�"����z	h�H@��4r$�QD9�("�	h��F�4
EAs$�QD9�("��Ph	h�H@��4s$�QD�9�,"�	h��f�4�H@3G�E$��#�"����f�L@�4�H@3G�E$���
("�	h��V���H@+GZE$��#�"����V	h�H@���r$�UDZ9�*�
���V�|X��
e��y)�B9�rnR�PV���+����c�B��r^j�\(7V�K��e��y��r��X9/AV.�!+�����d"/I�U��&+���Tq�\q~���T������s��2��)�b9���q��qn��X�87q\(s���������q�����>v�����[(������B9d7/���"�yid�P��K$��2�n^*�-�Kv���n�l���Nv������[(������B9e7/���*�yie�P^��K,��2�n^j�-�[v���n�����^v�����[(������B9f7/���2�yif�P���K4��2�n^��-�kv���n�l���nv������[(������B9g7/���:�yig�P���K<��2�n^��-�{v���n�����~v�����[(�����B9h7/	��B�yih�P��KD��2�n^*�-��v���n�l����v������[(#�����B9i7/)��J�yii�P^��KL��2�n^j�-��v���n������v�����[(C�����B9j7/I��R�yij�P���KT��2�n^��-��v���n�l����v������[(c�����B9k7/i��Z�yik�P���K\��2�n^��-��v���n������v�����[(������B9l7/���b�yil�P��Kd��2�n^*�-��v���n�l����v������[(������B9m7/���j�yim�P^��Kl��2�^^f�-����R����g_|\�)�Yh�^^^�Si����������nw4<_iH���6�����r��������M�f��(:>���K>���?-����u�&�����M��x������.o�D��V��f�[;��{o����l�C������X����t�L�Q[v����[����G gP����Em�<�������i�Oz��a���TF{����8�34Gl��h���S*Yv����5
��*�?q��)�/���2�%u~7�v\��|��h>uOm��ao���t����9���{�CLdW��z:��hp[e��J��e�zz�������N�W����������^�L��� ������c����1}�����M�|y�:��Nm�4��Ll[�f����l4�m����:6�R��cr�L: ;�����q.��k	k�j���h�ti]�|��ju�����8W�7GG������3y����O����r��+2������m�N���[��Q�-�Fn}����n�o��xkJ��TJk[&%�2)Y�ju/�����K��LJ+��$�&1*:����1���I*YUD*��k_yVVV�;��Cq}�{�\[w������0��G����w��+���q����
�}c��;7n�
a������&��`r5��s�������l��`-��|7�����ym
tc���{^��������M���]q(�1���H����y��*�|O��@�|�a#�����8�z���
�l/�P$�����{��l������������_^G'sE-���
H^��	�}}��,������[�+�Z������H��k���C���+67�3��Z+Vn�-Z�
����p�}���>(/�$(wi�Crc1�-��P�����	��d:��D�z|��Y�<h�w� f������>��:r:sV�/�W�<�n�l�\���c%��u���Q*�����8g���`�t���9h��>@��{���t�����ZE��O�S���C����\rj�=��|����*P��$Bw��@�6C��=�}7\�fB\���{��f�b�����u�D��J�!�kg���I7�44B���h����n(�+f�?N����E���k�L@���OQg�9�����@�5��+�Ik)�;�j=}B��0n��-��Ew��f��;�
��������z3:I�i�F>�|{t��|�w��t��+1������?g� ����!k��Z���I��u�����ev�_�9����`#:d�'C�C}|��h8�qD:���O���i�)G�R6�#6T��Kzy�[�@��x�������/�'�����^X�5��s4���Em���W����V}���f�����:e�����I7pf�!������2'�����#c,tI���^�~	���\������yP�U~n!'�2�~�t~��w�W��;���B�;���g�mzg7�����S���)Z��p��a�
9��_D��Ou���&��L!��m��6� �0�lme��V���ER��M�e��GF����}�	/���?�5l�:���/�A�M��	+��0���a��:gA0��<�����?�Y�g��o���L���K����B~�n!�w��'����gy��l
��,7g�=���������Q���p��a�Lb^%#I
C��+��2������������]|]
�R���u�u^.����
tU�	��'A����g�Az��Y�����}a,�XW�/�����p��A/��yR3��`c(��C|vLbRVT��T�q���R�4E�~r���E�{{�h�$H=u�^J�����B���������:����t���A�Rq�=�� z�j���/OP��<]
j�����w���rb����AH��v��UP�����CT�������>,�l"��5�	��Y�TX-�����?��U��P���;�1;��_��m�j����&j&|Z����H����T�jS�+~G�"0�@2�b��/�mo����0W\��+C��4���M���j����������	-��,t�gCe����d�������J���Y�
���bJ���I�c����7c�D��c������ST�hF�8y ��m���;�1�
�h"�*?�(�N���#�/���6�;�pHF=+�
�67,��ptt��v4������������d$�1��Q�
c6�����Xq?�#n��c5��T<�|e���$���������{�?3��-���E����D��K�W�$�U|�����g�!�JU3���N�{|^���=�w���t������c�Q��g2<Y�WU�X�,����ZO����*��fw�+PP�x]�c�����G�����
�������#D��R�`8�Zs��z�q�G��L�A�7���Z�VIs��n]�h��W���
Y�S���&���_�7Q[�4?j�C��@c�|��a'l~�^��kw���uek(����Q���r�woG��������/EGemZ���"$�8��8�B��\��<GV�YWb��>��>m/�9\f���$�t8gIL'���������f�/b~)�"b�����<�,���!�t�zx�!�Y,�_���4z�*M�\g(-'c��$m����k4\�$=#x��>M�p6�����4��qk�i*�?�$o|=�|��)��aLG��Y���N
.t����ug\��U_\�`B�����4P�^���\���n��cR~��}��x��S�������&�f!�������?�u���7�l6U�{5
�Q�`4������h����E�_�O�k���!�������;����pv'��khi�WQ���5��moq�D.�u������������,F��)�k�:�|"����&&�����h,�m��^�E������%V�`����Zv�e�~hK����x��*X�O8���;i;���t��0����o}��e���n���j�����a9�����X��a������hp��!g_4�z��&���h��d�*��C�>m��OiOC��j��
g�?&�%~}����������SyE���c��V�O��%��+���	���`p�w?�k������ez���4��k#T��8���W������7{���[V�2=��$6�\��������P��stL�/��m�9�e�9�G������bg2�U'���b?������)�pX��w�����L����4y����������
�t<c�+H�?7�����3J��%�H�d����%k6��n�A��Vs��������Io�C��JR���+���5����:W���6�T�*��Q�b_�y�$n�n��r(��/�>�������wNi��:QM��
�(������I��0hT�Q��u��=���{��{?����w�6~]e�{��M�;���%�I��$�u���=��m$9�yt�AA�7"�q���#4�+�
F�T���3U0WE�m��Vf3?l���q�{����o�N�Z�!Ktr]kja�J��@o�%$)�IX�"��A/��H����x�A[_e��F[�0}��!�:��C��v[�[xh.��]��{���X���������OE=B�
%	�-T`��*����<�F�tv��5���{^p�.1}����x.|�P�q�����=g�u��t��g�[���b��*2�s����J�{|~@9�F��Sd��9��YJ�:E��f�'-���R�)��+S�{A8��K���d�k/X����I0.'7�IU���$ie~/�*�%��8w���Nz\f7h��4v�������{M
���n���G�#���pM��q�����o�z�2���Y���#��H��K��������4�����q��Q��n����<O�@���_v���g{��s�B����_�������z�^'~sNN���F|A�����V[-	�61a�������������-�!>��%W��o���u�/���GP���}c3�^/�^o�z�gS?zd6�Z+�A�A�d����W�|j�'�c�;���e���(]���?W��666ss�^�\�S�zz�]��bz��Z2���d�"���}�&�
��N��Ohm�Ne�3��!P3r�����������x��]:�1�(I�T��v���!��"��aO3b�9�O�i����4��*��dP*T�d��,=����W���W��:�!6OQ���0-��@t�$�EF ���3QYp�����Y}�5�)���d���9�E���?:�aG��������WZ(�j���n�.��^mn��]46��J�f�&�ba��e_����*�.���r
L)<��(3T�5Q���rRG���K	����$#�O���������{C���f�&�|�����%o�}/r�W�t3��)���wX� �0:)�v8bO/
�Ds�L���������:Q)�z~���G����2��&�^�%��J���:�������R[����}��
�`�O�5W;g=���@�r���i�s���m8���?9]Yi��'b9����1��bp�Y����<z�-�uN�)F��8�`|	�F=����`S�hv��
�������G"B�
��=�RU:Q�KM\����j����)M�[�N��J�X'��w�YP���f��Ij���+��`5	\�_��I�������}�^5|��;������������p-X�{n��]��r�V� �����z���Nh��&��hr�^,��@�����w������B���������BI6���
�y��p�U��Q��W-[ ���^Sh�c�$Cv.��W��������xa2su�7,S��)���
;������%k���P�*Mm&��S5�<:,E��{�^Q�-�N�f��vD��zb^H��	t��!���_�qeY�w��[y|o�����*����h������@\�W��S7�=e�Z�38Q�m=k�xh�}�^��j���4_i���r1;�a]�tr�"�]z�zvN~)�(��S��l{ ��0<���8J����s����H6��;��$�;)�{�'{�d���u7�������,��;�t����dz�vTVl��a��Z"�Vzo5��T��Fd�w]Z�=���[�r����YY����m+tZe#��(����UiY����y��cz*:�n��q�i�3��V}F���dt%I���^�!j��6�l���)�2�
������������,�J�	��6/�����"��T���3�e�+h�����\�X�MWks��y�������e
B�*����EP���ka���j��Q�Z����{�i��FZ2�����&�)y�����C���=�i@���~���6�����I���&��N������IF&�xs*����VPFs�?�-��h[�7����^��Vf�s����m�7Y�<��x2�.�:�A%�7������ff���00b����g	��MU�i��O����5jfp�gg����[����b����g��	��L��Cr&��)�Or��|g��������Qa]oYH+�%������S[����Dx�0'���(����g�%b�H0|d�ZfO��j����V�Y�������gP�����i<=���8��������i�5�y�����O�������|��\]�����k��W-6���dN�����m���������_��K��/�=�L}ga��[��]��[��0��S�%�D;j�Z����E�Z���1�"�^���r�Z�h��b:F��Ex�
v�������6Z�B�{������r*�X���*�S��%=f7�6p��l����h8o���z�Z���V:`��L?z�,����
s�����F���]0)}q����z�~������0F�O�8�cg����y�������z{&n������>�uE�8����;�����hlq�4��+Y1�����Z���=��f2�:Y�����W(��D���8�Fz����S4�p!c`�S�����=9}��x�}4����-�Q�}'����f��o���f��Y�=��$P�=��FP�Y����7��~�����o��j	�Wo�������_��[������V�W���[N�l�O#V����:�;]��p]�]5����D���5�rA�k��2� �m�A��<�:�yf(�y}��L����>�y}���<���y��3��@�g�����A��*}���Uh��U@_����*&SA_����*}�W1�����A_�U
�*��j�W}U��*���UA_���J����
����}U��*���UA_���
�j}U�W3�����A_�c����j}5�W3�����A_
��L�}5������@_�����}5�W7�����A_��
����n�W����A_����������A_�5����a�W}
���k�5@_����}
��0�kP��5@_�����r}M���k�5@_���	��}M��4�k���A_�5
����i����3�k���A_��L��Z}M��2���m��@_����Z}-��2�k���A_���Z��}-���-��������)M]6�t�Z�l��2�t�T�ej�������eSY������.S_�M�]&�&���b*�2iN���JXHs
Z[R�"�������� F0&2D73�74� �I3��5��%��^
I�	8.�5!�%��&��D��������y\z\b�k��K�qM�q+��&�D �� ��VR N�Mr�C�	D.��5��%�&�D#��#�x�����\�\b�k��[�����������j�� �&8�D'��'������\�\b�k��K�rM�r�S�	T.��5�����d�L�rM�r�Wn-e0�f�\b�k��K�rM�r�[�	\.��5��%v�&x�D/��/��������3i&��&��D1��2�H�	d.��5��%��&��D3��3�x�����\�\b�k��KTsMXsb��4�\�\b��H����7������\�\b�k��K�sM�s�s�	t.��5��%��&��M��M��w�	x.�m�Lj�l��K�sM�s�{�	|.��5��%��&��D?��?�����]���&�-�L�	�`P�]��M��~���7��~�7�FxO ��N�G7����d�D\�8�r��?��X���*��]ij��3+MF?���*p��MF����k�&���=�����cw�_��=r�h�E��p��>�Ymn��j4���/.�N�����z;�Ou�y7
����8o�3���g���<P�y3q9��D����9)�D�w����g��t��?�o�U�f��X5$��|����
_�?oB:�,��'<=���H���\~����-|6�'a _
�L���x3�"��f�B]�i>;����p�Rus�vv��e�y�*��/�7��c���5.}z,��x�����������{o�_���J�^!�vN����?���,u��D��EW�M���\�|�{N�q�F�QQ��Lu�*z$?��_^����y�=S3���^���������Go������8gw��(��l4<z���2]�u���@P�[T�Q��)����\OF� R�����~���5�P�J���j+�H��w��d:���������~�v�>8���=�9k��#�3�q����%�]��iot=\������d�i����G��h�&�������C�)��[3\�^��G����y*X��|sr[z
:�l�O����5H����~���=�����Agf�C�R����/�{�qt�#@f�Wj����MJ�H����p*I�����8%�j��q09M��h�V{���uC8����4��F�Zv���\K�U{!'���O��9����)�@�������f��ZPP[�l�k-�����rQ8_�RJ���b�R=;_,�S�Qca�L<��r��.��{]���������e��xv�1�o=��Q:���W�`�8RTm~�#���d�1�=��K!Z1:/�?!�P�,�PQ����3'�T��JV��@|\(���I�	��#����;88zu�>��q����'���}[�����U�������F����]�CTt�eRd��R�����'��\`��Ix������y����������o�;���N��t���!n�������d�+98�����y{\q���_^:9EW�T�{�Ev��'����q�~����vNd��f�d�������X���6{b�TO6Ye��)�����"����Pv��;R;�����68KW����4�O� �D�)
�T�b)�=
�7RQ�����[��?H���v�Z�gS����PK�����x4�������_�nc���w����n�x�m��}���b����������+��IW�$��>�{��'FF����?&�dP�����G��?q�o�^,
�,\��My�s��������;g��?�Y�~e K��*�er)c�����Y`�����q����*�U'��w�s��Wd�|i��+JR�������4X��Ef3�m����4�/�/@����&�a��y?�3Y��
s�;OJ��m>1�{b��
�L�S�{G3��p����C�,�l�
��i�D� o3h�����D& oS���8�k9*���=7_$� ���^��V��Hg{xw�
E�b���$)�9�H�O��l���x4���z_�������@�;V���)���s��}|�g��N���#o+��!�Rf�������������9���=����U�+V���o5<��L�s)�����p���bd#�w#������z�W_9���r9��QY������fU����f/Z��������p�@�����:�Q��(!3b|���Q=�G�d�M��e&���o�E���D'M���=1�z��Sm>";��`�o�������� u�lv��w��g,NdCP/�'e�nk��<�mG��I���]�v��l��� @���a��'��`��wDQ��k��!�H�]��H�
[���.%,p�m���s�Q���y����0��{0/�������?�^:%y8v��>����S�h��s�������#���G{s��O����m���~#N~���1���u�W���,��m��?t��`7rmsFy��$��,�3��������"���c����R3n�=�x�J�GGqU��?�������)O(
O6K��G�d����n�+n��7������
ZR��[aE���������R���B�&��������:���w^����]�^n+����\������K��j��1�I�8u�����
�gC��l
���Ji����!�'-��,�:�|A�n;��X~V��&�`m�P�3H�C*�$�?39E\��t����TM}�~F/C���:�f$d�<�7����S�/�7��*I};_Oe���M�//!�`p�wd(�L�!I�����`�N�=�=M�/�1��j��^�c�7�C��>�l��~���D=��5���j<
5�B�v�������e���w�����0�k��:V��QL��R}����JH^H�Be�gCu��*���:��O��2a�����I�=*��Ga�?�[�8R&UM?��P$�c��>��?���c*���a7�����
�~�����m���lh�P���!�V��:�Ln$����<,���R7�f0�]h���
J���K���I�
��*��cUv�����_��`��H?��h�`7��!z��6�#F��0.�FD)O#��Q����wh~�sNQ�u��`����X
|�8jF��/�>S� ��"1�'�lMI�.t�*��p:����&�CT��F��"H����B�/�B��W�'8m�x�~(���
���f�9�	�0���QQ\����Z��X���{,�
�[�Cni����g�QIF���;OXHC~�2I�����wz��?�D�eu�_��|_��t��������R��q����/���*�F,j��[(P���j�0�Z2:<&1~W���3R�0s�	�:{����G�P�QM��v����������i��������[��q;�I���x��L����>���J�����_�N����J�-K�/s���w�F�jd��da#����{/�C]��7��]!���Z@0���0��(�v�^F�m�&e�j�fY�K�����]��#&`@�K/�J�Y�b��I����=��1�qK|���g�����
3N��?����U�������8�������=4����F�V:� �~���z&`E�E�9�����n ��2�.�4)Q2z_a�=���������|��FT��.xf"G]
������~�>:~�>�|���o�������������]<r))�;����xw\+�&��Y���p���q��,�)� 2����*�8�'b]e�4��e]�6�\��t�e]iR]����g���;�����aI�'W#]��������v�m]WE�x$�����n����;��?l4�i����Y����������`L������ s���V�����Lv����1�N�����F����O6�6�.�cz�O
��
�
�������z+JfF��/���Y0x�������5�VZ��-�����j�_a�kp����:+<�>Q��O`lD�9���������+��$���9��Y�E��k�z���s��M��!�i��2�����O��wo~:�9�������42,����?�8�_:+���;��R\pL_|�)MW���N�������g�%������q����*���,��Y�YjS:?���Ym1_E�h��B���J�^}�p+�W]���U5�V;��������0�%��7j�(�p^���nxc6��Q�G���$��SNP���d7�����dz����W,���	gO�<.�l&q��u�5X�%T��!b�B	N�@T3��B�s���������?�}Jh~7�~�����V}��9Kj����@�0������UEg��W4�G�a�_}I
�p<�������]�w���%��$wAHcw_�,I�|�f{?z���c���q�tFg���@"K*�v$?��z���T����I~-jV�g�'�\�|QB�NEwU\���8.:1�[v��B��H9��+
�V���<�%c_CB;�1�%,Zu6�	l��W�����������dM&��`�2-�O&��?���=�
�\��zr�6���h�)�W��"�Y�r���FH�}���~8
&y�)��n�-k��d
\^u�~{�����!��R���V���^��r~���^x���Qo�I=G%�:���]���?��H~�^�;������j]��JY�����6*�5?���\Sh������/ �JHU����7����mwD�����3A�e#?�V��6����dT�)Z���G
/�|U��b�/��g�(ZF�Ox��=pw�������e9oi��_�-'�O}v3L���aj`�hQ�gF�r*D��{d5����mV^k������J]$@�/��(��<�D�t"k:y+�s�xeWL1GB���/~����l@�����t(����cj1px������0?�n4q�s\�t��;���O�:y7h
�!�@��cw�z�����[��<�Hi���3K8|4�:��V�������bu��R�~*�x�zs����4�l�^Npw���+m>m�6�?�	��'���p���V��4zN?����=�E��������?�a�+��J�z�
�$��z��2Om��y�s[���Rx��*�J�fy4��y���"��7�����������^������33w3���S��5.��������>Ogb%����]�&/���'�P��K�Z��=��M4|�W�yC���6�vm�����{��gi2��������gg�`J�a��+��T���?��F����{�	�m������.�oz2����G��;u��Su��/������������������9��w=h:���p�����Qc���T	D��jDu��u[���JB�������N��8�gj�K�:�"���QDk��2U�T�g86V����gM���h�J�:)
�e~��^��U����z����r�����E�2`}��:2��n���kD�QS�����5t��B�(FN��uf�c��1��d%�$J�_�dDs�J<�5�BS���s�&�a4_Y�{4�!�R/a��;�'�=��FS)����E����'i����-��#Y#>���� ��|7���S�����c<�&����O��_�7z��2�5{8���d�~����l��
���t���/br�u�"���E�<�#������������\h�*�Le��A�,)j�~������+����/<��e?�'��5��G�����6p\��#2��VQW��h���������T'�,c��2�5z-g��r��p�F��bp��H���s9�ROo�����f��g4T.����C5M�PU�Uo�����lb����h����N��|m�h��yTZ	���� (%�����Sb��ob3+�R��a�@92�&���~;>�
�h���_�U�~0c� z�b����SI��J�������h��:1�b)�^������8O�@a�J����Yy%S��<1U��z�PSpA�^�h_]�����+d%���L/�������L�J:��v�
C�4�>�4:m7��`��fW�gvCV�z���Q�8�1��j��W������4:Y�E�f��h�_^�]'��UJ��c09����L���z#��V#"p.G�h.�ZZj�����nQ�|t}9���^A���pD���70lF#u^�:����N��z���I���&�
�jB�tv�#*�{9~�&����e"�r6�����B�`��R�HZY�Cu����N��5	pL'��i�'��:#����%�$�V�J�>�D�"Dqw��{�,
�L�`��VK�����~�lm�e-�|q�eR��Ky��@U�A����n�w�Y�tS�m���g�~xIu.���S+�R��TB]��N�k�L�Q��J�~��s�>9��|�����Tn1e�v|��#,&�����y�.@_4�Pu��e�!�����qx0�~��Q%v;_��d��G�gb�Le���S�
(�)������VS�;��i1Bg9m�DM�\���@����Bc9����?��&������o��7��t.�as�h��lp_����-�2#c��P����b�H�]�"�B�xJ|��	&�+��oo�MF]=EI�����em��ci��`t��� !B�K�f��Q�����A������WGg��^�g&����4��?����2�#m=������-<����q4��5��a��_�{v��d@f<dA�A������[���>��e �E���8����}�f���?�T��a@�K�9�a��x�o�P{�]��`;v(Pmzh2�A�gw�RY�EPU�?�: �(�>�l��=u.��\��`v��7��^�b+����u����9F
T���m����VRR������a
��D�gl"(5j���D�R�u����10B���g���~��U=\�R���U�+�
��G��R<�yV�q����N1�'K���NU��/���Av�O��4�E�Q��$�����l�2��#�15� ? El)�4
&D���/�u��'n�HT��F�59G��D���$�����*c�����M0��
�k��q(-]��� �4�N�<5�jd8r�4g6���Y�y6`��0ev��g��H��+U�H��+$hz���b*�9n�V�����D�'�,�����Q�@��^1"D_0r�]O�S��Ge�
����t8d8�VC�������JM�}��NYC9|H-O���F�G������d�����:>�BSHI��u�&����V�2B��:uaw�.�;���*��7?��k�mg�������tYi����.�;�����;��D8f<������;����c��{��s���Th�i?���$!��U��A�l�C+F~/���"�H3K��XG�f��jz�#����g�@��p�I��v����a��Z��]�����n�5],�9H�$����F���MG�B��2k���Z���h.���b�Xm��-�M7��3�s,p����Zi�y8,}Y�_�E^���(��u��Cyq�`�w�$�nd2��3�q	F���<�I�AV�'D�;������~:)�qlkk����o3��6�K��z��[��;T�S)�6�>��2F��9�Y��J:��d�si���������/�Nnr���������h��bo<|�Mu��q�I|"<��d\<�.'�����x����>��&���O��22q�sI�Fz]���s�Q�:R�������5g������]Hm�F����o3@�B�a�����#�H�t0(�U�L���_:��#�l.��d�GcIO�M��X������I&l� �'���]Fg����j���-��.�8�A)7N�?0_�����f����I~�v~<������s�>��T,��9k��x*
O�4��&=G��u����FQ��W��_}�������������Y�,p�.OU�����`u\��k@jA<G�+6��y��L6Y�q�s������x)6~l��������E�i�x�2t2f�K�z`���c�����_5���E�=�z����o������,F���Z��'B��H��8�L�=��=���	X/�81���X���7�
����{�~�L���wG'�o�N��x��~��T�o,�1�����M�
������_��Z��8O?�m��)����i[,����V/p[��+Z�.sA������f��<3��m�������bW�VYl�lR�*��L�zu���r]����^}�)��u2����@�&C.u#��65��g�&�~�I��W��I��P���Z����}��m����Q���R|n)���2tVY��|����t4S%/&.
�a��(�T;��]{�0u]?���	�}Yr$Su6|�H��>�N����I�=�'��un&���"=0�..7�S�~"�^��?b��$@^vp���`��f�V���	Jv���������A�T �
WvuR	��=E`4�l�8���S�4jV��52��6z��Dm����:##������Q�L������9~����$�c����1�����o��(D?�^-�U�<�4U�XM�Y��t��+��W;�E;Q����w�ud����K��f�@����0��a�N���^�?R�=b�v�O�i�x%�,i$g�������L��S�Q����?L��=�����LAr���&{'9���d��g�Z�j�,Hb��r�_2�hs�}���B]�L����H�NL+m��`�8]���)�2�Q�(T�����BB#e���v�C>�l��?���"�<y�q;��3���,�6�R�����Q�������^��y�{�h����xf��~vy<x�{��;|a���@�~^gGs0n���;�wq����"jN��I�N��9M���=�0��A��t5��'E���Z�<`5y���:'�%��:3����`�v�xRV��q���_��O�O�p$��,p%	7��;���y�J���f��-��� ��z��U�B����E�81��h��AA�I�����	�d���W
��}������U�:;�����$������<��Lc��L��Qmf�������c��x7ns��hH���Qs,Kw~y��1t���v����lk�C�hX#�x����l4�S�Tq����tT;a`�9��6w��#e�jO�$���������������_������WE��F�����|���'��5-W�,�z-b��mn�u�zn�!���q�Vn��/H��[4k��I�,E`b�o�63�^�y�9c���&��R�%Q��S�N&�B��j7I-�<PR��,7�L:@O;�6�)+l{4e%�>6b�R^�RV�0%��B<�T5�"����z@��Y��L����������u@����cE���pe�D�����&�D�>����\��k�}[w})F�[N���������1m�J'���/�L�M�EP�4�1�O�,�u=S4[�U��]�A��5���Hf��Eof���$�����������7G��WG��\IM�TU����3���	�&ey� ���|!5��.|��u6��Z~��Qs�4HW,����0��?�D��4|a����22_f��:����P���z8gu
J�/{���P����b�n��������]
�U�o4ne���E>�`�k�KF�s��
��P��z��(4������g0���br��:��8I^�@9:U�.���cxe{��g`��&t����3G[0T�0����U^��U���3�8Q���FJ���R�����%�z����@�Ow�r�G��<+Q��^$.��2n~��q|��$4n�Q��Lr�=Y)������J�������{#;fn��1%������@23��97Yf5��U�����5aF���s41Y*���yD���B��}�I<�y�9��k�����<�i��Q��k��Y6g��5��)+]�{�z�,/����h�J�������r���O����(6���VeJ�#�"��4
C�=���pFz��u������,�g�F�]�`D'i��42>����r�R�����_������n	!����63��Q?���a���C��6i$����N;";���r�}~�[2�����T���j��i����scZ:'��e�Z����A������I,��:XVr�Q|�\�%����y����{9��8O�M�yB�����A������� �d�HM1b��cn0����4�%_F	s�J(OVc\�����`w\��u�t�����^@i�����ON��_����gC'����~��_7����7�����_�	F`�������Ee#���X���y�J�n�s�J��^I�{-�Q�6��y���]l��u �
�#������[��;�����)7�pC�C���6�����
LM�Pp�OY��<��;�r��_���{�o�*n�N�Luo�ag6%/�	E��a2��6�}��M)zl�������|�����`����`C.�+O�s��9��G1������x��YM�pA�2
���)���;8<zT��h��y�j�0ee�f���u��������@P�|����T����s�n45g6v��W)a.��s�:D ^J���}�-bL�X�t�,{G��A^���%I� �?����w���g������O���*\m''�!w'C5/���r��_�Ynq�8��\�D��rQ�$$$g����u�y�s�`IM�N'9���)��Y:��	��D�7/��YM����n�[K��/0g�z8K5~a���(
��y��T�yw�&�J�=:��1-������s{h,�p�������h<���U�b~g��!�7���X�KR�nF����4��y������D	0����Gh�n���zw��h8q�8������mU}Y:����:�X�u�?e�'������t����iH|��	����0�����p�?��L�����L��B��d�Z�9��=p��N6�+��UV����F%%�"]R�f*	�X�����"�K�zu���B�Y�|�v����qwa�W��(��2��o�zR���Y��%��s����{
�{P9C�r�U������g�2o�d���}Y��;��l0+�ME��;����*J�$(���,mQ���)�������67t�_y������ld��<�)"��E6*��d��x�
5/S�5�^�O9r���`!E�T�TO���J��D����R�M��1����&�7���M����/�>6c���
&'���������}w|�Jf(�u�_�C�S�������Q-���N ?
B�#��V4�s=�NOl�.;]�	^�M�`>}r�7�����urX%Ed������L�"X����\����w�I���0�~������1j�*��2�?�� 9JS�!��x��������=>&A�N6�8��d��J4�'�����n��r����������������
D�&����6S����n��V	�g�jd���K�Ws:N���47��Uz[���:MzOq&�h!����/�4Sk�_��}]��in�D��N4�Kk"���l"�J����b+���y�i�����h�F1�TD�Q�������+P���(��O����s���9�)�����$c�#����O�����{���)��/<Y��C;�)�p���!���V�Qr$����:��X���h�=��g��%����� d�R��I���qj��L��
}mq�3��k��M���[��~�q#��j���=����~z���J[
���2�^��)��l��i��V��o��#i�vP�0N��jR;D��i�'1h��ZV�Y�K�.�����3�B�+E�s��>b�����F�:Yp>�cc�&��c�����/f^*]�rN�*�''i���N���7�6�H7�����m��+o+����v7�|@	��F[]�gX�[����2fJQB�NF�	�,w��N<a��[���ncX�����*;�4���l��cQ�0O(���`�Lc�.��0�L��vw����Z�������%G���9���Y����OL���i��y_&��	�<I9�������{�~�S��ly�U���
��L2�9���H[2[]�c��M4�J��6Q���x���&1��E���w�w6��+���F��"���|��9�XX�T���L[	���^��y���#�^��tn ��+9�up������������'�����Yj���Q���7�����,�P;+�����'|�>w���+���h8����}LM�
���BE�d������<in�(�E�V�����"3s�,^��B--�	�l����m�MzT������D�yV�S\���r��a�P�J	��R�T*��d+^��)01�A#k�����P����w��|�7N4�����x��W���k>���g��B��n8��c���hw��c���t��B�J���	��� ��*�
�3��]��+��Tt)/�������"�K�I��r��4)�I
����c�eE���NDM��>���ws;����=���+��U',;�%"��q���:�BH~����4�(	ct�i�NF��6�|�����'���h��t��Z�g�A�jc1g��
J���6�c��h@�H�v��J��S�j���|������EC����5,��^g.=����(�����E���n��.>�,k4��������\q�l��;q|G/��C9��pQ�^����(���}��kF`-R�9a<���H�������)�s������������#t���L��z��s�|>�~�/1�v��h�o<&����o���;j�kD`B�
3�!| �-�hg��c��^����|�Q��V���z�����	����X����P�@m��
�h���1���Bha��*�9����a�O���giG��gi������g�1tjo�a�Q������!_�q���If
���o}h%�h���Y���\���T�%��G^�d��QS�f���Q�D��p��s��;~�������x�l���)��;>i������;H���������w���87�r=��������@=
U����:���/m$o��v6N�5n���HR�6npkB���&�P���t:~��gV���g�>�`#��|����u���j�W|���������(T?��4n*2snF,���&M�=�s�����>����S<<���������4�(@��fol�������0���&=��1j���{���	����g��f���l����UgC����lL�����I|����>g������#���b����'��s��Nf�z������+Ys&F�y����_��,����O�nl�t~����%�
0#�9F[�q�����gg_����3�l����9�Q��_I����[+W�T�Yo3��4W��k��{����������j�����V��L�u��z`�)��n������_g�L��\���u�a�"a�\�I�~)E�KT��I�A���n@N3�<�JV���@�+����`:>WA��s�����d�D�;��h'�g��N-1��V��
sJJl��~y�f���7�����������H�����f������^�������L/VB�����]���Fw�����#��]]����UTJ����g�����W��\^Y�d��gS5
O��������}]rt���'q��*C�,|)TqJ��`AW�P�8���D���%"�%W����y��������k���������\/�DR��x����f��5���Wv�w^��������/����<{�r�����%r���|G-�����j�~wg3n(�B�v#|��Q��0LRLu�"�v1���P~��	4M?�v�MN��R���;�����;���7;c���������j�x�
���$G�$��}?L����eI�A����#��H�D����{�L��
�R�������Vl�S1�PL4{���Fw;O�!���R�m�=<��\��w�yfxn�k�q<���4�|w$i1���� �[�I�����d#��*���s
N��x��h�����i����n�#$��T�WN@�,�%�	�T���Hn���S������:���?������������/Q�_9�j��0��g�!Q����^������-������F� :�.�*9�V�"�����V4}Ko)�-��E�+9D?�YN��P
���'�~<�L����J����Cr�������R���,	��u��C�>�A$����m9%;}����9z0::Kv�SC����j�s-�Q�"yd��>��:u�z�I�]��!CL���tg�����d�I0������-S
��%3�"4�1�}�k�HAGwxv���E��E5���i4���Qb4�s�#0~$/�����tD$:����j�Nz�q�	�W�+�2�q����I�J��?/T/�{v�������l4��^��\P���l��mE�o����J6~�~���w��7Q�������{9�vWY3�~�-Vttv�-V&��Yy����U�d����w����J���[�A��=;yy��=�U������Z��\FaEc�>ue���y�����_�w�m:��J��pv%��R�^�������^�ONQlE>\��������6���������[I��pzU�����<v��N`��3�?M'�����HY��W�������7�����Aw���]�X���m��@��9�'�o�&�Q�?m:�l:�cd��&���xk�J�G-<�|az���g�������?����.7e��P�����a�5��X,oR������z��<[������2�dR�^�=g�vF���&�p������N��j����Uy�0��u�n4_�EE��w���c2��\���������e]��X����wV�+���ZN�s���zs{����������^���[�<�K4����)�P9)��~u�hm7�M��p���	�����C;�Cj4*M�7.���
&;��sUb����cW�I�d��o����'�������s�����;k�"�e�U������;2~I�����[���2�=Z,��`�v���VR�iX��������������p
#15Tom Lane
tgl@sss.pgh.pa.us
In reply to: Alvaro Herrera (#14)
Re: no test programs in contrib

Alvaro Herrera <alvherre@2ndquadrant.com> writes:

This is pretty bulky, but really the vast majority of the changes here
are just "git mv".

For ease of review, is there a way to get git to show just the diffs that
*aren't* git mv? (That is, show changes in a file's content without
respect to its having moved?)

regards, tom lane

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#16Andres Freund
andres@2ndquadrant.com
In reply to: Tom Lane (#15)
Re: no test programs in contrib

On 2014-11-26 10:08:57 -0500, Tom Lane wrote:

Alvaro Herrera <alvherre@2ndquadrant.com> writes:

This is pretty bulky, but really the vast majority of the changes here
are just "git mv".

For ease of review, is there a way to get git to show just the diffs that
*aren't* git mv? (That is, show changes in a file's content without
respect to its having moved?)

Yes, that's possible. git diff/show/whatever -M

Greetings,

Andres Freund

--
Andres Freund http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#17Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Tom Lane (#15)
1 attachment(s)
Re: no test programs in contrib

Tom Lane wrote:

Alvaro Herrera <alvherre@2ndquadrant.com> writes:

This is pretty bulky, but really the vast majority of the changes here
are just "git mv".

For ease of review, is there a way to get git to show just the diffs that
*aren't* git mv? (That is, show changes in a file's content without
respect to its having moved?)

I think git diff -D -M -B does that. Here's such a diff, which I
obtained from "git show" (otherwise you'd need to "git add" all the new
files, I think, which would be pretty annoying)

--
�lvaro Herrera http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

Attachments:

test_modules_reviewable.patchtext/x-diff; charset=us-asciiDownload
commit 3528d3323dd6cf086c9326432293827cd003c783
Author: Alvaro Herrera <alvherre@alvh.no-ip.org>
Date:   Wed Nov 26 10:16:54 2014 -0300

    src/test/modules

diff --git a/GNUmakefile.in b/GNUmakefile.in
index 69e0824..3a57495 100644
--- a/GNUmakefile.in
+++ b/GNUmakefile.in
@@ -65,6 +65,7 @@ check check-tests: all
 
 check check-tests installcheck installcheck-parallel installcheck-tests:
 	$(MAKE) -C src/test/regress $@
+	$(MAKE) -C src/test/modules $@
 
 $(call recurse,check-world,src/test src/pl src/interfaces/ecpg contrib src/bin,check)
 
diff --git a/contrib/Makefile b/contrib/Makefile
index b37d0dd..efee109 100644
--- a/contrib/Makefile
+++ b/contrib/Makefile
@@ -16,7 +16,6 @@ SUBDIRS = \
 		dblink		\
 		dict_int	\
 		dict_xsyn	\
-		dummy_seclabel	\
 		earthdistance	\
 		file_fdw	\
 		fuzzystrmatch	\
@@ -50,13 +49,9 @@ SUBDIRS = \
 		spi		\
 		tablefunc	\
 		tcn		\
-		test_decoding	\
-		test_parser	\
-		test_shm_mq	\
 		tsearch2	\
 		unaccent	\
-		vacuumlo	\
-		worker_spi
+		vacuumlo
 
 ifeq ($(with_openssl),yes)
 SUBDIRS += sslinfo
diff --git a/contrib/pg_upgrade/test.sh b/contrib/pg_upgrade/test.sh
index 7bbd2c7..dcc84f3 100644
--- a/contrib/pg_upgrade/test.sh
+++ b/contrib/pg_upgrade/test.sh
@@ -65,6 +65,7 @@ if [ "$1" = '--install' ]; then
 	"$MAKE" -s -C ../.. install DESTDIR="$temp_install"
 	"$MAKE" -s -C ../pg_upgrade_support install DESTDIR="$temp_install"
 	"$MAKE" -s -C . install DESTDIR="$temp_install"
+	"$MAKE" -s -C ../../src/test/modules install DESTDIR="$temp_install"
 
 	# platform-specific magic to find the shared libraries; see pg_regress.c
 	LD_LIBRARY_PATH=$libdir:$LD_LIBRARY_PATH
diff --git a/src/test/Makefile b/src/test/Makefile
index 0fd7eab..5d997b8 100644
--- a/src/test/Makefile
+++ b/src/test/Makefile
@@ -12,6 +12,6 @@ subdir = src/test
 top_builddir = ../..
 include $(top_builddir)/src/Makefile.global
 
-SUBDIRS = regress isolation
+SUBDIRS = regress isolation modules
 
 $(recurse)
diff --git a/contrib/worker_spi/Makefile b/src/test/modules/bgworker/Makefile
similarity index 76%
rename from contrib/worker_spi/Makefile
rename to src/test/modules/bgworker/Makefile
index 5cce4d1..673281a 100644
--- a/contrib/worker_spi/Makefile
+++ b/src/test/modules/bgworker/Makefile
@@ -1,4 +1,4 @@
-# contrib/worker_spi/Makefile
+# src/test/modules/bgworker/Makefile
 
 MODULES = worker_spi
 
@@ -11,8 +11,8 @@ PG_CONFIG = pg_config
 PGXS := $(shell $(PG_CONFIG) --pgxs)
 include $(PGXS)
 else
-subdir = contrib/worker_spi
-top_builddir = ../..
+subdir = src/test/modules/bgworker
+top_builddir = ../../../..
 include $(top_builddir)/src/Makefile.global
 include $(top_srcdir)/contrib/contrib-global.mk
 endif
diff --git a/contrib/worker_spi/worker_spi--1.0.sql b/src/test/modules/bgworker/worker_spi--1.0.sql
similarity index 100%
rename from contrib/worker_spi/worker_spi--1.0.sql
rename to src/test/modules/bgworker/worker_spi--1.0.sql
diff --git a/contrib/worker_spi/worker_spi.c b/src/test/modules/bgworker/worker_spi.c
similarity index 100%
rename from contrib/worker_spi/worker_spi.c
rename to src/test/modules/bgworker/worker_spi.c
diff --git a/contrib/worker_spi/worker_spi.control b/src/test/modules/bgworker/worker_spi.control
similarity index 100%
rename from contrib/worker_spi/worker_spi.control
rename to src/test/modules/bgworker/worker_spi.control
diff --git a/contrib/test_decoding/.gitignore b/src/test/modules/logical_decoding/.gitignore
similarity index 100%
rename from contrib/test_decoding/.gitignore
rename to src/test/modules/logical_decoding/.gitignore
diff --git a/contrib/test_decoding/Makefile b/src/test/modules/logical_decoding/Makefile
similarity index 78%
rename from contrib/test_decoding/Makefile
rename to src/test/modules/logical_decoding/Makefile
index 438be44..0bc85d8 100644
--- a/contrib/test_decoding/Makefile
+++ b/src/test/modules/logical_decoding/Makefile
@@ -1,4 +1,4 @@
-# contrib/test_decoding/Makefile
+# src/test/modules/logical_decoding/Makefile
 
 MODULES = test_decoding
 PGFILEDESC = "test_decoding - example of a logical decoding output plugin"
@@ -12,8 +12,8 @@ PG_CONFIG = pg_config
 PGXS := $(shell $(PG_CONFIG) --pgxs)
 include $(PGXS)
 else
-subdir = contrib/test_decoding
-top_builddir = ../..
+subdir = src/test/modules/logical_decoding
+top_builddir = ../../../..
 include $(top_builddir)/src/Makefile.global
 include $(top_srcdir)/contrib/contrib-global.mk
 endif
@@ -35,22 +35,22 @@ submake-isolation:
 	$(MAKE) -C $(top_builddir)/src/test/isolation all
 
 submake-test_decoding:
-	$(MAKE) -C $(top_builddir)/contrib/test_decoding
+	$(MAKE) -C $(top_builddir)/src/test/modules/logical_decoding
 
 REGRESSCHECKS=ddl rewrite toast permissions decoding_in_xact decoding_into_rel binary prepared
 
 regresscheck: all | submake-regress submake-test_decoding
 	$(MKDIR_P) regression_output
 	$(pg_regress_check) \
-	    --temp-config $(top_srcdir)/contrib/test_decoding/logical.conf \
+	    --temp-config $(top_srcdir)/src/test/modules/logical_decoding/logical.conf \
 	    --temp-install=./tmp_check \
-	    --extra-install=contrib/test_decoding \
+	    --extra-install=src/test/modules/logical_decoding \
 	    --outputdir=./regression_output \
 	    $(REGRESSCHECKS)
 
 regresscheck-install-force: | submake-regress submake-test_decoding
 	$(pg_regress_installcheck) \
-	    --extra-install=contrib/test_decoding \
+	    --extra-install=src/test/modules/logical_decoding \
 	    $(REGRESSCHECKS)
 
 ISOLATIONCHECKS=mxact delayed_startup ondisk_startup concurrent_ddl_dml
@@ -58,14 +58,14 @@ ISOLATIONCHECKS=mxact delayed_startup ondisk_startup concurrent_ddl_dml
 isolationcheck: all | submake-isolation submake-test_decoding
 	$(MKDIR_P) isolation_output
 	$(pg_isolation_regress_check) \
-	    --temp-config $(top_srcdir)/contrib/test_decoding/logical.conf \
-	    --extra-install=contrib/test_decoding \
+	    --temp-config $(top_srcdir)/src/test/modules/logical_decoding/logical.conf \
+	    --extra-install=src/test/modules/logical_decoding \
 	    --outputdir=./isolation_output \
 	    $(ISOLATIONCHECKS)
 
 isolationcheck-install-force: all | submake-isolation submake-test_decoding
 	$(pg_isolation_regress_installcheck) \
-	    --extra-install=contrib/test_decoding \
+	    --extra-install=src/test/modules/logical_decoding \
 	    $(ISOLATIONCHECKS)
 
 PHONY: submake-test_decoding submake-regress check \
diff --git a/contrib/test_decoding/expected/binary.out b/src/test/modules/logical_decoding/expected/binary.out
similarity index 100%
rename from contrib/test_decoding/expected/binary.out
rename to src/test/modules/logical_decoding/expected/binary.out
diff --git a/contrib/test_decoding/expected/concurrent_ddl_dml.out b/src/test/modules/logical_decoding/expected/concurrent_ddl_dml.out
similarity index 100%
rename from contrib/test_decoding/expected/concurrent_ddl_dml.out
rename to src/test/modules/logical_decoding/expected/concurrent_ddl_dml.out
diff --git a/contrib/test_decoding/expected/ddl.out b/src/test/modules/logical_decoding/expected/ddl.out
similarity index 100%
rename from contrib/test_decoding/expected/ddl.out
rename to src/test/modules/logical_decoding/expected/ddl.out
diff --git a/contrib/test_decoding/expected/decoding_in_xact.out b/src/test/modules/logical_decoding/expected/decoding_in_xact.out
similarity index 100%
rename from contrib/test_decoding/expected/decoding_in_xact.out
rename to src/test/modules/logical_decoding/expected/decoding_in_xact.out
diff --git a/contrib/test_decoding/expected/decoding_into_rel.out b/src/test/modules/logical_decoding/expected/decoding_into_rel.out
similarity index 100%
rename from contrib/test_decoding/expected/decoding_into_rel.out
rename to src/test/modules/logical_decoding/expected/decoding_into_rel.out
diff --git a/contrib/test_decoding/expected/delayed_startup.out b/src/test/modules/logical_decoding/expected/delayed_startup.out
similarity index 100%
rename from contrib/test_decoding/expected/delayed_startup.out
rename to src/test/modules/logical_decoding/expected/delayed_startup.out
diff --git a/contrib/test_decoding/expected/mxact.out b/src/test/modules/logical_decoding/expected/mxact.out
similarity index 100%
rename from contrib/test_decoding/expected/mxact.out
rename to src/test/modules/logical_decoding/expected/mxact.out
diff --git a/contrib/test_decoding/expected/ondisk_startup.out b/src/test/modules/logical_decoding/expected/ondisk_startup.out
similarity index 100%
rename from contrib/test_decoding/expected/ondisk_startup.out
rename to src/test/modules/logical_decoding/expected/ondisk_startup.out
diff --git a/contrib/test_decoding/expected/permissions.out b/src/test/modules/logical_decoding/expected/permissions.out
similarity index 100%
rename from contrib/test_decoding/expected/permissions.out
rename to src/test/modules/logical_decoding/expected/permissions.out
diff --git a/contrib/test_decoding/expected/prepared.out b/src/test/modules/logical_decoding/expected/prepared.out
similarity index 100%
rename from contrib/test_decoding/expected/prepared.out
rename to src/test/modules/logical_decoding/expected/prepared.out
diff --git a/contrib/test_decoding/expected/rewrite.out b/src/test/modules/logical_decoding/expected/rewrite.out
similarity index 100%
rename from contrib/test_decoding/expected/rewrite.out
rename to src/test/modules/logical_decoding/expected/rewrite.out
diff --git a/contrib/test_decoding/expected/toast.out b/src/test/modules/logical_decoding/expected/toast.out
similarity index 100%
rename from contrib/test_decoding/expected/toast.out
rename to src/test/modules/logical_decoding/expected/toast.out
diff --git a/contrib/test_decoding/logical.conf b/src/test/modules/logical_decoding/logical.conf
similarity index 100%
rename from contrib/test_decoding/logical.conf
rename to src/test/modules/logical_decoding/logical.conf
diff --git a/contrib/test_decoding/specs/concurrent_ddl_dml.spec b/src/test/modules/logical_decoding/specs/concurrent_ddl_dml.spec
similarity index 100%
rename from contrib/test_decoding/specs/concurrent_ddl_dml.spec
rename to src/test/modules/logical_decoding/specs/concurrent_ddl_dml.spec
diff --git a/contrib/test_decoding/specs/delayed_startup.spec b/src/test/modules/logical_decoding/specs/delayed_startup.spec
similarity index 100%
rename from contrib/test_decoding/specs/delayed_startup.spec
rename to src/test/modules/logical_decoding/specs/delayed_startup.spec
diff --git a/contrib/test_decoding/specs/mxact.spec b/src/test/modules/logical_decoding/specs/mxact.spec
similarity index 100%
rename from contrib/test_decoding/specs/mxact.spec
rename to src/test/modules/logical_decoding/specs/mxact.spec
diff --git a/contrib/test_decoding/specs/ondisk_startup.spec b/src/test/modules/logical_decoding/specs/ondisk_startup.spec
similarity index 100%
rename from contrib/test_decoding/specs/ondisk_startup.spec
rename to src/test/modules/logical_decoding/specs/ondisk_startup.spec
diff --git a/contrib/test_decoding/sql/binary.sql b/src/test/modules/logical_decoding/sql/binary.sql
similarity index 100%
rename from contrib/test_decoding/sql/binary.sql
rename to src/test/modules/logical_decoding/sql/binary.sql
diff --git a/contrib/test_decoding/sql/ddl.sql b/src/test/modules/logical_decoding/sql/ddl.sql
similarity index 100%
rename from contrib/test_decoding/sql/ddl.sql
rename to src/test/modules/logical_decoding/sql/ddl.sql
diff --git a/contrib/test_decoding/sql/decoding_in_xact.sql b/src/test/modules/logical_decoding/sql/decoding_in_xact.sql
similarity index 100%
rename from contrib/test_decoding/sql/decoding_in_xact.sql
rename to src/test/modules/logical_decoding/sql/decoding_in_xact.sql
diff --git a/contrib/test_decoding/sql/decoding_into_rel.sql b/src/test/modules/logical_decoding/sql/decoding_into_rel.sql
similarity index 100%
rename from contrib/test_decoding/sql/decoding_into_rel.sql
rename to src/test/modules/logical_decoding/sql/decoding_into_rel.sql
diff --git a/contrib/test_decoding/sql/permissions.sql b/src/test/modules/logical_decoding/sql/permissions.sql
similarity index 100%
rename from contrib/test_decoding/sql/permissions.sql
rename to src/test/modules/logical_decoding/sql/permissions.sql
diff --git a/contrib/test_decoding/sql/prepared.sql b/src/test/modules/logical_decoding/sql/prepared.sql
similarity index 100%
rename from contrib/test_decoding/sql/prepared.sql
rename to src/test/modules/logical_decoding/sql/prepared.sql
diff --git a/contrib/test_decoding/sql/rewrite.sql b/src/test/modules/logical_decoding/sql/rewrite.sql
similarity index 100%
rename from contrib/test_decoding/sql/rewrite.sql
rename to src/test/modules/logical_decoding/sql/rewrite.sql
diff --git a/contrib/test_decoding/sql/toast.sql b/src/test/modules/logical_decoding/sql/toast.sql
similarity index 100%
rename from contrib/test_decoding/sql/toast.sql
rename to src/test/modules/logical_decoding/sql/toast.sql
diff --git a/contrib/test_decoding/test_decoding.c b/src/test/modules/logical_decoding/test_decoding.c
similarity index 100%
rename from contrib/test_decoding/test_decoding.c
rename to src/test/modules/logical_decoding/test_decoding.c
diff --git a/contrib/dummy_seclabel/Makefile b/src/test/modules/seclabel/Makefile
similarity index 50%
rename from contrib/dummy_seclabel/Makefile
rename to src/test/modules/seclabel/Makefile
index e69aa1f..c0b1f1b 100644
--- a/contrib/dummy_seclabel/Makefile
+++ b/src/test/modules/seclabel/Makefile
@@ -1,15 +1,15 @@
-# contrib/dummy_seclabel/Makefile
+# src/test/modules/seclabel/Makefile
 
-MODULES = dummy_seclabel
-PGFILEDESC = "dummy_seclabel - regression testing of the SECURITY LABEL statement"
+MODULES = seclabel
+PGFILEDESC = "seclabel - regression testing of the SECURITY LABEL statement"
 
 ifdef USE_PGXS
 PG_CONFIG = pg_config
 PGXS := $(shell $(PG_CONFIG) --pgxs)
 include $(PGXS)
 else
-subdir = contrib/dummy_seclabel
-top_builddir = ../..
+subdir = src/test/modules/seclabel
+top_builddir = ../../../..
 include $(top_builddir)/src/Makefile.global
 include $(top_srcdir)/contrib/contrib-global.mk
 endif
diff --git a/contrib/dummy_seclabel/dummy_seclabel.c b/src/test/modules/seclabel/seclabel.c
similarity index 98%
rename from contrib/dummy_seclabel/dummy_seclabel.c
rename to src/test/modules/seclabel/seclabel.c
index b5753cc..08cd58b 100644
--- a/contrib/dummy_seclabel/dummy_seclabel.c
+++ b/src/test/modules/seclabel/seclabel.c
@@ -1,5 +1,5 @@
 /*
- * dummy_seclabel.c
+ * seclabel.c
  *
  * Dummy security label provider.
  *
diff --git a/contrib/test_shm_mq/.gitignore b/src/test/modules/shm_mq/.gitignore
similarity index 100%
rename from contrib/test_shm_mq/.gitignore
rename to src/test/modules/shm_mq/.gitignore
diff --git a/contrib/test_shm_mq/Makefile b/src/test/modules/shm_mq/Makefile
similarity index 81%
rename from contrib/test_shm_mq/Makefile
rename to src/test/modules/shm_mq/Makefile
index e3c4054..229473f 100644
--- a/contrib/test_shm_mq/Makefile
+++ b/src/test/modules/shm_mq/Makefile
@@ -1,4 +1,4 @@
-# contrib/test_shm_mq/Makefile
+# src/test/modules/shm_mq/Makefile
 
 MODULE_big = test_shm_mq
 OBJS = test.o setup.o worker.o $(WIN32RES)
@@ -14,8 +14,8 @@ PG_CONFIG = pg_config
 PGXS := $(shell $(PG_CONFIG) --pgxs)
 include $(PGXS)
 else
-subdir = contrib/test_shm_mq
-top_builddir = ../..
+subdir = src/test/modules/shm_mq
+top_builddir = ../../../..
 include $(top_builddir)/src/Makefile.global
 include $(top_srcdir)/contrib/contrib-global.mk
 endif
diff --git a/contrib/test_shm_mq/expected/test_shm_mq.out b/src/test/modules/shm_mq/expected/test_shm_mq.out
similarity index 100%
rename from contrib/test_shm_mq/expected/test_shm_mq.out
rename to src/test/modules/shm_mq/expected/test_shm_mq.out
diff --git a/contrib/test_shm_mq/setup.c b/src/test/modules/shm_mq/setup.c
similarity index 100%
rename from contrib/test_shm_mq/setup.c
rename to src/test/modules/shm_mq/setup.c
diff --git a/contrib/test_shm_mq/sql/test_shm_mq.sql b/src/test/modules/shm_mq/sql/test_shm_mq.sql
similarity index 100%
rename from contrib/test_shm_mq/sql/test_shm_mq.sql
rename to src/test/modules/shm_mq/sql/test_shm_mq.sql
diff --git a/contrib/test_shm_mq/test.c b/src/test/modules/shm_mq/test.c
similarity index 100%
rename from contrib/test_shm_mq/test.c
rename to src/test/modules/shm_mq/test.c
diff --git a/contrib/test_shm_mq/test_shm_mq--1.0.sql b/src/test/modules/shm_mq/test_shm_mq--1.0.sql
similarity index 100%
rename from contrib/test_shm_mq/test_shm_mq--1.0.sql
rename to src/test/modules/shm_mq/test_shm_mq--1.0.sql
diff --git a/contrib/test_shm_mq/test_shm_mq.control b/src/test/modules/shm_mq/test_shm_mq.control
similarity index 100%
rename from contrib/test_shm_mq/test_shm_mq.control
rename to src/test/modules/shm_mq/test_shm_mq.control
diff --git a/contrib/test_shm_mq/test_shm_mq.h b/src/test/modules/shm_mq/test_shm_mq.h
similarity index 100%
rename from contrib/test_shm_mq/test_shm_mq.h
rename to src/test/modules/shm_mq/test_shm_mq.h
diff --git a/contrib/test_shm_mq/worker.c b/src/test/modules/shm_mq/worker.c
similarity index 100%
rename from contrib/test_shm_mq/worker.c
rename to src/test/modules/shm_mq/worker.c
diff --git a/contrib/test_parser/.gitignore b/src/test/modules/tsparser/.gitignore
similarity index 100%
rename from contrib/test_parser/.gitignore
rename to src/test/modules/tsparser/.gitignore
diff --git a/contrib/test_parser/Makefile b/src/test/modules/tsparser/Makefile
similarity index 81%
rename from contrib/test_parser/Makefile
rename to src/test/modules/tsparser/Makefile
index 7e068ab..b6c3ccf 100644
--- a/contrib/test_parser/Makefile
+++ b/src/test/modules/tsparser/Makefile
@@ -1,4 +1,4 @@
-# contrib/test_parser/Makefile
+# src/test/modules/tsparser/Makefile
 
 MODULE_big = test_parser
 OBJS = test_parser.o $(WIN32RES)
@@ -14,8 +14,8 @@ PG_CONFIG = pg_config
 PGXS := $(shell $(PG_CONFIG) --pgxs)
 include $(PGXS)
 else
-subdir = contrib/test_parser
-top_builddir = ../..
+subdir = src/test/modules/tsparser
+top_builddir = ../../../..
 include $(top_builddir)/src/Makefile.global
 include $(top_srcdir)/contrib/contrib-global.mk
 endif
diff --git a/contrib/test_parser/expected/test_parser.out b/src/test/modules/tsparser/expected/test_parser.out
similarity index 100%
rename from contrib/test_parser/expected/test_parser.out
rename to src/test/modules/tsparser/expected/test_parser.out
diff --git a/contrib/test_parser/sql/test_parser.sql b/src/test/modules/tsparser/sql/test_parser.sql
similarity index 100%
rename from contrib/test_parser/sql/test_parser.sql
rename to src/test/modules/tsparser/sql/test_parser.sql
diff --git a/contrib/test_parser/test_parser--1.0.sql b/src/test/modules/tsparser/test_parser--1.0.sql
similarity index 100%
rename from contrib/test_parser/test_parser--1.0.sql
rename to src/test/modules/tsparser/test_parser--1.0.sql
diff --git a/contrib/test_parser/test_parser--unpackaged--1.0.sql b/src/test/modules/tsparser/test_parser--unpackaged--1.0.sql
similarity index 100%
rename from contrib/test_parser/test_parser--unpackaged--1.0.sql
rename to src/test/modules/tsparser/test_parser--unpackaged--1.0.sql
diff --git a/contrib/test_parser/test_parser.c b/src/test/modules/tsparser/test_parser.c
similarity index 100%
rename from contrib/test_parser/test_parser.c
rename to src/test/modules/tsparser/test_parser.c
diff --git a/contrib/test_parser/test_parser.control b/src/test/modules/tsparser/test_parser.control
similarity index 100%
rename from contrib/test_parser/test_parser.control
rename to src/test/modules/tsparser/test_parser.control
diff --git a/src/test/regress/GNUmakefile b/src/test/regress/GNUmakefile
index b40b37c..03ee6ce 100644
--- a/src/test/regress/GNUmakefile
+++ b/src/test/regress/GNUmakefile
@@ -101,9 +101,9 @@ installdirs-tests: installdirs
 	$(MKDIR_P)  $(patsubst $(srcdir)/%/,'$(DESTDIR)$(pkglibdir)/regress/%',$(sort $(dir $(regress_data_files))))
 
 
-# Get some extra C modules from contrib/spi and contrib/dummy_seclabel...
+# Get some extra C modules from contrib/spi and src/test/modules/seclabel...
 
-all: refint$(DLSUFFIX) autoinc$(DLSUFFIX) dummy_seclabel$(DLSUFFIX)
+all: refint$(DLSUFFIX) autoinc$(DLSUFFIX) seclabel$(DLSUFFIX)
 
 refint$(DLSUFFIX): $(top_builddir)/contrib/spi/refint$(DLSUFFIX)
 	cp $< $@
@@ -111,22 +111,22 @@ refint$(DLSUFFIX): $(top_builddir)/contrib/spi/refint$(DLSUFFIX)
 autoinc$(DLSUFFIX): $(top_builddir)/contrib/spi/autoinc$(DLSUFFIX)
 	cp $< $@
 
-dummy_seclabel$(DLSUFFIX): $(top_builddir)/contrib/dummy_seclabel/dummy_seclabel$(DLSUFFIX)
+seclabel$(DLSUFFIX): $(top_builddir)/src/test/modules/seclabel/seclabel$(DLSUFFIX)
 	cp $< $@
 
 $(top_builddir)/contrib/spi/refint$(DLSUFFIX): | submake-contrib-spi ;
 
 $(top_builddir)/contrib/spi/autoinc$(DLSUFFIX): | submake-contrib-spi ;
 
-$(top_builddir)/contrib/dummy_seclabel/dummy_seclabel$(DLSUFFIX): | submake-contrib-dummy_seclabel ;
+$(top_builddir)/src/test/modules/seclabel/seclabel$(DLSUFFIX): | submake-src-test-modules-seclabel ;
 
 submake-contrib-spi:
 	$(MAKE) -C $(top_builddir)/contrib/spi
 
-submake-contrib-dummy_seclabel:
-	$(MAKE) -C $(top_builddir)/contrib/dummy_seclabel
+submake-src-test-modules-seclabel:
+	$(MAKE) -C $(top_builddir)/src/test/modules/seclabel
 
-.PHONY: submake-contrib-spi submake-contrib-dummy_seclabel
+.PHONY: submake-contrib-spi submake-src-test-modules-seclabel
 
 # Tablespace setup
 
@@ -179,7 +179,7 @@ bigcheck: all tablespace-setup
 
 clean distclean maintainer-clean: clean-lib
 # things built by `all' target
-	rm -f $(OBJS) refint$(DLSUFFIX) autoinc$(DLSUFFIX) dummy_seclabel$(DLSUFFIX)
+	rm -f $(OBJS) refint$(DLSUFFIX) autoinc$(DLSUFFIX) seclabel$(DLSUFFIX)
 	rm -f pg_regress_main.o pg_regress.o pg_regress$(X)
 # things created by various check targets
 	rm -f $(output_files) $(input_files)
#18Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Robert Haas (#12)
Re: no test programs in contrib

Robert Haas wrote:

On Wed, Nov 26, 2014 at 9:27 AM, Alvaro Herrera
<alvherre@2ndquadrant.com> wrote:

Because many of them had either "test" in their names or some other
now-useless particle, I renamed them:

worker_spi -> bgworker
test_decoding -> logical_decoding
dummy_seclabel -> seclabel
test_shm_mq -> shm_mq
test_parser -> tsparser

I like the move. I dislike the renaming.

Do you dislike the new names, or the fact that they are changing at all?

--
�lvaro Herrera http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#19Peter Eisentraut
peter_e@gmx.net
In reply to: Alvaro Herrera (#11)
Re: no test programs in contrib

On 11/26/14 9:27 AM, Alvaro Herrera wrote:

I haven't done anything about documentation. I thought a new chapter
after "Additional Supplied Modules", perhaps entitled "Additional Sample
Modules" would be appropriate.

I would remove the SGML files and put simple README files into each
directory.

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#20Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Peter Eisentraut (#19)
1 attachment(s)
Re: no test programs in contrib

Peter Eisentraut wrote:

On 11/26/14 9:27 AM, Alvaro Herrera wrote:

I haven't done anything about documentation. I thought a new chapter
after "Additional Supplied Modules", perhaps entitled "Additional Sample
Modules" would be appropriate.

I would remove the SGML files and put simple README files into each
directory.

They are so small that it makes sense to do it like that. Here's a
patch for this.

I have also changed things so that:

1. test modules are not installed by "make install", not checked by
"make installcheck", not checked by "make check".

2. test modules are checked by "make check-world" (this is consistent
with handling of contrib).

3. test modules are checked by "make installcheck-world" (this is
consistent with handling of contrib)

4. test modules are installed by "make install-world". This is
consistent with contrib, and it's necessary so that "make
installcheck-world" passes.

I moved the contents from SGML files into READMEs, and removed the
references from other SGML files, turning them into
<filename>contrib/</> instead (these are release-9.4 and so on, which is
why I reference the old locations. I assume release-9.5 will mention
the moves).

There's some untested new code in vcregress.pl, but nothing else
about msvc has been done.

--
�lvaro Herrera http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

Attachments:

test_modules_reviewable-3.patchtext/x-diff; charset=us-asciiDownload
diff --git a/GNUmakefile.in b/GNUmakefile.in
index 69e0824..8dbbcee 100644
--- a/GNUmakefile.in
+++ b/GNUmakefile.in
@@ -32,7 +32,7 @@ install:
 install-docs:
 	$(MAKE) -C doc install
 
-$(call recurse,install-world,doc src config contrib,install)
+$(call recurse,install-world,doc src config contrib src/test/modules,install)
 install-world:
 	+@echo "PostgreSQL, contrib, and documentation installation complete."
 
diff --git a/contrib/Makefile b/contrib/Makefile
index b37d0dd..efee109 100644
--- a/contrib/Makefile
+++ b/contrib/Makefile
@@ -16,7 +16,6 @@ SUBDIRS = \
 		dblink		\
 		dict_int	\
 		dict_xsyn	\
-		dummy_seclabel	\
 		earthdistance	\
 		file_fdw	\
 		fuzzystrmatch	\
@@ -50,13 +49,9 @@ SUBDIRS = \
 		spi		\
 		tablefunc	\
 		tcn		\
-		test_decoding	\
-		test_parser	\
-		test_shm_mq	\
 		tsearch2	\
 		unaccent	\
-		vacuumlo	\
-		worker_spi
+		vacuumlo
 
 ifeq ($(with_openssl),yes)
 SUBDIRS += sslinfo
diff --git a/contrib/pg_upgrade/test.sh b/contrib/pg_upgrade/test.sh
index 7bbd2c7..41614b2 100644
--- a/contrib/pg_upgrade/test.sh
+++ b/contrib/pg_upgrade/test.sh
@@ -65,6 +65,7 @@ if [ "$1" = '--install' ]; then
 	"$MAKE" -s -C ../.. install DESTDIR="$temp_install"
 	"$MAKE" -s -C ../pg_upgrade_support install DESTDIR="$temp_install"
 	"$MAKE" -s -C . install DESTDIR="$temp_install"
+	"$MAKE" -s -C ../../src/test/modules install DESTDIR="$temp_install"
 
 	# platform-specific magic to find the shared libraries; see pg_regress.c
 	LD_LIBRARY_PATH=$libdir:$LD_LIBRARY_PATH
@@ -143,7 +144,14 @@ set -x
 
 "$oldbindir"/initdb -N
 "$oldbindir"/pg_ctl start -l "$logdir/postmaster1.log" -o "$POSTMASTER_OPTS" -w
-if "$MAKE" -C "$oldsrc" installcheck; then
+"$MAKE" -C "$oldsrc" installcheck
+make_installcheck_status=$?
+if [ $make_installcheck_status -eq 0 ]; then
+	"$MAKE" -C "$oldsrc"/src/test/modules installcheck
+	make_installcheck_status=$?
+fi
+
+if [ $make_installcheck_status -eq 0 ]; then
 	pg_dumpall -f "$temp_root"/dump1.sql || pg_dumpall1_status=$?
 	if [ "$newsrc" != "$oldsrc" ]; then
 		oldpgversion=`psql -A -t -d regression -c "SHOW server_version_num"`
@@ -165,12 +173,9 @@ if "$MAKE" -C "$oldsrc" installcheck; then
 		sed "s;$oldsrc;$newsrc;g" "$temp_root"/dump1.sql.orig >"$temp_root"/dump1.sql
 	fi
 else
-	make_installcheck_status=$?
-fi
-"$oldbindir"/pg_ctl -m fast stop
-if [ -n "$make_installcheck_status" ]; then
 	exit 1
 fi
+"$oldbindir"/pg_ctl -m fast stop
 if [ -n "$psql_fix_sql_status" ]; then
 	exit 1
 fi
diff --git a/doc/src/sgml/contrib.sgml b/doc/src/sgml/contrib.sgml
index ec68f10..8836b0c 100644
--- a/doc/src/sgml/contrib.sgml
+++ b/doc/src/sgml/contrib.sgml
@@ -113,7 +113,6 @@ CREATE EXTENSION <replaceable>module_name</> FROM unpackaged;
  &dblink;
  &dict-int;
  &dict-xsyn;
- &dummy-seclabel;
  &earthdistance;
  &file-fdw;
  &fuzzystrmatch;
@@ -140,9 +139,6 @@ CREATE EXTENSION <replaceable>module_name</> FROM unpackaged;
  &sslinfo;
  &tablefunc;
  &tcn;
- &test-decoding;
- &test-parser;
- &test-shm-mq;
  &tsearch2;
  &unaccent;
  &uuid-ossp;
diff --git a/doc/src/sgml/dummy-seclabel.sgml b/doc/src/sgml/dummy-seclabel.sgml
deleted file mode 100644
index d064705..0000000
--- a/doc/src/sgml/dummy-seclabel.sgml
+++ /dev/null
@@ -1,74 +0,0 @@
-<!-- doc/src/sgml/dummy-seclabel.sgml -->
-
-<sect1 id="dummy-seclabel" xreflabel="dummy_seclabel">
- <title>dummy_seclabel</title>
-
- <indexterm zone="dummy-seclabel">
-  <primary>dummy_seclabel</primary>
- </indexterm>
-
- <para>
-  The <filename>dummy_seclabel</> module exists only to support regression
-  testing of the <command>SECURITY LABEL</> statement.  It is not intended
-  to be used in production.
- </para>
-
- <sect2>
-  <title>Rationale</title>
-
-  <para>
-   The <command>SECURITY LABEL</> statement allows the user to assign security
-   labels to database objects; however, security labels can only be assigned
-   when specifically allowed by a loadable module, so this module is provided
-   to allow proper regression testing.
-  </para>
-
-  <para>
-   Security label providers intended to be used in production will typically be
-   dependent on a platform-specific feature such as
-   <productname>SE-Linux</productname>.  This module is platform-independent,
-   and therefore better-suited to regression testing.
-  </para>
- </sect2>
-
- <sect2>
-  <title>Usage</title>
-
-  <para>
-   Here's a simple example of usage:
-  </para>
-
-<programlisting>
-# postgresql.conf
-shared_preload_libraries = 'dummy_seclabel'
-</programlisting>
-
-<programlisting>
-postgres=# CREATE TABLE t (a int, b text);
-CREATE TABLE
-postgres=# SECURITY LABEL ON TABLE t IS 'classified';
-SECURITY LABEL
-</programlisting>
-
-  <para>
-   The <filename>dummy_seclabel</> module provides only four hardcoded
-   labels: <literal>unclassified</>, <literal>classified</>,
-   <literal>secret</>, and <literal>top secret</>.
-   It does not allow any other strings as security labels.
-  </para>
-  <para>
-   These labels are not used to enforce access controls.  They are only used
-   to check whether the <command>SECURITY LABEL</> statement works as expected,
-   or not.
-  </para>
- </sect2>
-
- <sect2>
-  <title>Author</title>
-
-  <para>
-   KaiGai Kohei <email>kaigai@ak.jp.nec.com</email>
-  </para>
- </sect2>
-
-</sect1>
diff --git a/doc/src/sgml/logicaldecoding.sgml b/doc/src/sgml/logicaldecoding.sgml
index 3fcde9f..97150c1 100644
--- a/doc/src/sgml/logicaldecoding.sgml
+++ b/doc/src/sgml/logicaldecoding.sgml
@@ -337,9 +337,7 @@ $ pg_recvlogical -d postgres --slot test --drop-slot
    <title>Logical Decoding Output Plugins</title>
    <para>
     An example output plugin can be found in the
-    <link linkend="test-decoding">
-     <filename>contrib/test_decoding</filename>
-    </link>
+    <filename>src/test/modules/test_decoding</filename>
     subdirectory of the PostgreSQL source tree.
    </para>
    <sect2 id="logicaldecoding-output-init">
diff --git a/doc/src/sgml/ref/security_label.sgml b/doc/src/sgml/ref/security_label.sgml
index 6e2bd25..998fe3b 100644
--- a/doc/src/sgml/ref/security_label.sgml
+++ b/doc/src/sgml/ref/security_label.sgml
@@ -207,7 +207,7 @@ SECURITY LABEL FOR selinux ON TABLE mytable IS 'system_u:object_r:sepgsql_table_
   <title>See Also</title>
   <simplelist type="inline">
    <member><xref linkend="sepgsql"></member>
-   <member><xref linkend="dummy-seclabel"></member>
+   <member><filename>src/test/modules/dummy_seclabel</filename></member>
   </simplelist>
  </refsect1>
 </refentry>
diff --git a/doc/src/sgml/release-9.1.sgml b/doc/src/sgml/release-9.1.sgml
index 4f86b64..79a8b07 100644
--- a/doc/src/sgml/release-9.1.sgml
+++ b/doc/src/sgml/release-9.1.sgml
@@ -8062,7 +8062,7 @@ SELECT * FROM places ORDER BY location <-> point '(101,456)' LIMIT 10;
 
       <listitem>
        <para>
-        Add <link linkend="dummy-seclabel"><filename>dummy_seclabel</></link>
+        Add <filename>dummy_seclabel</>
         contrib module (KaiGai Kohei)
        </para>
 
diff --git a/doc/src/sgml/release-9.4.sgml b/doc/src/sgml/release-9.4.sgml
index a249b3f..adffde6 100644
--- a/doc/src/sgml/release-9.4.sgml
+++ b/doc/src/sgml/release-9.4.sgml
@@ -503,7 +503,7 @@
        </para>
 
        <para>
-        This feature is illustrated in <xref linkend="test-shm-mq">.
+        This feature is illustrated in <filename>contrib/test_shm_mq</filename>.
        </para>
       </listitem>
 
@@ -1126,7 +1126,7 @@
 
        <listitem>
         <para>
-         Add <xref linkend="test-decoding"> module to illustrate logical
+         Add <filename>contrib/test_decoding</> module to illustrate logical
          decoding at the <acronym>SQL</> level (Andres Freund)
         </para>
        </listitem>
diff --git a/doc/src/sgml/test-decoding.sgml b/doc/src/sgml/test-decoding.sgml
deleted file mode 100644
index 23cdfe3..0000000
--- a/doc/src/sgml/test-decoding.sgml
+++ /dev/null
@@ -1,42 +0,0 @@
-<!-- doc/src/sgml/test-decoding.sgml -->
-
-<sect1 id="test-decoding" xreflabel="test_decoding">
- <title>test_decoding</title>
-
- <indexterm zone="test-decoding">
-  <primary>test_decoding</primary>
- </indexterm>
-
- <para>
-  <filename>test_decoding</> is an example of a logical decoding
-  output plugin. It doesn't do anything especially useful, but can serve as
-  a starting point for developing your own decoder.
- </para>
-
- <para>
-  <filename>test_decoding</> receives WAL through the logical decoding
-  mechanism and decodes it into text representations of the operations
-  performed.
- </para>
-
- <para>
-  Typical output from this plugin, used over the SQL logical decoding
-  interface, might be:
-
-<programlisting>
-postgres=# SELECT * FROM pg_logical_slot_get_changes('test_slot', NULL, NULL, 'include-xids', '0');
- location  | xid |                       data
------------+-----+--------------------------------------------------
- 0/16D30F8 | 691 | BEGIN
- 0/16D32A0 | 691 | table public.data: INSERT: id[int4]:2 data[text]:'arg'
- 0/16D32A0 | 691 | table public.data: INSERT: id[int4]:3 data[text]:'demo'
- 0/16D32A0 | 691 | COMMIT
- 0/16D32D8 | 692 | BEGIN
- 0/16D3398 | 692 | table public.data: DELETE: id[int4]:2
- 0/16D3398 | 692 | table public.data: DELETE: id[int4]:3
- 0/16D3398 | 692 | COMMIT
-(8 rows)
-</programlisting>
- </para>
-
-</sect1>
diff --git a/doc/src/sgml/test-parser.sgml b/doc/src/sgml/test-parser.sgml
deleted file mode 100644
index 28b1e91..0000000
--- a/doc/src/sgml/test-parser.sgml
+++ /dev/null
@@ -1,90 +0,0 @@
-<!-- doc/src/sgml/test-parser.sgml -->
-
-<sect1 id="test-parser" xreflabel="test_parser">
- <title>test_parser</title>
-
- <indexterm zone="test-parser">
-  <primary>test_parser</primary>
- </indexterm>
-
- <para>
-  <filename>test_parser</> is an example of a custom parser for full-text
-  search.  It doesn't do anything especially useful, but can serve as
-  a starting point for developing your own parser.
- </para>
-
- <para>
-  <filename>test_parser</> recognizes words separated by white space,
-  and returns just two token types:
-
-<programlisting>
-mydb=# SELECT * FROM ts_token_type('testparser');
- tokid | alias |  description
--------+-------+---------------
-     3 | word  | Word
-    12 | blank | Space symbols
-(2 rows)
-</programlisting>
-
-  These token numbers have been chosen to be compatible with the default
-  parser's numbering.  This allows us to use its <function>headline()</>
-  function, thus keeping the example simple.
- </para>
-
- <sect2>
-  <title>Usage</title>
-
-  <para>
-   Installing the <literal>test_parser</> extension creates a text search
-   parser <literal>testparser</>.  It has no user-configurable parameters.
-  </para>
-
-  <para>
-   You can test the parser with, for example,
-
-<programlisting>
-mydb=# SELECT * FROM ts_parse('testparser', 'That''s my first own parser');
- tokid | token
--------+--------
-     3 | That's
-    12 |
-     3 | my
-    12 |
-     3 | first
-    12 |
-     3 | own
-    12 |
-     3 | parser
-</programlisting>
-  </para>
-
-  <para>
-   Real-world use requires setting up a text search configuration
-   that uses the parser.  For example,
-
-<programlisting>
-mydb=# CREATE TEXT SEARCH CONFIGURATION testcfg ( PARSER = testparser );
-CREATE TEXT SEARCH CONFIGURATION
-
-mydb=# ALTER TEXT SEARCH CONFIGURATION testcfg
-mydb-#   ADD MAPPING FOR word WITH english_stem;
-ALTER TEXT SEARCH CONFIGURATION
-
-mydb=#  SELECT to_tsvector('testcfg', 'That''s my first own parser');
-          to_tsvector
--------------------------------
- 'that':1 'first':3 'parser':5
-(1 row)
-
-mydb=# SELECT ts_headline('testcfg', 'Supernovae stars are the brightest phenomena in galaxies',
-mydb(#                    to_tsquery('testcfg', 'star'));
-                           ts_headline
------------------------------------------------------------------
- Supernovae &lt;b&gt;stars&lt;/b&gt; are the brightest phenomena in galaxies
-(1 row)
-</programlisting>
-  </para>
-
- </sect2>
-
-</sect1>
diff --git a/doc/src/sgml/test-shm-mq.sgml b/doc/src/sgml/test-shm-mq.sgml
deleted file mode 100644
index dd431d0..0000000
--- a/doc/src/sgml/test-shm-mq.sgml
+++ /dev/null
@@ -1,71 +0,0 @@
-<!-- doc/src/sgml/test-shm-mq.sgml -->
-
-<sect1 id="test-shm-mq" xreflabel="test_shm_mq">
- <title>test_shm_mq</title>
-
- <indexterm zone="test-shm-mq">
-  <primary>test_shm_mq</primary>
- </indexterm>
-
- <para>
-  <filename>test_shm_mq</> is an example of how to use dynamic shared memory
-  and the shared memory message queue facilities to coordinate a user backend
-  with the efforts of one or more background workers.  It is not intended to
-  do anything useful on its own; rather, it is a demonstration of how these
-  facilities can be used, and a unit test of those facilities.
- </para>
-
- <para>
-  The function is this extension send the same message repeatedly through
-  a loop of processes.  The message payload, the size of the message queue
-  through which it is sent, and the number of processes in the loop are
-  configurable.  At the end, the message may be verified to ensure that it
-  has not been corrupted in transmission.
- </para>
-
- <sect2>
-  <title>Functions</title>
-
-<synopsis>
-test_shm_mq(queue_size int8, message text,
-            repeat_count int4 default 1, num_workers int4 default 1)
-    RETURNS void
-</synopsis>
-
-  <para>
-   This function sends and receives messages synchronously.  The user
-   backend sends the provided message to the first background worker using
-   a message queue of the given size.  The first background worker sends
-   the message to the second background worker, if the number of workers
-   is greater than one, and so forth.  Eventually, the last background
-   worker sends the message back to the user backend.  If the repeat count
-   is greater than one, the user backend then sends the message back to
-   the first worker.  Once the message has been sent and received by all
-   the coordinating processes a number of times equal to the repeat count,
-   the user backend verifies that the message finally received matches the
-   one originally sent and throws an error if not.
-  </para>
-
-<synopsis>
-test_shm_mq_pipelined(queue_size int8, message text,
-                      repeat_count int4 default 1, num_workers int4 default 1,
-                      verify bool default true)
-    RETURNS void
-</synopsis>
-
-  <para>
-   This function sends the same message multiple times, as specified by the
-   repeat count, to the first background worker using a queue of the given
-   size.  These messages are then forwarded to each background worker in
-   turn, in each case using a queue of the given size.  Finally, the last
-   background worker sends the messages back to the user backend.  The user
-   backend uses non-blocking sends and receives, so that it may begin receiving
-   copies of the message before it has finished sending all copies of the
-   message.  The <literal>verify</> argument controls whether or not the
-   received copies are checked against the message that was sent.  (This
-   takes nontrivial time so it may be useful to disable it for benchmarking
-   purposes.)
-  </para>
-
- </sect2>
-</sect1>
diff --git a/src/test/Makefile b/src/test/Makefile
index 0fd7eab..5d997b8 100644
--- a/src/test/Makefile
+++ b/src/test/Makefile
@@ -12,6 +12,6 @@ subdir = src/test
 top_builddir = ../..
 include $(top_builddir)/src/Makefile.global
 
-SUBDIRS = regress isolation
+SUBDIRS = regress isolation modules
 
 $(recurse)
diff --git a/src/test/modules/Makefile b/src/test/modules/Makefile
new file mode 100644
index 0000000..8a6e3dd
--- /dev/null
+++ b/src/test/modules/Makefile
@@ -0,0 +1,14 @@
+# src/test/modules/Makefile
+
+subdir = src/test/modules
+top_builddir = ../../..
+include $(top_builddir)/src/Makefile.global
+
+SUBDIRS = \
+		  worker_spi \
+		  test_decoding \
+		  dummy_seclabel \
+		  test_shm_mq \
+		  test_parser
+
+$(recurse)
diff --git a/contrib/dummy_seclabel/Makefile b/src/test/modules/dummy_seclabel/Makefile
similarity index 73%
rename from contrib/dummy_seclabel/Makefile
rename to src/test/modules/dummy_seclabel/Makefile
index e69aa1f..909ac9a 100644
--- a/contrib/dummy_seclabel/Makefile
+++ b/src/test/modules/dummy_seclabel/Makefile
@@ -1,4 +1,4 @@
-# contrib/dummy_seclabel/Makefile
+# src/test/modules/dummy_seclabel/Makefile
 
 MODULES = dummy_seclabel
 PGFILEDESC = "dummy_seclabel - regression testing of the SECURITY LABEL statement"
@@ -8,8 +8,8 @@ PG_CONFIG = pg_config
 PGXS := $(shell $(PG_CONFIG) --pgxs)
 include $(PGXS)
 else
-subdir = contrib/dummy_seclabel
-top_builddir = ../..
+subdir = src/test/modules/dummy_seclabel
+top_builddir = ../../../..
 include $(top_builddir)/src/Makefile.global
 include $(top_srcdir)/contrib/contrib-global.mk
 endif
diff --git a/src/test/modules/dummy_seclabel/README b/src/test/modules/dummy_seclabel/README
new file mode 100644
index 0000000..75320aa
--- /dev/null
+++ b/src/test/modules/dummy_seclabel/README
@@ -0,0 +1,43 @@
+The dummy_seclabel module exists only to support regression
+testing of the SECURITY LABEL statement.  It is not intended
+to be used in production.
+
+Rationale
+=========
+
+The SECURITY LABEL statement allows the user to assign security
+labels to database objects; however, security labels can only be assigned
+when specifically allowed by a loadable module, so this module is provided
+to allow proper regression testing.
+
+Security label providers intended to be used in production will typically be
+dependent on a platform-specific feature such as
+SE-Linux.  This module is platform-independent,
+and therefore better-suited to regression testing.
+
+Usage
+=====
+
+Here's a simple example of usage:
+
+# postgresql.conf
+shared_preload_libraries = 'dummy_seclabel'
+
+postgres=# CREATE TABLE t (a int, b text);
+CREATE TABLE
+postgres=# SECURITY LABEL ON TABLE t IS 'classified';
+SECURITY LABEL
+
+The dummy_seclabel module provides only four hardcoded
+labels: unclassified, classified,
+secret, and top secret.
+It does not allow any other strings as security labels.
+
+These labels are not used to enforce access controls.  They are only used
+to check whether the SECURITY LABEL statement works as expected,
+or not.
+
+Author
+======
+
+KaiGai Kohei <kaigai@ak.jp.nec.com>
diff --git a/contrib/dummy_seclabel/dummy_seclabel.c b/src/test/modules/dummy_seclabel/dummy_seclabel.c
similarity index 100%
rename from contrib/dummy_seclabel/dummy_seclabel.c
rename to src/test/modules/dummy_seclabel/dummy_seclabel.c
diff --git a/contrib/test_decoding/.gitignore b/src/test/modules/test_decoding/.gitignore
similarity index 100%
rename from contrib/test_decoding/.gitignore
rename to src/test/modules/test_decoding/.gitignore
diff --git a/contrib/test_decoding/Makefile b/src/test/modules/test_decoding/Makefile
similarity index 78%
rename from contrib/test_decoding/Makefile
rename to src/test/modules/test_decoding/Makefile
index 438be44..b9b8599 100644
--- a/contrib/test_decoding/Makefile
+++ b/src/test/modules/test_decoding/Makefile
@@ -1,4 +1,4 @@
-# contrib/test_decoding/Makefile
+# src/test/modules/test_decoding/Makefile
 
 MODULES = test_decoding
 PGFILEDESC = "test_decoding - example of a logical decoding output plugin"
@@ -12,8 +12,8 @@ PG_CONFIG = pg_config
 PGXS := $(shell $(PG_CONFIG) --pgxs)
 include $(PGXS)
 else
-subdir = contrib/test_decoding
-top_builddir = ../..
+subdir = src/test/modules/test_decoding
+top_builddir = ../../../..
 include $(top_builddir)/src/Makefile.global
 include $(top_srcdir)/contrib/contrib-global.mk
 endif
@@ -35,22 +35,22 @@ submake-isolation:
 	$(MAKE) -C $(top_builddir)/src/test/isolation all
 
 submake-test_decoding:
-	$(MAKE) -C $(top_builddir)/contrib/test_decoding
+	$(MAKE) -C $(top_builddir)/src/test/modules/test_decoding
 
 REGRESSCHECKS=ddl rewrite toast permissions decoding_in_xact decoding_into_rel binary prepared
 
 regresscheck: all | submake-regress submake-test_decoding
 	$(MKDIR_P) regression_output
 	$(pg_regress_check) \
-	    --temp-config $(top_srcdir)/contrib/test_decoding/logical.conf \
+	    --temp-config $(top_srcdir)/src/test/modules/test_decoding/logical.conf \
 	    --temp-install=./tmp_check \
-	    --extra-install=contrib/test_decoding \
+	    --extra-install=src/test/modules/test_decoding \
 	    --outputdir=./regression_output \
 	    $(REGRESSCHECKS)
 
 regresscheck-install-force: | submake-regress submake-test_decoding
 	$(pg_regress_installcheck) \
-	    --extra-install=contrib/test_decoding \
+	    --extra-install=src/test/modules/test_decoding \
 	    $(REGRESSCHECKS)
 
 ISOLATIONCHECKS=mxact delayed_startup ondisk_startup concurrent_ddl_dml
@@ -58,14 +58,14 @@ ISOLATIONCHECKS=mxact delayed_startup ondisk_startup concurrent_ddl_dml
 isolationcheck: all | submake-isolation submake-test_decoding
 	$(MKDIR_P) isolation_output
 	$(pg_isolation_regress_check) \
-	    --temp-config $(top_srcdir)/contrib/test_decoding/logical.conf \
-	    --extra-install=contrib/test_decoding \
+	    --temp-config $(top_srcdir)/src/test/modules/test_decoding/logical.conf \
+	    --extra-install=src/test/modules/test_decoding \
 	    --outputdir=./isolation_output \
 	    $(ISOLATIONCHECKS)
 
 isolationcheck-install-force: all | submake-isolation submake-test_decoding
 	$(pg_isolation_regress_installcheck) \
-	    --extra-install=contrib/test_decoding \
+	    --extra-install=src/test/modules/test_decoding \
 	    $(ISOLATIONCHECKS)
 
 PHONY: submake-test_decoding submake-regress check \
diff --git a/src/test/modules/test_decoding/README b/src/test/modules/test_decoding/README
new file mode 100644
index 0000000..254e750
--- /dev/null
+++ b/src/test/modules/test_decoding/README
@@ -0,0 +1,23 @@
+test_decoding is an example of a logical decoding
+output plugin. It doesn't do anything especially useful, but can serve as
+a starting point for developing your own decoder.
+
+test_decoding receives WAL through the logical decoding
+mechanism and decodes it into text representations of the operations
+performed.
+
+Typical output from this plugin, used over the SQL logical decoding
+interface, might be:
+
+postgres=# SELECT * FROM pg_logical_slot_get_changes('test_slot', NULL, NULL, 'include-xids', '0');
+ location  | xid |                       data
+-----------+-----+--------------------------------------------------
+ 0/16D30F8 | 691 | BEGIN
+ 0/16D32A0 | 691 | table public.data: INSERT: id[int4]:2 data[text]:'arg'
+ 0/16D32A0 | 691 | table public.data: INSERT: id[int4]:3 data[text]:'demo'
+ 0/16D32A0 | 691 | COMMIT
+ 0/16D32D8 | 692 | BEGIN
+ 0/16D3398 | 692 | table public.data: DELETE: id[int4]:2
+ 0/16D3398 | 692 | table public.data: DELETE: id[int4]:3
+ 0/16D3398 | 692 | COMMIT
+(8 rows)
diff --git a/contrib/test_decoding/expected/binary.out b/src/test/modules/test_decoding/expected/binary.out
similarity index 100%
rename from contrib/test_decoding/expected/binary.out
rename to src/test/modules/test_decoding/expected/binary.out
diff --git a/contrib/test_decoding/expected/concurrent_ddl_dml.out b/src/test/modules/test_decoding/expected/concurrent_ddl_dml.out
similarity index 100%
rename from contrib/test_decoding/expected/concurrent_ddl_dml.out
rename to src/test/modules/test_decoding/expected/concurrent_ddl_dml.out
diff --git a/contrib/test_decoding/expected/ddl.out b/src/test/modules/test_decoding/expected/ddl.out
similarity index 100%
rename from contrib/test_decoding/expected/ddl.out
rename to src/test/modules/test_decoding/expected/ddl.out
diff --git a/contrib/test_decoding/expected/decoding_in_xact.out b/src/test/modules/test_decoding/expected/decoding_in_xact.out
similarity index 100%
rename from contrib/test_decoding/expected/decoding_in_xact.out
rename to src/test/modules/test_decoding/expected/decoding_in_xact.out
diff --git a/contrib/test_decoding/expected/decoding_into_rel.out b/src/test/modules/test_decoding/expected/decoding_into_rel.out
similarity index 100%
rename from contrib/test_decoding/expected/decoding_into_rel.out
rename to src/test/modules/test_decoding/expected/decoding_into_rel.out
diff --git a/contrib/test_decoding/expected/delayed_startup.out b/src/test/modules/test_decoding/expected/delayed_startup.out
similarity index 100%
rename from contrib/test_decoding/expected/delayed_startup.out
rename to src/test/modules/test_decoding/expected/delayed_startup.out
diff --git a/contrib/test_decoding/expected/mxact.out b/src/test/modules/test_decoding/expected/mxact.out
similarity index 100%
rename from contrib/test_decoding/expected/mxact.out
rename to src/test/modules/test_decoding/expected/mxact.out
diff --git a/contrib/test_decoding/expected/ondisk_startup.out b/src/test/modules/test_decoding/expected/ondisk_startup.out
similarity index 100%
rename from contrib/test_decoding/expected/ondisk_startup.out
rename to src/test/modules/test_decoding/expected/ondisk_startup.out
diff --git a/contrib/test_decoding/expected/permissions.out b/src/test/modules/test_decoding/expected/permissions.out
similarity index 100%
rename from contrib/test_decoding/expected/permissions.out
rename to src/test/modules/test_decoding/expected/permissions.out
diff --git a/contrib/test_decoding/expected/prepared.out b/src/test/modules/test_decoding/expected/prepared.out
similarity index 100%
rename from contrib/test_decoding/expected/prepared.out
rename to src/test/modules/test_decoding/expected/prepared.out
diff --git a/contrib/test_decoding/expected/rewrite.out b/src/test/modules/test_decoding/expected/rewrite.out
similarity index 100%
rename from contrib/test_decoding/expected/rewrite.out
rename to src/test/modules/test_decoding/expected/rewrite.out
diff --git a/contrib/test_decoding/expected/toast.out b/src/test/modules/test_decoding/expected/toast.out
similarity index 100%
rename from contrib/test_decoding/expected/toast.out
rename to src/test/modules/test_decoding/expected/toast.out
diff --git a/contrib/test_decoding/logical.conf b/src/test/modules/test_decoding/logical.conf
similarity index 100%
rename from contrib/test_decoding/logical.conf
rename to src/test/modules/test_decoding/logical.conf
diff --git a/contrib/test_decoding/specs/concurrent_ddl_dml.spec b/src/test/modules/test_decoding/specs/concurrent_ddl_dml.spec
similarity index 100%
rename from contrib/test_decoding/specs/concurrent_ddl_dml.spec
rename to src/test/modules/test_decoding/specs/concurrent_ddl_dml.spec
diff --git a/contrib/test_decoding/specs/delayed_startup.spec b/src/test/modules/test_decoding/specs/delayed_startup.spec
similarity index 100%
rename from contrib/test_decoding/specs/delayed_startup.spec
rename to src/test/modules/test_decoding/specs/delayed_startup.spec
diff --git a/contrib/test_decoding/specs/mxact.spec b/src/test/modules/test_decoding/specs/mxact.spec
similarity index 100%
rename from contrib/test_decoding/specs/mxact.spec
rename to src/test/modules/test_decoding/specs/mxact.spec
diff --git a/contrib/test_decoding/specs/ondisk_startup.spec b/src/test/modules/test_decoding/specs/ondisk_startup.spec
similarity index 100%
rename from contrib/test_decoding/specs/ondisk_startup.spec
rename to src/test/modules/test_decoding/specs/ondisk_startup.spec
diff --git a/contrib/test_decoding/sql/binary.sql b/src/test/modules/test_decoding/sql/binary.sql
similarity index 100%
rename from contrib/test_decoding/sql/binary.sql
rename to src/test/modules/test_decoding/sql/binary.sql
diff --git a/contrib/test_decoding/sql/ddl.sql b/src/test/modules/test_decoding/sql/ddl.sql
similarity index 100%
rename from contrib/test_decoding/sql/ddl.sql
rename to src/test/modules/test_decoding/sql/ddl.sql
diff --git a/contrib/test_decoding/sql/decoding_in_xact.sql b/src/test/modules/test_decoding/sql/decoding_in_xact.sql
similarity index 100%
rename from contrib/test_decoding/sql/decoding_in_xact.sql
rename to src/test/modules/test_decoding/sql/decoding_in_xact.sql
diff --git a/contrib/test_decoding/sql/decoding_into_rel.sql b/src/test/modules/test_decoding/sql/decoding_into_rel.sql
similarity index 100%
rename from contrib/test_decoding/sql/decoding_into_rel.sql
rename to src/test/modules/test_decoding/sql/decoding_into_rel.sql
diff --git a/contrib/test_decoding/sql/permissions.sql b/src/test/modules/test_decoding/sql/permissions.sql
similarity index 100%
rename from contrib/test_decoding/sql/permissions.sql
rename to src/test/modules/test_decoding/sql/permissions.sql
diff --git a/contrib/test_decoding/sql/prepared.sql b/src/test/modules/test_decoding/sql/prepared.sql
similarity index 100%
rename from contrib/test_decoding/sql/prepared.sql
rename to src/test/modules/test_decoding/sql/prepared.sql
diff --git a/contrib/test_decoding/sql/rewrite.sql b/src/test/modules/test_decoding/sql/rewrite.sql
similarity index 100%
rename from contrib/test_decoding/sql/rewrite.sql
rename to src/test/modules/test_decoding/sql/rewrite.sql
diff --git a/contrib/test_decoding/sql/toast.sql b/src/test/modules/test_decoding/sql/toast.sql
similarity index 100%
rename from contrib/test_decoding/sql/toast.sql
rename to src/test/modules/test_decoding/sql/toast.sql
diff --git a/contrib/test_decoding/test_decoding.c b/src/test/modules/test_decoding/test_decoding.c
similarity index 100%
rename from contrib/test_decoding/test_decoding.c
rename to src/test/modules/test_decoding/test_decoding.c
diff --git a/contrib/test_shm_mq/.gitignore b/src/test/modules/test_parser/.gitignore
similarity index 100%
rename from contrib/test_shm_mq/.gitignore
rename to src/test/modules/test_parser/.gitignore
diff --git a/contrib/test_parser/Makefile b/src/test/modules/test_parser/Makefile
similarity index 80%
rename from contrib/test_parser/Makefile
rename to src/test/modules/test_parser/Makefile
index 7e068ab..0c755aa 100644
--- a/contrib/test_parser/Makefile
+++ b/src/test/modules/test_parser/Makefile
@@ -1,4 +1,4 @@
-# contrib/test_parser/Makefile
+# src/test/modules/test_parser/Makefile
 
 MODULE_big = test_parser
 OBJS = test_parser.o $(WIN32RES)
@@ -14,8 +14,8 @@ PG_CONFIG = pg_config
 PGXS := $(shell $(PG_CONFIG) --pgxs)
 include $(PGXS)
 else
-subdir = contrib/test_parser
-top_builddir = ../..
+subdir = src/test/modules/test_parser
+top_builddir = ../../../..
 include $(top_builddir)/src/Makefile.global
 include $(top_srcdir)/contrib/contrib-global.mk
 endif
diff --git a/src/test/modules/test_parser/README b/src/test/modules/test_parser/README
new file mode 100644
index 0000000..0a11ec8
--- /dev/null
+++ b/src/test/modules/test_parser/README
@@ -0,0 +1,61 @@
+test_parser is an example of a custom parser for full-text
+search.  It doesn't do anything especially useful, but can serve as
+a starting point for developing your own parser.
+
+test_parser recognizes words separated by white space,
+and returns just two token types:
+
+mydb=# SELECT * FROM ts_token_type('testparser');
+ tokid | alias |  description
+-------+-------+---------------
+     3 | word  | Word
+    12 | blank | Space symbols
+(2 rows)
+
+These token numbers have been chosen to be compatible with the default
+parser's numbering.  This allows us to use its headline()
+function, thus keeping the example simple.
+
+Usage
+=====
+
+Installing the test_parser extension creates a text search
+parser testparser.  It has no user-configurable parameters.
+
+You can test the parser with, for example,
+
+mydb=# SELECT * FROM ts_parse('testparser', 'That''s my first own parser');
+ tokid | token
+-------+--------
+     3 | That's
+    12 |
+     3 | my
+    12 |
+     3 | first
+    12 |
+     3 | own
+    12 |
+     3 | parser
+
+Real-world use requires setting up a text search configuration
+that uses the parser.  For example,
+
+mydb=# CREATE TEXT SEARCH CONFIGURATION testcfg ( PARSER = testparser );
+CREATE TEXT SEARCH CONFIGURATION
+
+mydb=# ALTER TEXT SEARCH CONFIGURATION testcfg
+mydb-#   ADD MAPPING FOR word WITH english_stem;
+ALTER TEXT SEARCH CONFIGURATION
+
+mydb=#  SELECT to_tsvector('testcfg', 'That''s my first own parser');
+          to_tsvector
+-------------------------------
+ 'that':1 'first':3 'parser':5
+(1 row)
+
+mydb=# SELECT ts_headline('testcfg', 'Supernovae stars are the brightest phenomena in galaxies',
+mydb(#                    to_tsquery('testcfg', 'star'));
+                           ts_headline
+-----------------------------------------------------------------
+ Supernovae <b>stars</b> are the brightest phenomena in galaxies
+(1 row)
diff --git a/contrib/test_parser/expected/test_parser.out b/src/test/modules/test_parser/expected/test_parser.out
similarity index 100%
rename from contrib/test_parser/expected/test_parser.out
rename to src/test/modules/test_parser/expected/test_parser.out
diff --git a/contrib/test_parser/sql/test_parser.sql b/src/test/modules/test_parser/sql/test_parser.sql
similarity index 100%
rename from contrib/test_parser/sql/test_parser.sql
rename to src/test/modules/test_parser/sql/test_parser.sql
diff --git a/contrib/test_parser/test_parser--1.0.sql b/src/test/modules/test_parser/test_parser--1.0.sql
similarity index 100%
rename from contrib/test_parser/test_parser--1.0.sql
rename to src/test/modules/test_parser/test_parser--1.0.sql
diff --git a/contrib/test_parser/test_parser--unpackaged--1.0.sql b/src/test/modules/test_parser/test_parser--unpackaged--1.0.sql
similarity index 100%
rename from contrib/test_parser/test_parser--unpackaged--1.0.sql
rename to src/test/modules/test_parser/test_parser--unpackaged--1.0.sql
diff --git a/contrib/test_parser/test_parser.c b/src/test/modules/test_parser/test_parser.c
similarity index 100%
rename from contrib/test_parser/test_parser.c
rename to src/test/modules/test_parser/test_parser.c
diff --git a/contrib/test_parser/test_parser.control b/src/test/modules/test_parser/test_parser.control
similarity index 100%
rename from contrib/test_parser/test_parser.control
rename to src/test/modules/test_parser/test_parser.control
diff --git a/contrib/test_parser/.gitignore b/src/test/modules/test_shm_mq/.gitignore
similarity index 100%
rename from contrib/test_parser/.gitignore
rename to src/test/modules/test_shm_mq/.gitignore
diff --git a/contrib/test_shm_mq/Makefile b/src/test/modules/test_shm_mq/Makefile
similarity index 79%
rename from contrib/test_shm_mq/Makefile
rename to src/test/modules/test_shm_mq/Makefile
index e3c4054..11c4e35 100644
--- a/contrib/test_shm_mq/Makefile
+++ b/src/test/modules/test_shm_mq/Makefile
@@ -1,4 +1,4 @@
-# contrib/test_shm_mq/Makefile
+# src/test/modules/test_shm_mq/Makefile
 
 MODULE_big = test_shm_mq
 OBJS = test.o setup.o worker.o $(WIN32RES)
@@ -14,8 +14,8 @@ PG_CONFIG = pg_config
 PGXS := $(shell $(PG_CONFIG) --pgxs)
 include $(PGXS)
 else
-subdir = contrib/test_shm_mq
-top_builddir = ../..
+subdir = src/test/modules/test_shm_mq
+top_builddir = ../../../..
 include $(top_builddir)/src/Makefile.global
 include $(top_srcdir)/contrib/contrib-global.mk
 endif
diff --git a/src/test/modules/test_shm_mq/README b/src/test/modules/test_shm_mq/README
new file mode 100644
index 0000000..641407b
--- /dev/null
+++ b/src/test/modules/test_shm_mq/README
@@ -0,0 +1,49 @@
+test_shm_mq is an example of how to use dynamic shared memory
+and the shared memory message queue facilities to coordinate a user backend
+with the efforts of one or more background workers.  It is not intended to
+do anything useful on its own; rather, it is a demonstration of how these
+facilities can be used, and a unit test of those facilities.
+
+The function is this extension send the same message repeatedly through
+a loop of processes.  The message payload, the size of the message queue
+through which it is sent, and the number of processes in the loop are
+configurable.  At the end, the message may be verified to ensure that it
+has not been corrupted in transmission.
+
+Functions
+=========
+
+
+test_shm_mq(queue_size int8, message text,
+            repeat_count int4 default 1, num_workers int4 default 1)
+    RETURNS void
+
+This function sends and receives messages synchronously.  The user
+backend sends the provided message to the first background worker using
+a message queue of the given size.  The first background worker sends
+the message to the second background worker, if the number of workers
+is greater than one, and so forth.  Eventually, the last background
+worker sends the message back to the user backend.  If the repeat count
+is greater than one, the user backend then sends the message back to
+the first worker.  Once the message has been sent and received by all
+the coordinating processes a number of times equal to the repeat count,
+the user backend verifies that the message finally received matches the
+one originally sent and throws an error if not.
+
+
+test_shm_mq_pipelined(queue_size int8, message text,
+                      repeat_count int4 default 1, num_workers int4 default 1,
+                      verify bool default true)
+    RETURNS void
+
+This function sends the same message multiple times, as specified by the
+repeat count, to the first background worker using a queue of the given
+size.  These messages are then forwarded to each background worker in
+turn, in each case using a queue of the given size.  Finally, the last
+background worker sends the messages back to the user backend.  The user
+backend uses non-blocking sends and receives, so that it may begin receiving
+copies of the message before it has finished sending all copies of the
+message.  The 'verify' argument controls whether or not the
+received copies are checked against the message that was sent.  (This
+takes nontrivial time so it may be useful to disable it for benchmarking
+purposes.)
diff --git a/contrib/test_shm_mq/expected/test_shm_mq.out b/src/test/modules/test_shm_mq/expected/test_shm_mq.out
similarity index 100%
rename from contrib/test_shm_mq/expected/test_shm_mq.out
rename to src/test/modules/test_shm_mq/expected/test_shm_mq.out
diff --git a/contrib/test_shm_mq/setup.c b/src/test/modules/test_shm_mq/setup.c
similarity index 100%
rename from contrib/test_shm_mq/setup.c
rename to src/test/modules/test_shm_mq/setup.c
diff --git a/contrib/test_shm_mq/sql/test_shm_mq.sql b/src/test/modules/test_shm_mq/sql/test_shm_mq.sql
similarity index 100%
rename from contrib/test_shm_mq/sql/test_shm_mq.sql
rename to src/test/modules/test_shm_mq/sql/test_shm_mq.sql
diff --git a/contrib/test_shm_mq/test.c b/src/test/modules/test_shm_mq/test.c
similarity index 100%
rename from contrib/test_shm_mq/test.c
rename to src/test/modules/test_shm_mq/test.c
diff --git a/contrib/test_shm_mq/test_shm_mq--1.0.sql b/src/test/modules/test_shm_mq/test_shm_mq--1.0.sql
similarity index 100%
rename from contrib/test_shm_mq/test_shm_mq--1.0.sql
rename to src/test/modules/test_shm_mq/test_shm_mq--1.0.sql
diff --git a/contrib/test_shm_mq/test_shm_mq.control b/src/test/modules/test_shm_mq/test_shm_mq.control
similarity index 100%
rename from contrib/test_shm_mq/test_shm_mq.control
rename to src/test/modules/test_shm_mq/test_shm_mq.control
diff --git a/contrib/test_shm_mq/test_shm_mq.h b/src/test/modules/test_shm_mq/test_shm_mq.h
similarity index 100%
rename from contrib/test_shm_mq/test_shm_mq.h
rename to src/test/modules/test_shm_mq/test_shm_mq.h
diff --git a/contrib/test_shm_mq/worker.c b/src/test/modules/test_shm_mq/worker.c
similarity index 100%
rename from contrib/test_shm_mq/worker.c
rename to src/test/modules/test_shm_mq/worker.c
diff --git a/contrib/worker_spi/Makefile b/src/test/modules/worker_spi/Makefile
similarity index 75%
rename from contrib/worker_spi/Makefile
rename to src/test/modules/worker_spi/Makefile
index 5cce4d1..7cdb33c 100644
--- a/contrib/worker_spi/Makefile
+++ b/src/test/modules/worker_spi/Makefile
@@ -1,4 +1,4 @@
-# contrib/worker_spi/Makefile
+# src/test/modules/worker_spi/Makefile
 
 MODULES = worker_spi
 
@@ -11,8 +11,8 @@ PG_CONFIG = pg_config
 PGXS := $(shell $(PG_CONFIG) --pgxs)
 include $(PGXS)
 else
-subdir = contrib/worker_spi
-top_builddir = ../..
+subdir = src/test/modules/worker_spi
+top_builddir = ../../../..
 include $(top_builddir)/src/Makefile.global
 include $(top_srcdir)/contrib/contrib-global.mk
 endif
diff --git a/contrib/worker_spi/worker_spi--1.0.sql b/src/test/modules/worker_spi/worker_spi--1.0.sql
similarity index 100%
rename from contrib/worker_spi/worker_spi--1.0.sql
rename to src/test/modules/worker_spi/worker_spi--1.0.sql
diff --git a/contrib/worker_spi/worker_spi.c b/src/test/modules/worker_spi/worker_spi.c
similarity index 100%
rename from contrib/worker_spi/worker_spi.c
rename to src/test/modules/worker_spi/worker_spi.c
diff --git a/contrib/worker_spi/worker_spi.control b/src/test/modules/worker_spi/worker_spi.control
similarity index 100%
rename from contrib/worker_spi/worker_spi.control
rename to src/test/modules/worker_spi/worker_spi.control
diff --git a/src/test/regress/GNUmakefile b/src/test/regress/GNUmakefile
index b40b37c..77fe8b6 100644
--- a/src/test/regress/GNUmakefile
+++ b/src/test/regress/GNUmakefile
@@ -101,7 +101,7 @@ installdirs-tests: installdirs
 	$(MKDIR_P)  $(patsubst $(srcdir)/%/,'$(DESTDIR)$(pkglibdir)/regress/%',$(sort $(dir $(regress_data_files))))
 
 
-# Get some extra C modules from contrib/spi and contrib/dummy_seclabel...
+# Get some extra C modules from contrib/spi and src/test/modules/dummy_seclabel...
 
 all: refint$(DLSUFFIX) autoinc$(DLSUFFIX) dummy_seclabel$(DLSUFFIX)
 
@@ -111,22 +111,22 @@ refint$(DLSUFFIX): $(top_builddir)/contrib/spi/refint$(DLSUFFIX)
 autoinc$(DLSUFFIX): $(top_builddir)/contrib/spi/autoinc$(DLSUFFIX)
 	cp $< $@
 
-dummy_seclabel$(DLSUFFIX): $(top_builddir)/contrib/dummy_seclabel/dummy_seclabel$(DLSUFFIX)
+dummy_seclabel$(DLSUFFIX): $(top_builddir)/src/test/modules/dummy_seclabel/dummy_seclabel$(DLSUFFIX)
 	cp $< $@
 
 $(top_builddir)/contrib/spi/refint$(DLSUFFIX): | submake-contrib-spi ;
 
 $(top_builddir)/contrib/spi/autoinc$(DLSUFFIX): | submake-contrib-spi ;
 
-$(top_builddir)/contrib/dummy_seclabel/dummy_seclabel$(DLSUFFIX): | submake-contrib-dummy_seclabel ;
+$(top_builddir)/src/test/modules/dummy_seclabel/dummy_seclabel$(DLSUFFIX): | submake-dummy_seclabel ;
 
 submake-contrib-spi:
 	$(MAKE) -C $(top_builddir)/contrib/spi
 
-submake-contrib-dummy_seclabel:
-	$(MAKE) -C $(top_builddir)/contrib/dummy_seclabel
+submake-dummy_seclabel:
+	$(MAKE) -C $(top_builddir)/src/test/modules/dummy_seclabel
 
-.PHONY: submake-contrib-spi submake-contrib-dummy_seclabel
+.PHONY: submake-contrib-spi submake-dummy_seclabel
 
 # Tablespace setup
 
diff --git a/src/tools/msvc/vcregress.pl b/src/tools/msvc/vcregress.pl
index b84f70d..5b7856f 100644
--- a/src/tools/msvc/vcregress.pl
+++ b/src/tools/msvc/vcregress.pl
@@ -31,7 +31,7 @@ if (-e "src/tools/msvc/buildenv.pl")
 
 my $what = shift || "";
 if ($what =~
-/^(check|installcheck|plcheck|contribcheck|ecpgcheck|isolationcheck|upgradecheck)$/i
+/^(check|installcheck|plcheck|contribcheck|modulescheck|ecpgcheck|isolationcheck|upgradecheck)$/i
   )
 {
 	$what = uc $what;
@@ -76,6 +76,7 @@ my %command = (
 	INSTALLCHECK   => \&installcheck,
 	ECPGCHECK      => \&ecpgcheck,
 	CONTRIBCHECK   => \&contribcheck,
+	MODULESCHECK   => \&modulescheck,
 	ISOLATIONCHECK => \&isolationcheck,
 	UPGRADECHECK   => \&upgradecheck,);
 
@@ -247,6 +248,34 @@ sub contribcheck
 	exit $mstat if $mstat;
 }
 
+sub modulescheck
+{
+	chdir "../../../src/test/modules";
+	my $mstat = 0;
+	foreach my $module (glob("*"))
+	{
+		next
+		  unless -d "$module/sql"
+			  && -d "$module/expected"
+			  && (-f "$module/GNUmakefile" || -f "$module/Makefile");
+		chdir $module;
+		print
+		  "============================================================\n";
+		print "Checking $module\n";
+		my @tests = fetchTests();
+		my @opts  = fetchRegressOpts();
+		my @args  = (
+			"../../../../$Config/pg_regress/pg_regress",
+			"--psqldir=../../../../$Config/psql",
+			"--dbname=modules_regression", @opts, @tests);
+		system(@args);
+		my $status = $? >> 8;
+		$mstat ||= $status;
+		chdir "..";
+	}
+	exit $mstat if $mstat;
+}
+
 sub upgradecheck
 {
 	my $status;
#21Tom Lane
tgl@sss.pgh.pa.us
In reply to: Alvaro Herrera (#20)
Re: no test programs in contrib

Alvaro Herrera <alvherre@2ndquadrant.com> writes:

I have also changed things so that:

1. test modules are not installed by "make install", not checked by
"make installcheck", not checked by "make check".

2. test modules are checked by "make check-world" (this is consistent
with handling of contrib).

3. test modules are checked by "make installcheck-world" (this is
consistent with handling of contrib)

4. test modules are installed by "make install-world". This is
consistent with contrib, and it's necessary so that "make
installcheck-world" passes.

I'm not too happy with that approach, because packagers are going to
tend to think they should package any files installed by install-world.
The entire point of this change, IMO, is that the test modules should
*not* get installed, certainly not by normal install targets. Being
consistent with the existing contrib packaging is exactly not what we
want.

Maybe we should only allow check-world to run these tests, and not
installcheck-world? That's kind of annoying, but what you are
doing now seems to defeat the purpose altogether.

regards, tom lane

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#22Josh Berkus
josh@agliodbs.com
In reply to: Alvaro Herrera (#1)
Re: no test programs in contrib

On 11/24/2014 05:49 AM, Alvaro Herrera wrote:

test_parser (a toy text search parser, added in 2007)
dummy_seclabel (for SECURITY LABEL regression testing, added Sept 2010)
worker_spi (for bgworkers, added Dec 2012)
test_shm_mq (test program for shared memory queues, added Jan 2014)
test_decoding (test program for logical decoding, added March 2014)

So test_decoding is fairly useful for users demonstrating that decoding
works, especially if they're also testing an external decoding module
and are unsure of where their replication problem is located, or what's
wrong with their HBA settings. For that reason it's important that
test_decoding be available via OS packages, which would give me some
reluctance to move it out of /contrib.

dummy_seclabel might serve the same purpose for users who are having
issues with SEPostgres etc. I don't know enough about it ...
Stephen/Kaigai?

--
Josh Berkus
PostgreSQL Experts Inc.
http://pgexperts.com

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#23Tom Lane
tgl@sss.pgh.pa.us
In reply to: Josh Berkus (#22)
Re: no test programs in contrib

Josh Berkus <josh@agliodbs.com> writes:

So test_decoding is fairly useful for users demonstrating that decoding
works, especially if they're also testing an external decoding module
and are unsure of where their replication problem is located, or what's
wrong with their HBA settings. For that reason it's important that
test_decoding be available via OS packages, which would give me some
reluctance to move it out of /contrib.

If we follow that reasoning we'll end up removing nothing from contrib.
There is no reason that end users should need to be performing such
testing; anyone who does have reason to do it will have a source tree
at hand.

dummy_seclabel might serve the same purpose for users who are having
issues with SEPostgres etc. I don't know enough about it ...

And as for dummy_seclabel, the same applies in spades, considering
that the number of users of SEPostgres can probably be counted without
running out of fingers.

regards, tom lane

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#24Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Tom Lane (#21)
1 attachment(s)
Re: no test programs in contrib

Tom Lane wrote:

I'm not too happy with that approach, because packagers are going to
tend to think they should package any files installed by install-world.
The entire point of this change, IMO, is that the test modules should
*not* get installed, certainly not by normal install targets. Being
consistent with the existing contrib packaging is exactly not what we
want.

Maybe we should only allow check-world to run these tests, and not
installcheck-world? That's kind of annoying, but what you are
doing now seems to defeat the purpose altogether.

Hadn't thought of the packaging angle of this. I don't think packagers
really are as dumb as you suggest, but anyway implementing this idea
turned out to be simpler than I expected; here's a preliminary patch.

--
�lvaro Herrera http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

Attachments:

test_modules_3a.patchtext/x-diff; charset=us-asciiDownload
diff --git a/GNUmakefile.in b/GNUmakefile.in
index 8dbbcee..7c3c657 100644
--- a/GNUmakefile.in
+++ b/GNUmakefile.in
@@ -32,7 +32,7 @@ install:
 install-docs:
 	$(MAKE) -C doc install
 
-$(call recurse,install-world,doc src config contrib src/test/modules,install)
+$(call recurse,install-world,doc src config contrib,install)
 install-world:
 	+@echo "PostgreSQL, contrib, and documentation installation complete."
 
@@ -66,7 +66,7 @@ check check-tests: all
 check check-tests installcheck installcheck-parallel installcheck-tests:
 	$(MAKE) -C src/test/regress $@
 
-$(call recurse,check-world,src/test src/pl src/interfaces/ecpg contrib src/bin,check)
+$(call recurse,check-world,src/test src/pl src/interfaces/ecpg contrib src/bin src/test/modules,check)
 
 $(call recurse,installcheck-world,src/test src/pl src/interfaces/ecpg contrib src/bin,installcheck)
 
diff --git a/src/test/Makefile b/src/test/Makefile
index 5d997b8..ff061c1 100644
--- a/src/test/Makefile
+++ b/src/test/Makefile
@@ -14,4 +14,10 @@ include $(top_builddir)/src/Makefile.global
 
 SUBDIRS = regress isolation modules
 
-$(recurse)
+standard_recurse_targets := $(filter-out installcheck install, $(standard_targets))
+
+# We want to recurse to all subdirs for all standard targets, except that
+# installcheck and install should not recurse into the subdirectory "modules".
+$(call recurse,$(standard_recurse_targets))
+$(call recurse,installcheck,regress isolation)
+$(call recurse,install,regress isolation)
#25Kouhei Kaigai
kaigai@ak.jp.nec.com
In reply to: Josh Berkus (#22)
Re: no test programs in contrib

-----Original Message-----
From: pgsql-hackers-owner@postgresql.org
[mailto:pgsql-hackers-owner@postgresql.org] On Behalf Of Josh Berkus
Sent: Friday, November 28, 2014 5:48 AM
To: Alvaro Herrera; Pg Hackers
Subject: Re: [HACKERS] no test programs in contrib

On 11/24/2014 05:49 AM, Alvaro Herrera wrote:

test_parser (a toy text search parser, added in 2007) dummy_seclabel
(for SECURITY LABEL regression testing, added Sept 2010) worker_spi
(for bgworkers, added Dec 2012) test_shm_mq (test program for shared
memory queues, added Jan 2014) test_decoding (test program for logical
decoding, added March 2014)

So test_decoding is fairly useful for users demonstrating that decoding
works, especially if they're also testing an external decoding module and
are unsure of where their replication problem is located, or what's wrong
with their HBA settings. For that reason it's important that test_decoding
be available via OS packages, which would give me some reluctance to move
it out of /contrib.

dummy_seclabel might serve the same purpose for users who are having issues
with SEPostgres etc. I don't know enough about it ...
Stephen/Kaigai?

Its original purpose is to run regression test on the platform without
selinux. So, it does not intend to use the dummy_seclabel for something
useful except for regression test.

Thanks,
--
NEC OSS Promotion Center / PG-Strom Project
KaiGai Kohei <kaigai@ak.jp.nec.com>

--
Josh Berkus
PostgreSQL Experts Inc.
http://pgexperts.com

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#26Peter Eisentraut
peter_e@gmx.net
In reply to: Tom Lane (#21)
Re: no test programs in contrib

On 11/27/14 3:10 PM, Tom Lane wrote:

I'm not too happy with that approach, because packagers are going to
tend to think they should package any files installed by install-world.
The entire point of this change, IMO, is that the test modules should
*not* get installed, certainly not by normal install targets. Being
consistent with the existing contrib packaging is exactly not what we
want.

I share this objection.

Maybe we should only allow check-world to run these tests, and not
installcheck-world? That's kind of annoying, but what you are
doing now seems to defeat the purpose altogether.

Maybe this will have to do for now.

But the existing main regression tests are able to run against an
existing installation while using the modules autoinc.so and refint.so
without installing them. I think the problem is that we are able to
load a .so file from just about anywhere, but we can't load a full
extension in the same way. There have been discussions about that, in
the context of being able to test an externally developed extension
before/without installing it. This is pretty much the same case.

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#27Andres Freund
andres@2ndquadrant.com
In reply to: Tom Lane (#23)
Re: no test programs in contrib

On 2014-11-27 15:51:51 -0500, Tom Lane wrote:

Josh Berkus <josh@agliodbs.com> writes:

So test_decoding is fairly useful for users demonstrating that decoding
works, especially if they're also testing an external decoding module
and are unsure of where their replication problem is located, or what's
wrong with their HBA settings. For that reason it's important that
test_decoding be available via OS packages, which would give me some
reluctance to move it out of /contrib.

If we follow that reasoning we'll end up removing nothing from contrib.
There is no reason that end users should need to be performing such
testing; anyone who does have reason to do it will have a source tree
at hand.

Actually I don't think that's true for test_decoding - there's quite a
bit of actual things that you can do with it. At the very least it's
useful to roughly measure the impact logical replication would have on a
database, but it's also helpful to look at the changes. And even if the
format isn't super nice, thanks to Robert's insistence it's actually
safely parseable if necessary.

dummy_seclabel might serve the same purpose for users who are having
issues with SEPostgres etc. I don't know enough about it ...

And as for dummy_seclabel, the same applies in spades, considering
that the number of users of SEPostgres can probably be counted without
running out of fingers.

I agree that dummy_seclabel really doesn't have any applications besides
regression tests.

Greetings,

Andres Freund

--
Andres Freund http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#28Josh Berkus
josh@agliodbs.com
In reply to: Alvaro Herrera (#1)
Re: no test programs in contrib

On 11/27/2014 12:51 PM, Tom Lane wrote:

So test_decoding is fairly useful for users demonstrating that decoding

works, especially if they're also testing an external decoding module
and are unsure of where their replication problem is located, or what's
wrong with their HBA settings. For that reason it's important that
test_decoding be available via OS packages, which would give me some
reluctance to move it out of /contrib.

If we follow that reasoning we'll end up removing nothing from contrib.
There is no reason that end users should need to be performing such
testing; anyone who does have reason to do it will have a source tree
at hand.

1) Decoding extension "Slony-II", installed from PGXN, won't connect
2) Install test_decoding
3) Check if decoding is working and you can connect

That's the scenario I'm looking at. It's useful for "is there something
wrong with my decoding setup or is the decoding plugin broken?"

And I can imagine quite a few users who don't have source installs
needing to check that. That doesn't mean test_decoding needs to stay in
contrib, just that it needs to be somewhere which goes into some common
package.

--
Josh Berkus
PostgreSQL Experts Inc.
http://pgexperts.com

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#29Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Josh Berkus (#28)
2 attachment(s)
Re: no test programs in contrib

Peter Eisentraut wrote:

On 11/27/14 3:10 PM, Tom Lane wrote:

I'm not too happy with that approach, because packagers are going to
tend to think they should package any files installed by install-world.
The entire point of this change, IMO, is that the test modules should
*not* get installed, certainly not by normal install targets. Being
consistent with the existing contrib packaging is exactly not what we
want.

I share this objection.

Okay, the attached version does it that way.

I also attach some changes for the MSVC build stuff. I tested it and it
builds fine AFAICT, but it doesn't install because Install.pm wants to
install contrib modules from contrib/ (which seems reasonable) but my
hack adds the src/test/modules/ as contrib modules also, so Install.pm
goes bonkers. I'm not even sure *what* we're supposed to build -- there
is no distinction in these programs as there is in the makefiles about
what to install. So if some Windows developer can look into this, I'd
appreciate it.

But the existing main regression tests are able to run against an
existing installation while using the modules autoinc.so and refint.so
without installing them. I think the problem is that we are able to
load a .so file from just about anywhere, but we can't load a full
extension in the same way. There have been discussions about that, in
the context of being able to test an externally developed extension
before/without installing it. This is pretty much the same case.

I'm leaving that problem for someone else to solve.

Andres Freund wrote:

On 2014-11-27 15:51:51 -0500, Tom Lane wrote:

If we follow that reasoning we'll end up removing nothing from contrib.
There is no reason that end users should need to be performing such
testing; anyone who does have reason to do it will have a source tree
at hand.

Actually I don't think that's true for test_decoding - there's quite a
bit of actual things that you can do with it. At the very least it's
useful to roughly measure the impact logical replication would have on a
database, but it's also helpful to look at the changes. And even if the
format isn't super nice, thanks to Robert's insistence it's actually
safely parseable if necessary.

Argh. Okay, the attached doesn't move test_decoding either.

I think it's fine anyway -- I'm sure we will come up with a few
additional test modules, such as the one for the commit_ts patch.

--
�lvaro Herrera http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training & Services

Attachments:

test_modules_4.patchtext/x-diff; charset=us-asciiDownload
commit be4885b5ee0308909bf896298b47acbf84b38606
Author: Alvaro Herrera <alvherre@alvh.no-ip.org>
Date:   Fri Nov 28 17:41:29 2014 -0300

    Move test modules from contrib to src/test/modules
    
    This is advance preparation for introducing even more test modules; the
    easy solution is to add them to contrib, but that's bloated enough that
    it seems a good time to think of something different.
    
    Moved modules are dummy_seclabel, test_shm_mq, test_parser and
    worker_spi.
    
    (test_decoding was also a candidate, but there was too much opposition
    to moving that one.  We can always reconsider later.)

diff --git a/contrib/Makefile b/contrib/Makefile
index b37d0dd..195d447 100644
--- a/contrib/Makefile
+++ b/contrib/Makefile
@@ -16,7 +16,6 @@ SUBDIRS = \
 		dblink		\
 		dict_int	\
 		dict_xsyn	\
-		dummy_seclabel	\
 		earthdistance	\
 		file_fdw	\
 		fuzzystrmatch	\
@@ -51,12 +50,9 @@ SUBDIRS = \
 		tablefunc	\
 		tcn		\
 		test_decoding	\
-		test_parser	\
-		test_shm_mq	\
 		tsearch2	\
 		unaccent	\
-		vacuumlo	\
-		worker_spi
+		vacuumlo
 
 ifeq ($(with_openssl),yes)
 SUBDIRS += sslinfo
diff --git a/doc/src/sgml/contrib.sgml b/doc/src/sgml/contrib.sgml
index ec68f10..a698d0f 100644
--- a/doc/src/sgml/contrib.sgml
+++ b/doc/src/sgml/contrib.sgml
@@ -113,7 +113,6 @@ CREATE EXTENSION <replaceable>module_name</> FROM unpackaged;
  &dblink;
  &dict-int;
  &dict-xsyn;
- &dummy-seclabel;
  &earthdistance;
  &file-fdw;
  &fuzzystrmatch;
@@ -141,8 +140,6 @@ CREATE EXTENSION <replaceable>module_name</> FROM unpackaged;
  &tablefunc;
  &tcn;
  &test-decoding;
- &test-parser;
- &test-shm-mq;
  &tsearch2;
  &unaccent;
  &uuid-ossp;
diff --git a/doc/src/sgml/dummy-seclabel.sgml b/doc/src/sgml/dummy-seclabel.sgml
deleted file mode 100644
index d064705..0000000
--- a/doc/src/sgml/dummy-seclabel.sgml
+++ /dev/null
@@ -1,74 +0,0 @@
-<!-- doc/src/sgml/dummy-seclabel.sgml -->
-
-<sect1 id="dummy-seclabel" xreflabel="dummy_seclabel">
- <title>dummy_seclabel</title>
-
- <indexterm zone="dummy-seclabel">
-  <primary>dummy_seclabel</primary>
- </indexterm>
-
- <para>
-  The <filename>dummy_seclabel</> module exists only to support regression
-  testing of the <command>SECURITY LABEL</> statement.  It is not intended
-  to be used in production.
- </para>
-
- <sect2>
-  <title>Rationale</title>
-
-  <para>
-   The <command>SECURITY LABEL</> statement allows the user to assign security
-   labels to database objects; however, security labels can only be assigned
-   when specifically allowed by a loadable module, so this module is provided
-   to allow proper regression testing.
-  </para>
-
-  <para>
-   Security label providers intended to be used in production will typically be
-   dependent on a platform-specific feature such as
-   <productname>SE-Linux</productname>.  This module is platform-independent,
-   and therefore better-suited to regression testing.
-  </para>
- </sect2>
-
- <sect2>
-  <title>Usage</title>
-
-  <para>
-   Here's a simple example of usage:
-  </para>
-
-<programlisting>
-# postgresql.conf
-shared_preload_libraries = 'dummy_seclabel'
-</programlisting>
-
-<programlisting>
-postgres=# CREATE TABLE t (a int, b text);
-CREATE TABLE
-postgres=# SECURITY LABEL ON TABLE t IS 'classified';
-SECURITY LABEL
-</programlisting>
-
-  <para>
-   The <filename>dummy_seclabel</> module provides only four hardcoded
-   labels: <literal>unclassified</>, <literal>classified</>,
-   <literal>secret</>, and <literal>top secret</>.
-   It does not allow any other strings as security labels.
-  </para>
-  <para>
-   These labels are not used to enforce access controls.  They are only used
-   to check whether the <command>SECURITY LABEL</> statement works as expected,
-   or not.
-  </para>
- </sect2>
-
- <sect2>
-  <title>Author</title>
-
-  <para>
-   KaiGai Kohei <email>kaigai@ak.jp.nec.com</email>
-  </para>
- </sect2>
-
-</sect1>
diff --git a/doc/src/sgml/ref/security_label.sgml b/doc/src/sgml/ref/security_label.sgml
index 6e2bd25..998fe3b 100644
--- a/doc/src/sgml/ref/security_label.sgml
+++ b/doc/src/sgml/ref/security_label.sgml
@@ -207,7 +207,7 @@ SECURITY LABEL FOR selinux ON TABLE mytable IS 'system_u:object_r:sepgsql_table_
   <title>See Also</title>
   <simplelist type="inline">
    <member><xref linkend="sepgsql"></member>
-   <member><xref linkend="dummy-seclabel"></member>
+   <member><filename>src/test/modules/dummy_seclabel</filename></member>
   </simplelist>
  </refsect1>
 </refentry>
diff --git a/doc/src/sgml/release-9.1.sgml b/doc/src/sgml/release-9.1.sgml
index 4f86b64..79a8b07 100644
--- a/doc/src/sgml/release-9.1.sgml
+++ b/doc/src/sgml/release-9.1.sgml
@@ -8062,7 +8062,7 @@ SELECT * FROM places ORDER BY location <-> point '(101,456)' LIMIT 10;
 
       <listitem>
        <para>
-        Add <link linkend="dummy-seclabel"><filename>dummy_seclabel</></link>
+        Add <filename>dummy_seclabel</>
         contrib module (KaiGai Kohei)
        </para>
 
diff --git a/doc/src/sgml/release-9.4.sgml b/doc/src/sgml/release-9.4.sgml
index a249b3f..bc9347c 100644
--- a/doc/src/sgml/release-9.4.sgml
+++ b/doc/src/sgml/release-9.4.sgml
@@ -503,7 +503,7 @@
        </para>
 
        <para>
-        This feature is illustrated in <xref linkend="test-shm-mq">.
+        This feature is illustrated in <filename>contrib/test_shm_mq</filename>.
        </para>
       </listitem>
 
diff --git a/doc/src/sgml/test-parser.sgml b/doc/src/sgml/test-parser.sgml
deleted file mode 100644
index 28b1e91..0000000
--- a/doc/src/sgml/test-parser.sgml
+++ /dev/null
@@ -1,90 +0,0 @@
-<!-- doc/src/sgml/test-parser.sgml -->
-
-<sect1 id="test-parser" xreflabel="test_parser">
- <title>test_parser</title>
-
- <indexterm zone="test-parser">
-  <primary>test_parser</primary>
- </indexterm>
-
- <para>
-  <filename>test_parser</> is an example of a custom parser for full-text
-  search.  It doesn't do anything especially useful, but can serve as
-  a starting point for developing your own parser.
- </para>
-
- <para>
-  <filename>test_parser</> recognizes words separated by white space,
-  and returns just two token types:
-
-<programlisting>
-mydb=# SELECT * FROM ts_token_type('testparser');
- tokid | alias |  description
--------+-------+---------------
-     3 | word  | Word
-    12 | blank | Space symbols
-(2 rows)
-</programlisting>
-
-  These token numbers have been chosen to be compatible with the default
-  parser's numbering.  This allows us to use its <function>headline()</>
-  function, thus keeping the example simple.
- </para>
-
- <sect2>
-  <title>Usage</title>
-
-  <para>
-   Installing the <literal>test_parser</> extension creates a text search
-   parser <literal>testparser</>.  It has no user-configurable parameters.
-  </para>
-
-  <para>
-   You can test the parser with, for example,
-
-<programlisting>
-mydb=# SELECT * FROM ts_parse('testparser', 'That''s my first own parser');
- tokid | token
--------+--------
-     3 | That's
-    12 |
-     3 | my
-    12 |
-     3 | first
-    12 |
-     3 | own
-    12 |
-     3 | parser
-</programlisting>
-  </para>
-
-  <para>
-   Real-world use requires setting up a text search configuration
-   that uses the parser.  For example,
-
-<programlisting>
-mydb=# CREATE TEXT SEARCH CONFIGURATION testcfg ( PARSER = testparser );
-CREATE TEXT SEARCH CONFIGURATION
-
-mydb=# ALTER TEXT SEARCH CONFIGURATION testcfg
-mydb-#   ADD MAPPING FOR word WITH english_stem;
-ALTER TEXT SEARCH CONFIGURATION
-
-mydb=#  SELECT to_tsvector('testcfg', 'That''s my first own parser');
-          to_tsvector
--------------------------------
- 'that':1 'first':3 'parser':5
-(1 row)
-
-mydb=# SELECT ts_headline('testcfg', 'Supernovae stars are the brightest phenomena in galaxies',
-mydb(#                    to_tsquery('testcfg', 'star'));
-                           ts_headline
------------------------------------------------------------------
- Supernovae &lt;b&gt;stars&lt;/b&gt; are the brightest phenomena in galaxies
-(1 row)
-</programlisting>
-  </para>
-
- </sect2>
-
-</sect1>
diff --git a/doc/src/sgml/test-shm-mq.sgml b/doc/src/sgml/test-shm-mq.sgml
deleted file mode 100644
index dd431d0..0000000
--- a/doc/src/sgml/test-shm-mq.sgml
+++ /dev/null
@@ -1,71 +0,0 @@
-<!-- doc/src/sgml/test-shm-mq.sgml -->
-
-<sect1 id="test-shm-mq" xreflabel="test_shm_mq">
- <title>test_shm_mq</title>
-
- <indexterm zone="test-shm-mq">
-  <primary>test_shm_mq</primary>
- </indexterm>
-
- <para>
-  <filename>test_shm_mq</> is an example of how to use dynamic shared memory
-  and the shared memory message queue facilities to coordinate a user backend
-  with the efforts of one or more background workers.  It is not intended to
-  do anything useful on its own; rather, it is a demonstration of how these
-  facilities can be used, and a unit test of those facilities.
- </para>
-
- <para>
-  The function is this extension send the same message repeatedly through
-  a loop of processes.  The message payload, the size of the message queue
-  through which it is sent, and the number of processes in the loop are
-  configurable.  At the end, the message may be verified to ensure that it
-  has not been corrupted in transmission.
- </para>
-
- <sect2>
-  <title>Functions</title>
-
-<synopsis>
-test_shm_mq(queue_size int8, message text,
-            repeat_count int4 default 1, num_workers int4 default 1)
-    RETURNS void
-</synopsis>
-
-  <para>
-   This function sends and receives messages synchronously.  The user
-   backend sends the provided message to the first background worker using
-   a message queue of the given size.  The first background worker sends
-   the message to the second background worker, if the number of workers
-   is greater than one, and so forth.  Eventually, the last background
-   worker sends the message back to the user backend.  If the repeat count
-   is greater than one, the user backend then sends the message back to
-   the first worker.  Once the message has been sent and received by all
-   the coordinating processes a number of times equal to the repeat count,
-   the user backend verifies that the message finally received matches the
-   one originally sent and throws an error if not.
-  </para>
-
-<synopsis>
-test_shm_mq_pipelined(queue_size int8, message text,
-                      repeat_count int4 default 1, num_workers int4 default 1,
-                      verify bool default true)
-    RETURNS void
-</synopsis>
-
-  <para>
-   This function sends the same message multiple times, as specified by the
-   repeat count, to the first background worker using a queue of the given
-   size.  These messages are then forwarded to each background worker in
-   turn, in each case using a queue of the given size.  Finally, the last
-   background worker sends the messages back to the user backend.  The user
-   backend uses non-blocking sends and receives, so that it may begin receiving
-   copies of the message before it has finished sending all copies of the
-   message.  The <literal>verify</> argument controls whether or not the
-   received copies are checked against the message that was sent.  (This
-   takes nontrivial time so it may be useful to disable it for benchmarking
-   purposes.)
-  </para>
-
- </sect2>
-</sect1>
diff --git a/src/test/Makefile b/src/test/Makefile
index 0fd7eab..9238860 100644
--- a/src/test/Makefile
+++ b/src/test/Makefile
@@ -12,6 +12,14 @@ subdir = src/test
 top_builddir = ../..
 include $(top_builddir)/src/Makefile.global
 
-SUBDIRS = regress isolation
+SUBDIRS = regress isolation modules
 
-$(recurse)
+# We want to recurse to all subdirs for all standard targets, except that
+# installcheck and install should not recurse into the subdirectory "modules".
+
+recurse_alldirs_targets := $(filter-out installcheck install, $(standard_targets))
+installable_dirs := $(filter-out modules, $(SUBDIRS))
+
+$(call recurse,$(recurse_alldirs_targets))
+$(call recurse,installcheck, $(installable_dirs))
+$(call recurse,install, $(installable_dirs))
diff --git a/src/test/modules/Makefile b/src/test/modules/Makefile
new file mode 100644
index 0000000..9d5aa97
--- /dev/null
+++ b/src/test/modules/Makefile
@@ -0,0 +1,13 @@
+# src/test/modules/Makefile
+
+subdir = src/test/modules
+top_builddir = ../../..
+include $(top_builddir)/src/Makefile.global
+
+SUBDIRS = \
+		  worker_spi \
+		  dummy_seclabel \
+		  test_shm_mq \
+		  test_parser
+
+$(recurse)
diff --git a/contrib/dummy_seclabel/Makefile b/src/test/modules/dummy_seclabel/Makefile
similarity index 73%
rename from contrib/dummy_seclabel/Makefile
rename to src/test/modules/dummy_seclabel/Makefile
index e69aa1f..909ac9a 100644
--- a/contrib/dummy_seclabel/Makefile
+++ b/src/test/modules/dummy_seclabel/Makefile
@@ -1,4 +1,4 @@
-# contrib/dummy_seclabel/Makefile
+# src/test/modules/dummy_seclabel/Makefile
 
 MODULES = dummy_seclabel
 PGFILEDESC = "dummy_seclabel - regression testing of the SECURITY LABEL statement"
@@ -8,8 +8,8 @@ PG_CONFIG = pg_config
 PGXS := $(shell $(PG_CONFIG) --pgxs)
 include $(PGXS)
 else
-subdir = contrib/dummy_seclabel
-top_builddir = ../..
+subdir = src/test/modules/dummy_seclabel
+top_builddir = ../../../..
 include $(top_builddir)/src/Makefile.global
 include $(top_srcdir)/contrib/contrib-global.mk
 endif
diff --git a/src/test/modules/dummy_seclabel/README b/src/test/modules/dummy_seclabel/README
new file mode 100644
index 0000000..75320aa
--- /dev/null
+++ b/src/test/modules/dummy_seclabel/README
@@ -0,0 +1,43 @@
+The dummy_seclabel module exists only to support regression
+testing of the SECURITY LABEL statement.  It is not intended
+to be used in production.
+
+Rationale
+=========
+
+The SECURITY LABEL statement allows the user to assign security
+labels to database objects; however, security labels can only be assigned
+when specifically allowed by a loadable module, so this module is provided
+to allow proper regression testing.
+
+Security label providers intended to be used in production will typically be
+dependent on a platform-specific feature such as
+SE-Linux.  This module is platform-independent,
+and therefore better-suited to regression testing.
+
+Usage
+=====
+
+Here's a simple example of usage:
+
+# postgresql.conf
+shared_preload_libraries = 'dummy_seclabel'
+
+postgres=# CREATE TABLE t (a int, b text);
+CREATE TABLE
+postgres=# SECURITY LABEL ON TABLE t IS 'classified';
+SECURITY LABEL
+
+The dummy_seclabel module provides only four hardcoded
+labels: unclassified, classified,
+secret, and top secret.
+It does not allow any other strings as security labels.
+
+These labels are not used to enforce access controls.  They are only used
+to check whether the SECURITY LABEL statement works as expected,
+or not.
+
+Author
+======
+
+KaiGai Kohei <kaigai@ak.jp.nec.com>
diff --git a/contrib/dummy_seclabel/dummy_seclabel.c b/src/test/modules/dummy_seclabel/dummy_seclabel.c
similarity index 100%
rename from contrib/dummy_seclabel/dummy_seclabel.c
rename to src/test/modules/dummy_seclabel/dummy_seclabel.c
diff --git a/contrib/test_shm_mq/.gitignore b/src/test/modules/test_parser/.gitignore
similarity index 100%
rename from contrib/test_shm_mq/.gitignore
rename to src/test/modules/test_parser/.gitignore
diff --git a/contrib/test_parser/Makefile b/src/test/modules/test_parser/Makefile
similarity index 80%
rename from contrib/test_parser/Makefile
rename to src/test/modules/test_parser/Makefile
index 7e068ab..0c755aa 100644
--- a/contrib/test_parser/Makefile
+++ b/src/test/modules/test_parser/Makefile
@@ -1,4 +1,4 @@
-# contrib/test_parser/Makefile
+# src/test/modules/test_parser/Makefile
 
 MODULE_big = test_parser
 OBJS = test_parser.o $(WIN32RES)
@@ -14,8 +14,8 @@ PG_CONFIG = pg_config
 PGXS := $(shell $(PG_CONFIG) --pgxs)
 include $(PGXS)
 else
-subdir = contrib/test_parser
-top_builddir = ../..
+subdir = src/test/modules/test_parser
+top_builddir = ../../../..
 include $(top_builddir)/src/Makefile.global
 include $(top_srcdir)/contrib/contrib-global.mk
 endif
diff --git a/src/test/modules/test_parser/README b/src/test/modules/test_parser/README
new file mode 100644
index 0000000..0a11ec8
--- /dev/null
+++ b/src/test/modules/test_parser/README
@@ -0,0 +1,61 @@
+test_parser is an example of a custom parser for full-text
+search.  It doesn't do anything especially useful, but can serve as
+a starting point for developing your own parser.
+
+test_parser recognizes words separated by white space,
+and returns just two token types:
+
+mydb=# SELECT * FROM ts_token_type('testparser');
+ tokid | alias |  description
+-------+-------+---------------
+     3 | word  | Word
+    12 | blank | Space symbols
+(2 rows)
+
+These token numbers have been chosen to be compatible with the default
+parser's numbering.  This allows us to use its headline()
+function, thus keeping the example simple.
+
+Usage
+=====
+
+Installing the test_parser extension creates a text search
+parser testparser.  It has no user-configurable parameters.
+
+You can test the parser with, for example,
+
+mydb=# SELECT * FROM ts_parse('testparser', 'That''s my first own parser');
+ tokid | token
+-------+--------
+     3 | That's
+    12 |
+     3 | my
+    12 |
+     3 | first
+    12 |
+     3 | own
+    12 |
+     3 | parser
+
+Real-world use requires setting up a text search configuration
+that uses the parser.  For example,
+
+mydb=# CREATE TEXT SEARCH CONFIGURATION testcfg ( PARSER = testparser );
+CREATE TEXT SEARCH CONFIGURATION
+
+mydb=# ALTER TEXT SEARCH CONFIGURATION testcfg
+mydb-#   ADD MAPPING FOR word WITH english_stem;
+ALTER TEXT SEARCH CONFIGURATION
+
+mydb=#  SELECT to_tsvector('testcfg', 'That''s my first own parser');
+          to_tsvector
+-------------------------------
+ 'that':1 'first':3 'parser':5
+(1 row)
+
+mydb=# SELECT ts_headline('testcfg', 'Supernovae stars are the brightest phenomena in galaxies',
+mydb(#                    to_tsquery('testcfg', 'star'));
+                           ts_headline
+-----------------------------------------------------------------
+ Supernovae <b>stars</b> are the brightest phenomena in galaxies
+(1 row)
diff --git a/contrib/test_parser/expected/test_parser.out b/src/test/modules/test_parser/expected/test_parser.out
similarity index 100%
rename from contrib/test_parser/expected/test_parser.out
rename to src/test/modules/test_parser/expected/test_parser.out
diff --git a/contrib/test_parser/sql/test_parser.sql b/src/test/modules/test_parser/sql/test_parser.sql
similarity index 100%
rename from contrib/test_parser/sql/test_parser.sql
rename to src/test/modules/test_parser/sql/test_parser.sql
diff --git a/contrib/test_parser/test_parser--1.0.sql b/src/test/modules/test_parser/test_parser--1.0.sql
similarity index 100%
rename from contrib/test_parser/test_parser--1.0.sql
rename to src/test/modules/test_parser/test_parser--1.0.sql
diff --git a/contrib/test_parser/test_parser--unpackaged--1.0.sql b/src/test/modules/test_parser/test_parser--unpackaged--1.0.sql
similarity index 100%
rename from contrib/test_parser/test_parser--unpackaged--1.0.sql
rename to src/test/modules/test_parser/test_parser--unpackaged--1.0.sql
diff --git a/contrib/test_parser/test_parser.c b/src/test/modules/test_parser/test_parser.c
similarity index 100%
rename from contrib/test_parser/test_parser.c
rename to src/test/modules/test_parser/test_parser.c
diff --git a/contrib/test_parser/test_parser.control b/src/test/modules/test_parser/test_parser.control
similarity index 100%
rename from contrib/test_parser/test_parser.control
rename to src/test/modules/test_parser/test_parser.control
diff --git a/contrib/test_parser/.gitignore b/src/test/modules/test_shm_mq/.gitignore
similarity index 100%
rename from contrib/test_parser/.gitignore
rename to src/test/modules/test_shm_mq/.gitignore
diff --git a/contrib/test_shm_mq/Makefile b/src/test/modules/test_shm_mq/Makefile
similarity index 79%
rename from contrib/test_shm_mq/Makefile
rename to src/test/modules/test_shm_mq/Makefile
index e3c4054..11c4e35 100644
--- a/contrib/test_shm_mq/Makefile
+++ b/src/test/modules/test_shm_mq/Makefile
@@ -1,4 +1,4 @@
-# contrib/test_shm_mq/Makefile
+# src/test/modules/test_shm_mq/Makefile
 
 MODULE_big = test_shm_mq
 OBJS = test.o setup.o worker.o $(WIN32RES)
@@ -14,8 +14,8 @@ PG_CONFIG = pg_config
 PGXS := $(shell $(PG_CONFIG) --pgxs)
 include $(PGXS)
 else
-subdir = contrib/test_shm_mq
-top_builddir = ../..
+subdir = src/test/modules/test_shm_mq
+top_builddir = ../../../..
 include $(top_builddir)/src/Makefile.global
 include $(top_srcdir)/contrib/contrib-global.mk
 endif
diff --git a/src/test/modules/test_shm_mq/README b/src/test/modules/test_shm_mq/README
new file mode 100644
index 0000000..641407b
--- /dev/null
+++ b/src/test/modules/test_shm_mq/README
@@ -0,0 +1,49 @@
+test_shm_mq is an example of how to use dynamic shared memory
+and the shared memory message queue facilities to coordinate a user backend
+with the efforts of one or more background workers.  It is not intended to
+do anything useful on its own; rather, it is a demonstration of how these
+facilities can be used, and a unit test of those facilities.
+
+The function is this extension send the same message repeatedly through
+a loop of processes.  The message payload, the size of the message queue
+through which it is sent, and the number of processes in the loop are
+configurable.  At the end, the message may be verified to ensure that it
+has not been corrupted in transmission.
+
+Functions
+=========
+
+
+test_shm_mq(queue_size int8, message text,
+            repeat_count int4 default 1, num_workers int4 default 1)
+    RETURNS void
+
+This function sends and receives messages synchronously.  The user
+backend sends the provided message to the first background worker using
+a message queue of the given size.  The first background worker sends
+the message to the second background worker, if the number of workers
+is greater than one, and so forth.  Eventually, the last background
+worker sends the message back to the user backend.  If the repeat count
+is greater than one, the user backend then sends the message back to
+the first worker.  Once the message has been sent and received by all
+the coordinating processes a number of times equal to the repeat count,
+the user backend verifies that the message finally received matches the
+one originally sent and throws an error if not.
+
+
+test_shm_mq_pipelined(queue_size int8, message text,
+                      repeat_count int4 default 1, num_workers int4 default 1,
+                      verify bool default true)
+    RETURNS void
+
+This function sends the same message multiple times, as specified by the
+repeat count, to the first background worker using a queue of the given
+size.  These messages are then forwarded to each background worker in
+turn, in each case using a queue of the given size.  Finally, the last
+background worker sends the messages back to the user backend.  The user
+backend uses non-blocking sends and receives, so that it may begin receiving
+copies of the message before it has finished sending all copies of the
+message.  The 'verify' argument controls whether or not the
+received copies are checked against the message that was sent.  (This
+takes nontrivial time so it may be useful to disable it for benchmarking
+purposes.)
diff --git a/contrib/test_shm_mq/expected/test_shm_mq.out b/src/test/modules/test_shm_mq/expected/test_shm_mq.out
similarity index 100%
rename from contrib/test_shm_mq/expected/test_shm_mq.out
rename to src/test/modules/test_shm_mq/expected/test_shm_mq.out
diff --git a/contrib/test_shm_mq/setup.c b/src/test/modules/test_shm_mq/setup.c
similarity index 100%
rename from contrib/test_shm_mq/setup.c
rename to src/test/modules/test_shm_mq/setup.c
diff --git a/contrib/test_shm_mq/sql/test_shm_mq.sql b/src/test/modules/test_shm_mq/sql/test_shm_mq.sql
similarity index 100%
rename from contrib/test_shm_mq/sql/test_shm_mq.sql
rename to src/test/modules/test_shm_mq/sql/test_shm_mq.sql
diff --git a/contrib/test_shm_mq/test.c b/src/test/modules/test_shm_mq/test.c
similarity index 100%
rename from contrib/test_shm_mq/test.c
rename to src/test/modules/test_shm_mq/test.c
diff --git a/contrib/test_shm_mq/test_shm_mq--1.0.sql b/src/test/modules/test_shm_mq/test_shm_mq--1.0.sql
similarity index 100%
rename from contrib/test_shm_mq/test_shm_mq--1.0.sql
rename to src/test/modules/test_shm_mq/test_shm_mq--1.0.sql
diff --git a/contrib/test_shm_mq/test_shm_mq.control b/src/test/modules/test_shm_mq/test_shm_mq.control
similarity index 100%
rename from contrib/test_shm_mq/test_shm_mq.control
rename to src/test/modules/test_shm_mq/test_shm_mq.control
diff --git a/contrib/test_shm_mq/test_shm_mq.h b/src/test/modules/test_shm_mq/test_shm_mq.h
similarity index 100%
rename from contrib/test_shm_mq/test_shm_mq.h
rename to src/test/modules/test_shm_mq/test_shm_mq.h
diff --git a/contrib/test_shm_mq/worker.c b/src/test/modules/test_shm_mq/worker.c
similarity index 100%
rename from contrib/test_shm_mq/worker.c
rename to src/test/modules/test_shm_mq/worker.c
diff --git a/contrib/worker_spi/Makefile b/src/test/modules/worker_spi/Makefile
similarity index 75%
rename from contrib/worker_spi/Makefile
rename to src/test/modules/worker_spi/Makefile
index 5cce4d1..7cdb33c 100644
--- a/contrib/worker_spi/Makefile
+++ b/src/test/modules/worker_spi/Makefile
@@ -1,4 +1,4 @@
-# contrib/worker_spi/Makefile
+# src/test/modules/worker_spi/Makefile
 
 MODULES = worker_spi
 
@@ -11,8 +11,8 @@ PG_CONFIG = pg_config
 PGXS := $(shell $(PG_CONFIG) --pgxs)
 include $(PGXS)
 else
-subdir = contrib/worker_spi
-top_builddir = ../..
+subdir = src/test/modules/worker_spi
+top_builddir = ../../../..
 include $(top_builddir)/src/Makefile.global
 include $(top_srcdir)/contrib/contrib-global.mk
 endif
diff --git a/contrib/worker_spi/worker_spi--1.0.sql b/src/test/modules/worker_spi/worker_spi--1.0.sql
similarity index 100%
rename from contrib/worker_spi/worker_spi--1.0.sql
rename to src/test/modules/worker_spi/worker_spi--1.0.sql
diff --git a/contrib/worker_spi/worker_spi.c b/src/test/modules/worker_spi/worker_spi.c
similarity index 100%
rename from contrib/worker_spi/worker_spi.c
rename to src/test/modules/worker_spi/worker_spi.c
diff --git a/contrib/worker_spi/worker_spi.control b/src/test/modules/worker_spi/worker_spi.control
similarity index 100%
rename from contrib/worker_spi/worker_spi.control
rename to src/test/modules/worker_spi/worker_spi.control
diff --git a/src/test/regress/GNUmakefile b/src/test/regress/GNUmakefile
index b40b37c..77fe8b6 100644
--- a/src/test/regress/GNUmakefile
+++ b/src/test/regress/GNUmakefile
@@ -101,7 +101,7 @@ installdirs-tests: installdirs
 	$(MKDIR_P)  $(patsubst $(srcdir)/%/,'$(DESTDIR)$(pkglibdir)/regress/%',$(sort $(dir $(regress_data_files))))
 
 
-# Get some extra C modules from contrib/spi and contrib/dummy_seclabel...
+# Get some extra C modules from contrib/spi and src/test/modules/dummy_seclabel...
 
 all: refint$(DLSUFFIX) autoinc$(DLSUFFIX) dummy_seclabel$(DLSUFFIX)
 
@@ -111,22 +111,22 @@ refint$(DLSUFFIX): $(top_builddir)/contrib/spi/refint$(DLSUFFIX)
 autoinc$(DLSUFFIX): $(top_builddir)/contrib/spi/autoinc$(DLSUFFIX)
 	cp $< $@
 
-dummy_seclabel$(DLSUFFIX): $(top_builddir)/contrib/dummy_seclabel/dummy_seclabel$(DLSUFFIX)
+dummy_seclabel$(DLSUFFIX): $(top_builddir)/src/test/modules/dummy_seclabel/dummy_seclabel$(DLSUFFIX)
 	cp $< $@
 
 $(top_builddir)/contrib/spi/refint$(DLSUFFIX): | submake-contrib-spi ;
 
 $(top_builddir)/contrib/spi/autoinc$(DLSUFFIX): | submake-contrib-spi ;
 
-$(top_builddir)/contrib/dummy_seclabel/dummy_seclabel$(DLSUFFIX): | submake-contrib-dummy_seclabel ;
+$(top_builddir)/src/test/modules/dummy_seclabel/dummy_seclabel$(DLSUFFIX): | submake-dummy_seclabel ;
 
 submake-contrib-spi:
 	$(MAKE) -C $(top_builddir)/contrib/spi
 
-submake-contrib-dummy_seclabel:
-	$(MAKE) -C $(top_builddir)/contrib/dummy_seclabel
+submake-dummy_seclabel:
+	$(MAKE) -C $(top_builddir)/src/test/modules/dummy_seclabel
 
-.PHONY: submake-contrib-spi submake-contrib-dummy_seclabel
+.PHONY: submake-contrib-spi submake-dummy_seclabel
 
 # Tablespace setup
 
test_modules_4-msvc.patchtext/x-diff; charset=us-asciiDownload
commit 8b0ce50790b61fef20f3a613435381bc8427a6ca
Author: Alvaro Herrera <alvherre@alvh.no-ip.org>
Date:   Fri Nov 28 12:37:50 2014 -0300

    MSVC updates

diff --git a/src/tools/msvc/Mkvcbuild.pm b/src/tools/msvc/Mkvcbuild.pm
index 004942c..9530ffb 100644
--- a/src/tools/msvc/Mkvcbuild.pm
+++ b/src/tools/msvc/Mkvcbuild.pm
@@ -528,16 +528,19 @@ sub mkvcbuild
 	my $mf = Project::read_file('contrib/pgcrypto/Makefile');
 	GenerateContribSqlFiles('pgcrypto', $mf);
 
-	my $D;
-	opendir($D, 'contrib') || croak "Could not opendir on contrib!\n";
-	while (my $d = readdir($D))
+	foreach my $subdir ('contrib', 'src/test/modules')
 	{
-		next if ($d =~ /^\./);
-		next unless (-f "contrib/$d/Makefile");
-		next if (grep { /^$d$/ } @contrib_excludes);
-		AddContrib($d);
+		my $D;
+		opendir($D, $subdir) || croak "Could not opendir on $subdir!\n";
+		while (my $d = readdir($D))
+		{
+			next if ($d =~ /^\./);
+			next unless (-f "$subdir/$d/Makefile");
+			next if (grep { /^$d$/ } @contrib_excludes);
+			AddContrib($subdir, $d);
+		}
+		closedir($D);
 	}
-	closedir($D);
 
 	$mf =
 	  Project::read_file('src\backend\utils\mb\conversion_procs\Makefile');
@@ -649,17 +652,19 @@ sub AddSimpleFrontend
 	return $p;
 }
 
-# Add a simple contrib project
+# Add a simple contrib project.  First arg is the subdir on which to find
+# the module; some of them reside in src/test/modules
 sub AddContrib
 {
+	my $subdir = shift;
 	my $n  = shift;
-	my $mf = Project::read_file('contrib\\' . $n . '\Makefile');
+	my $mf = Project::read_file($subdir . '\\' . $n . '\Makefile');
 
 	if ($mf =~ /^MODULE_big\s*=\s*(.*)$/mg)
 	{
 		my $dn = $1;
 		my $proj =
-		  $solution->AddProject($dn, 'dll', 'contrib', 'contrib\\' . $n);
+		  $solution->AddProject($dn, 'dll', 'contrib', $subdir . '\\' . $n);
 		$proj->AddReference($postgres);
 		AdjustContribProj($proj);
 	}
@@ -668,7 +673,7 @@ sub AddContrib
 		foreach my $mod (split /\s+/, $1)
 		{
 			my $proj =
-			  $solution->AddProject($mod, 'dll', 'contrib', 'contrib\\' . $n);
+			  $solution->AddProject($mod, 'dll', 'contrib', $subdir . '\\' . $n);
 			$proj->AddFile('contrib\\' . $n . '\\' . $mod . '.c');
 			$proj->AddReference($postgres);
 			AdjustContribProj($proj);
@@ -677,7 +682,7 @@ sub AddContrib
 	elsif ($mf =~ /^PROGRAM\s*=\s*(.*)$/mg)
 	{
 		my $proj =
-		  $solution->AddProject($1, 'exe', 'contrib', 'contrib\\' . $n);
+		  $solution->AddProject($1, 'exe', 'contrib', $subdir . '\\' . $n);
 		AdjustContribProj($proj);
 	}
 	else
diff --git a/src/tools/msvc/vcregress.pl b/src/tools/msvc/vcregress.pl
index b84f70d..294894f 100644
--- a/src/tools/msvc/vcregress.pl
+++ b/src/tools/msvc/vcregress.pl
@@ -31,7 +31,7 @@ if (-e "src/tools/msvc/buildenv.pl")
 
 my $what = shift || "";
 if ($what =~
-/^(check|installcheck|plcheck|contribcheck|ecpgcheck|isolationcheck|upgradecheck)$/i
+/^(check|installcheck|plcheck|contribcheck|modulescheck|ecpgcheck|isolationcheck|upgradecheck)$/i
   )
 {
 	$what = uc $what;
@@ -76,6 +76,7 @@ my %command = (
 	INSTALLCHECK   => \&installcheck,
 	ECPGCHECK      => \&ecpgcheck,
 	CONTRIBCHECK   => \&contribcheck,
+	MODULESCHECK   => \&modulescheck,
 	ISOLATIONCHECK => \&isolationcheck,
 	UPGRADECHECK   => \&upgradecheck,);
 
@@ -213,22 +214,18 @@ sub plcheck
 	chdir "../../..";
 }
 
-sub contribcheck
+sub subdircheck
 {
-	chdir "../../../contrib";
+	my $topdir = shift;
+	my $subdir = shift;
+	my $module = shift;
 	my $mstat = 0;
-	foreach my $module (glob("*"))
-	{
-		# these configuration-based exclusions must match Install.pm
-		next if ($module eq "uuid-ossp" && !defined($config->{uuid}));
-		next if ($module eq "sslinfo"   && !defined($config->{openssl}));
-		next if ($module eq "xml2"      && !defined($config->{xml}));
-		next if ($module eq "sepgsql");
 
-		next
-		  unless -d "$module/sql"
-			  && -d "$module/expected"
-			  && (-f "$module/GNUmakefile" || -f "$module/Makefile");
+	{
+		return
+		     unless -d "$module/sql"
+		  && -d "$module/expected"
+		  && (-f "$module/GNUmakefile" || -f "$module/Makefile");
 		chdir $module;
 		print
 		  "============================================================\n";
@@ -236,17 +233,41 @@ sub contribcheck
 		my @tests = fetchTests();
 		my @opts  = fetchRegressOpts();
 		my @args  = (
-			"../../$Config/pg_regress/pg_regress",
-			"--psqldir=../../$Config/psql",
-			"--dbname=contrib_regression", @opts, @tests);
+			"$topdir/pg_regress/pg_regress",
+			"--psqldir=$topdir/psql", "--dbname=contrib", @opts, @tests);
 		system(@args);
 		my $status = $? >> 8;
 		$mstat ||= $status;
 		chdir "..";
 	}
+
 	exit $mstat if $mstat;
 }
 
+sub contribcheck
+{
+	chdir "../../../contrib";
+	foreach my $module (glob("*"))
+	{
+		# these configuration-based exclusions must match Install.pm
+		next if ($module eq "uuid-ossp" && !defined($config->{uuid}));
+		next if ($module eq "sslinfo"   && !defined($config->{openssl}));
+		next if ($module eq "xml2"      && !defined($config->{xml}));
+		next if ($module eq "sepgsql");
+
+		subdircheck("../../$Config", "../../../contrib", $module);
+	}
+}
+
+sub modulescheck
+{
+	chdir "../../../src/test/modules";
+	foreach my $module (glob("*"))
+	{
+		subdircheck("../../$Config", "../../../src/test/modules", $module);
+	}
+}
+
 sub upgradecheck
 {
 	my $status;
#30Michael Paquier
michael.paquier@gmail.com
In reply to: Alvaro Herrera (#29)
Re: no test programs in contrib

On Sat, Nov 29, 2014 at 5:54 AM, Alvaro Herrera <alvherre@2ndquadrant.com>
wrote:

I also attach some changes for the MSVC build stuff. I tested it and it
builds fine AFAICT, but it doesn't install because Install.pm wants to
install contrib modules from contrib/ (which seems reasonable) but my
hack adds the src/test/modules/ as contrib modules also, so Install.pm
goes bonkers. I'm not even sure *what* we're supposed to build -- there
is no distinction in these programs as there is in the makefiles about
what to install. So if some Windows developer can look into this, I'd
appreciate it.

It would be good to be consistent on Windows with what is now done on other
platforms: those modules should not be installed by default, but it would
be good to make install.pm a bit smarter with for example an option "full",
aka install server + client + test modules. Building them is worth it in
any case as they can be used with modulescheck.
My 2c.
--
Michael

#31Alvaro Herrera
alvherre@2ndquadrant.com
In reply to: Michael Paquier (#30)
Re: no test programs in contrib

Michael Paquier wrote:

It would be good to be consistent on Windows with what is now done on other
platforms: those modules should not be installed by default, but it would
be good to make install.pm a bit smarter with for example an option "full",
aka install server + client + test modules. Building them is worth it in
any case as they can be used with modulescheck.

Sure, I agree with that.

--
�lvaro Herrera http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

--
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

#32Michael Paquier
michael.paquier@gmail.com
In reply to: Alvaro Herrera (#29)
1 attachment(s)
Re: no test programs in contrib

On Sat, Nov 29, 2014 at 5:54 AM, Alvaro Herrera
<alvherre@2ndquadrant.com> wrote:

Peter Eisentraut wrote:

On 11/27/14 3:10 PM, Tom Lane wrote:

I'm not too happy with that approach, because packagers are going to
tend to think they should package any files installed by install-world.
The entire point of this change, IMO, is that the test modules should
*not* get installed, certainly not by normal install targets. Being
consistent with the existing contrib packaging is exactly not what we
want.

I share this objection.

Okay, the attached version does it that way.

I also attach some changes for the MSVC build stuff. I tested it and it
builds fine AFAICT, but it doesn't install because Install.pm wants to
install contrib modules from contrib/ (which seems reasonable) but my
hack adds the src/test/modules/ as contrib modules also, so Install.pm
goes bonkers. I'm not even sure *what* we're supposed to build -- there
is no distinction in these programs as there is in the makefiles about
what to install. So if some Windows developer can look into this, I'd
appreciate it.

But the existing main regression tests are able to run against an
existing installation while using the modules autoinc.so and refint.so
without installing them. I think the problem is that we are able to
load a .so file from just about anywhere, but we can't load a full
extension in the same way. There have been discussions about that, in
the context of being able to test an externally developed extension
before/without installing it. This is pretty much the same case.

I'm leaving that problem for someone else to solve.

Andres Freund wrote:

On 2014-11-27 15:51:51 -0500, Tom Lane wrote:

If we follow that reasoning we'll end up removing nothing from contrib.
There is no reason that end users should need to be performing such
testing; anyone who does have reason to do it will have a source tree
at hand.

Actually I don't think that's true for test_decoding - there's quite a
bit of actual things that you can do with it. At the very least it's
useful to roughly measure the impact logical replication would have on a
database, but it's also helpful to look at the changes. And even if the
format isn't super nice, thanks to Robert's insistence it's actually
safely parseable if necessary.

Argh. Okay, the attached doesn't move test_decoding either.

I think it's fine anyway -- I'm sure we will come up with a few
additional test modules, such as the one for the commit_ts patch.

When src/test/modules is compiled directly after running ./configure,
make complains about utils/errcodes.h missing:
In file included from worker_spi.c:23:
In file included from ../../../../src/include/postgres.h:48:
../../../../src/include/utils/elog.h:69:10: fatal error:
'utils/errcodes.h' file not found
#include "utils/errcodes.h"

Shouldn't src/test/modules/Makefile includes .PHONY with
submake-errcodes like for example in the patch attached?
Regards,
--
Michael

Attachments:

20141222_test_modules_make.patchtext/x-patch; charset=US-ASCII; name=20141222_test_modules_make.patchDownload
diff --git a/src/test/modules/Makefile b/src/test/modules/Makefile
index 93d93af..7ca3eb0 100644
--- a/src/test/modules/Makefile
+++ b/src/test/modules/Makefile
@@ -11,6 +11,7 @@ SUBDIRS = \
 		  test_shm_mq \
 		  test_parser
 
+.PHONY: submake-errcodes
 all: submake-errcodes
 
 submake-errcodes: