fillfactor using WITH syntax
Hi Hackers,
I'm rewriting fillfactor patch, per the following discussion,
http://archives.postgresql.org/pgsql-hackers/2006-03/msg00287.php
Now fillfactor can be set using WITH syntax:
- CREATE INDEX index ON table USING btree (columns) WITH (...)
- CREATE TABLE table (i integer PRIMARY KEY WITH (...))
- ALTER TABLE table ADD PRIMARY KEY (columns) WITH (...)
The settings are stored on pg_class.relfillfactor and the last value will
be used on next REINDEX. WITH parameter is a list of DefElems, so we can
use it to pass additional parameters to index access methods.
I also added same extention to table creation:
- CREATE TABLE table (columns) WITH (...)
- CREATE TABLE table WITH (...) AS SELECT/EXECUTE ...
Fill factor for tables works on INSERT, COPY, VACUUM FULL, CLUSTER, and
UPDATE to another page (not be used when rows are updated in the same page).
It is not so useful currently however, but if we optimize updating in same
page, the freespace controlling will do some good.
(The optimization is discussed in [HACKERS] Faster Updates,
http://archives.postgresql.org/pgsql-hackers/2006-06/msg00116.php)
Now, I want to ask you how to modify WITH parameters for existing
tables/indexes. One idea is extending re-organization commands:
- REINDEX INDEX index WITH (...)
- CLUSTER index ON table WITH (...)
- VACUUM FULL WITH (...)
Another is to use ALTER. but it may be unclear that the change will
be applied immediately or delayed until next re-organization.
- ALTER TABLE/INDEX name SET (...)
I appreciate any comments.
---
ITAGAKI Takahiro
NTT OSS Center
ITAGAKI Takahiro <itagaki.takahiro@oss.ntt.co.jp> writes:
Now, I want to ask you how to modify WITH parameters for existing
tables/indexes.
I'd go with the ALTER TABLE, rather than cluttering N other commands.
There's already precedent for delayed effects of parameter alterations
(SET, ALTER SET STATISTICS, ALTER SET STORAGE, etc). Documenting which
commands cause the new values to take effect seems sufficient.
regards, tom lane
This is a patch for table/index fillfactor control discussed in
http://archives.postgresql.org/pgsql-hackers/2006-06/msg00175.php
Fillfactor works on CREATE, INSERT, UPDATE, COPY, VACUUM FULL, CLUSTER
and REINDEX, but is not done on dump/restore and GIN access method;
I'd like to ask those module developers to complete the patch, please.
This patch might help the TODO-item:
Allow CREATE INDEX to take an additional parameter for use with
special index types
but the patch rejects parameters except fillfactor currently.
If we want to implement the feature, it is needed to consider how to
store generic parameters passed at CREATE.
The following syntax are added:
- Table creation:
- CREATE TABLE table (columns) WITH (...)
- CREATE TABLE table WITH (...) AS SELECT/EXECUTE ...
- Index creation:
- CREATE INDEX index ON table USING btree (columns) WITH (...)
- CREATE TABLE table (i integer PRIMARY KEY WITH (...))
- ALTER TABLE table ADD PRIMARY KEY (columns) WITH (...)
- Alterating parameters for existing tables/indexes:
- ALTER TABLE/INDEX name SET (...)
The folloing is a test of the patch:
# CREATE TABLE tbl (i int) WITH (fillfactor=50);
# CREATE INDEX idx ON tbl USING btree (i) WITH (fillfactor=50);
# INSERT INTO tbl SELECT generate_series(1, 100000);
| relname | relfillfactor | relpages |
+---------+---------------+----------+
| tbl | 50 | 1087 |
| idx | 50 | 494 |
# ALTER TABLE tbl SET (fillfactor = 100);
# ALTER INDEX idx SET (fillfactor = 100);
# CLUSTER idx ON tbl;
# REINDEX INDEX idx;
| relname | relfillfactor | relpages |
+---------+---------------+----------+
| tbl | 100 | 541 |
| idx | 100 | 249 |
---
ITAGAKI Takahiro
NTT OSS Center
Attachments:
On Tue, 2006-06-06 at 11:45 +0900, ITAGAKI Takahiro wrote:
Hi Hackers,
I'm rewriting fillfactor patch, per the following discussion,
http://archives.postgresql.org/pgsql-hackers/2006-03/msg00287.php
Now fillfactor can be set using WITH syntax:
- CREATE INDEX index ON table USING btree (columns) WITH (...)
- CREATE TABLE table (i integer PRIMARY KEY WITH (...))
- ALTER TABLE table ADD PRIMARY KEY (columns) WITH (...)
Sounds good.
This is important in other situations too, e.g.
http://archives.postgresql.org/pgsql-hackers/2005-09/msg00851.php
The settings are stored on pg_class.relfillfactor and the last value will
be used on next REINDEX. WITH parameter is a list of DefElems, so we can
use it to pass additional parameters to index access methods.
Are you implementing the array of parameters on pg_index as Tom
suggested or pg_class.relfillfactor?
Why not implement an array of option parameters on pg_class, so both
heaps and indexes can be given additional parameters? That way you
wouldn't need a specific relfillfactor attribute. That would allow us to
keep CREATE TABLE free of additional keywords also.
--
Simon Riggs
EnterpriseDB http://www.enterprisedb.com
On Tue, 2006-06-06 at 18:02 +0900, ITAGAKI Takahiro wrote:
This is a patch for table/index fillfactor control
This is a good new feature and I'll vote for it.
I see what Tom was driving at with earlier comments. I think we need an
non-index AM specific patch, so that each AM has its own parameters.
So we have a new element of the RelationData struct:
void *rd_amopts;
Which each AM defines and interprets.
--
Simon Riggs
EnterpriseDB http://www.enterprisedb.com
On 6/6/06, ITAGAKI Takahiro <itagaki.takahiro@oss.ntt.co.jp> wrote:
This is a patch for table/index fillfactor control discussed in
http://archives.postgresql.org/pgsql-hackers/2006-06/msg00175.php
There's 4 shift/reduce conflicts which I believe are caused by having
used WITH... did you plan to fix this?
--
Jonah H. Harris, Software Architect | phone: 732.331.1300
EnterpriseDB Corporation | fax: 732.331.1301
33 Wood Ave S, 2nd Floor | jharris@enterprisedb.com
Iselin, New Jersey 08830 | http://www.enterprisedb.com/
On 6/6/06, Jonah H. Harris <jonah.harris@gmail.com> wrote:
On 6/6/06, ITAGAKI Takahiro <itagaki.takahiro@oss.ntt.co.jp> wrote:
This is a patch for table/index fillfactor control discussed in
http://archives.postgresql.org/pgsql-hackers/2006-06/msg00175.phpThere's 4 shift/reduce conflicts which I believe are caused by having
used WITH... did you plan to fix this?
BTW, I think this is nice functionality and definitely second Simon &
Tom's ideas. Thanks for picking it up again :)
--
Jonah H. Harris, Software Architect | phone: 732.331.1300
EnterpriseDB Corporation | fax: 732.331.1301
33 Wood Ave S, 2nd Floor | jharris@enterprisedb.com
Iselin, New Jersey 08830 | http://www.enterprisedb.com/
Simon Riggs <simon@2ndquadrant.com> writes:
Why not implement an array of option parameters on pg_class, so both
heaps and indexes can be given additional parameters? That way you
wouldn't need a specific relfillfactor attribute. That would allow us to
keep CREATE TABLE free of additional keywords also.
None of this should go anywhere near pg_class. IIRC the solutions we
discussed involved adding some sort of array to pg_index. A solution
that only works for FILLFACTOR is missing the point, too.
regards, tom lane
On Tue, 2006-06-06 at 10:27 -0400, Tom Lane wrote:
Simon Riggs <simon@2ndquadrant.com> writes:
Why not implement an array of option parameters on pg_class, so both
heaps and indexes can be given additional parameters? That way you
wouldn't need a specific relfillfactor attribute. That would allow us to
keep CREATE TABLE free of additional keywords also.None of this should go anywhere near pg_class. IIRC the solutions we
discussed involved adding some sort of array to pg_index.
Itagaki had suggested adding options to heaps also, so clearly we'd need
to add that to pg_class, rather than pg_index in that case.
PCTFREE would be useful for heaps as well as indexes, but there could be
other options also. Extending the thought for the general case, I see no
reason why we would want to permanently exclude heaps from having a more
flexible set of options when we aim to provide that for indexes.
--
Simon Riggs
EnterpriseDB http://www.enterprisedb.com
"Jonah H. Harris" <jonah.harris@gmail.com> wrote:
There's 4 shift/reduce conflicts which I believe are caused by having
used WITH... did you plan to fix this?
Thanks for pointing out. I realized it is a confliction between
WITH OIDS and WITH (options).
I'll try to treat CreateStmt.hasoids as one of the options internally,
with SQL-level backward compatibility.
---
ITAGAKI Takahiro
NTT OSS Center
ITAGAKI Takahiro <itagaki.takahiro@oss.ntt.co.jp> writes:
"Jonah H. Harris" <jonah.harris@gmail.com> wrote:
There's 4 shift/reduce conflicts which I believe are caused by having
used WITH... did you plan to fix this?
Thanks for pointing out. I realized it is a confliction between
WITH OIDS and WITH (options).
I'll try to treat CreateStmt.hasoids as one of the options internally,
with SQL-level backward compatibility.
There was some discussion recently about how we'll have to make WITH
a fully reserved keyword eventually anyway to handle SQL99 recursive
queries. I'm not sure if that's really true, but reserving WITH is
a fallback position we should consider, if avoiding the shift/reduce
conflict seems unreasonably messy otherwise.
regards, tom lane
Simon Riggs <simon@2ndquadrant.com> wrote:
Itagaki had suggested adding options to heaps also, so clearly we'd need
to add that to pg_class, rather than pg_index in that case.
Yes, I want to add options tables not only indexes. There is pg_index for
indexes, but is not pg_table for tables, so I added options to pg_class.
Why not implement an array of option parameters on pg_class, so both
heaps and indexes can be given additional parameters? That way you
wouldn't need a specific relfillfactor attribute. That would allow us to
keep CREATE TABLE free of additional keywords also.
Ok, I'll add a options array to pg_class instead of the fixed-field for
fillfactor, referring to the aclitem.
---
ITAGAKI Takahiro
NTT Open Source Software Center
This is a revised fillfactor patch. It uses WITH syntax and
we can add new AM specific parameters easily.
Simon Riggs <simon@2ndquadrant.com> wrote:
I see what Tom was driving at with earlier comments. I think we need an
non-index AM specific patch, so that each AM has its own parameters.
I added amparseoption and amdumpoption to pg_am. The amparseoption parses
options and convert them to an internal structure per AM. The amdumpoption
converts the structure to a human-readable text to dump the definition.
It might be better to make the result of amdumpoption to be a list of
(name, value) pairs instead of a plain text.
So we have a new element of the RelationData struct:
void *rd_amopts;
Which each AM defines and interprets.
The internal structure is stored in the pg_class.relamopaque column as bytea.
I guess it is not the best and there is room for discussion. I examined the
following ideas, but they had complexities and difficulties.
1. Add AM specific system tables (pg_heap, pg_btree, etc.) that may inherit
pg_class. But it will impact the current source code terribly.
2. Store the structures in AM's meta page. But heaps don't have meta pages.
3. Store them into an array of text column that newly added to pg_class.
But we hove to re-parse the array every time relations are loaded.
4. Add new system table, pg_class_option (relid, option name, value).
But it has same problem as 3 and needs additional heap scannings.
Therefore, I choose the as-is binary format to store the internal structures.
Any comments or better ideas?
---
ITAGAKI Takahiro
NTT Open Source Software Center
Attachments:
fillfactor-0616.patch.gzapplication/octet-stream; name=fillfactor-0616.patch.gzDownload
��D fillfactor-0616.patch �\{S�H�[�)f�uY�� ��+��9�lrG�\B�����d���~�=#i$c`w�{uTb��LOwO��{F-,{<f��,`�I�og��I���j����T>�N����Y�~E���}����,��Y`���=Vo���~c{s�5j��w���������k���� ���a�~M>���s�{���G|7zc�a?�/w���c�����B;<������g��i�;��1Ln�8����G��V���
}J�����������]����'������W�?h�����=�l���"a{8�E���x)�u..�Z'�^�=Ecl;��0#?�R��U�Eb�a�X�-6.�����l7�m�@�7��^l ���oy��)g��������o�F�-vgGS�@��"�.`�Y������sf8�����{��9���{�Q ,y���n
�����q�J��f�a���zdG/o�� ���������!t��l9������(������:0>0����V���sX�����������pj�l�.3��7�J&���*b��3n�c>���n>����C��`nF� ����#X=K��]�[�^�����%��d+� M��{!R�r�����1q#xN�5Vx|�
��n=�i�W�������xdY�wS:}`�I��]}{3�P��R=��cg��w5d���@6�>vVCd����$��WV��:����):>K�����-%��� �6�r�}�,��e��*��2��*2�5f��kxV��\ I� ����% yrq5 ���X�����OB���a�R*�G^+��]��n�Wm�yIb��rX�����}jYfnL<�t��
_S����,���~~j��;s����
#���gCPknl���?1��Q[�mv�������"�����%\?��Q�b���O��X� \@F�=y�]���������H��������l�9�����5 &���<B�@0h >�dXn���!�2����)@�bBATx<.<���\���~6^E���!�P�D�^&*�J�f�������������b�+���T�csb�������uXs�;����U����^���'X��o* ,^& ,b�c���r�ukJ"+�R ��00�&�p���!������Cg^���v��6��>�t��H��~��S{��D�,,��+�K��7�j�"4��Z-�198��������.3D���18&�#65B��1aL�.2'�WBI��M�&"��X��0W]�&^���3�=�5C}���� n1x��)%112���+��,������&���|2��LN�V����;�����e ��B����3�E~W�?����f*]^�����_ ��5�r��9rJ}U�����z}OI���z��;&E��6�4"���������<9\�n�M�0M��T�t���Sn����S��J}�X���E,k4�X�lB�����o�e��`E��i�5�� q�al�o��b{G�DS����Ox4<F�@�/�F�k�tk�fn;���uD}��>�O�>�.20�Md��}�g,!�S���v#���)
���{�e(�-�Q>�7!
��[g77��?3��q��3��R�&�P�������a
�t��L�C��PG &�����9�;P.C��kX����x| ����6J���P�.�S�#vr�F�����h��W[��r*����=b?d��/��L-,�y�[x������;r���y�9�3��?.��t
�Y4�1!`bd ��lKi?bZ�Z��n�����X�+�!�p��I+lf8�o�����KRJ����F����=�:b��� ���r��[�Hm���+���2^�@������:����V�M9�rg\�qD`
:r\(�q��!�#v�v��%�&)(z��%w`�hi���t���h�o���
��'[mo ~�;����� r��+����e�g����t�k���E��y���,��*�����]R~�������������L�r���k��1�=�?�lgY��t[!Ld��0B<Jcyp8��K��<:�g�k��'x|T *)����FM��c�f45$�3�2Z�� ��\�
�����U�d��uG��� Af
"Z��i��
0n�0}����e���d�\�, ��
�eML�~Q�64�������1�@G�D��^a����Ti�D�v�������y������w�u�?����\u�W���D7��K��.x;O��)���b� �J�J�!p�o���Q����\�W�5wg���%d]<�@�<�l5�6d\)fuw#�X��I��\1��bG,���
C�^������c)�9E!�d5�Mlm�[��.�SO�&��!Q��l��1+�`� �@�E� �HfBJ{e���q��f+�|�C�,����O8�t�1.c��=����z8*����2
!��He�vR����>����1`{�3� H
�b�8��j�����vdC����, �M}'�h��=Q���Y����KB��
�M���2��Z��(D��G������~�p�i�}4����������e�{� �vb��� �`d9#��.��0T�M�Rd?��Ep'<M���HLG�4m�AY�R,N�a�b�������S29���X�P|��(�[�F#3�d��+,HLdQ|�k��xs���=1��rf�8�#��JA�����j��^��zc{/^/0����$�TB7����G��7a�(� ��9C��,�/��3
��>�K��%����zrl��D��KE*Z�U����l�G�MP�N������������T�����"��sE��Cd�d��pT�]�����D_�����
�=P���hQ�K���p�����"$s^�t���r?\����-z�����pM�dL{����e ��e~Y?F�:�����\�:tV���
�k����������gY�� ������9idO����*�tJH1LE�������rS������� ������O��Yg�;�;��pg-�p��I|b��C+�yz��r���r�y�
2K��j��I�Fb��� W���O�%V���xv���f:��99�+7��RY���|��x���%;k������(q�d��/��a�(� h���o|����Nf��� �����d�#�D��9�B{���,�����E/�j"7�cL;��m����f�tF���o+�f!g������Tn%�X�b����"`{oS�S"!^&��p��}T;�q6��)����_��+����� �c���H��v~�;��3H�C��<~/Oz�4��;�C\��"~I���]�-*R������J
�n��jW��/��3?h�G���4�=���3�[~���Sr*\���"�
gR?X������i��uu1��4m����������k����'./=���
�}�x��`����0��9l�F�� �wD�I�����i_(
��ST���
r���^��g��d0�w��R�Y^i��v��9��+����s^<��!����A�'u5�pCw�4���Vg��y�s�fs��o�*�kL�`+
fX��E�K'�6'����=i�@���B��BY/J�*&���"z���e|���E�I��ptF���������b��*bJ�/�'�|������IV( %T�\�X� V~[������������'+y����#^���T��g<O��9[J2��g�M�hd2�����f���S��F��l��
��?�L��o�O��*�h�F��*sXX��Z��
�&�NM-�0�����t<L�]�;�h��������������Umtj�S�@R�l4�q��x��.���FE(��j���M�N��������!0�oLKE����V�eBj�S�����vh�k{�!�� L�q'A�n'��>�Xs��v��F�����1��x%W�N|@��_w���<��)� 3����EZ$�=�\���w�;���h�e���d�@�6$]������#����F��f�3Q0!��8=Mywq������6Y�mU�#e�@�!�|�A�`��:�1�0�v�#,�_����
������O��Du���3����]tY��~�>��:��u|���g ���Rx����W��^JQ0S!I�;�z}GA,j��Z#�A0��.�.���3�6���(`X��P`!@t�������#��L��
�����n�@'�cZ(���"��v��)���R�0��d3�Vqc��K��1���&��|<��j����_�e��������=���c��T_d��|C��]��B���8�q�|!�������t'F�F;O��c��,�M#��<e���`I:�����G,�F�\ W*^y��
lo���>���� ������EQ��������*\����F��qS�NHE
�1������D�t��{���[R<�m�D��A����xUR�8���������� �� <VH�q?��������d�pmM>��x_<���DNv����'��\�B�T�Va9vB_r�i=)��Cw�@�}d�+4�N$F"��Zj�9\����OB+��J�t&�=.�������>��K9q����p#&y������t`ot����W��l�wv<��"C������f�6}���fc7d7D��������]��#���r�T����G���lEwD k�&h.j]�rg�����gVJ���|}�
K�"w��m��D6����l�t�W>���ID�P(��e�tO��W��]?�Q\Ks�[e���K��R�TJ��Qn;x$,�%.��]�����Kg(�k���R2���Y�{��E4�s����[I�D$�/��7��s��"��{I*����E���~�L��������������:5���/����#rh���P �.����"a*��lX��>C���\�3{�&�7o���!��C�E�?�������(&TQ�%,M���"���� %4�=&|����^ ���1!T�m��6���{�}�N�kz�)���(�A@':��7$��o�|4�ixT>����CQ�'�~J)3P�;Pt�������?#T�-��������j�>]�uzI�^�
<@D5p|~G���S���3�u���K\�Z�q�����D�Q,|�R�k
8X�����/.c"�=��2����oa����gRX���@�����0� �Z��Q>x�q��p��V���t�v��
~-�r���}�
`9�I0�������9 ��:�7w�%Bz�����*�c4��}����#��Z���6��_]_U���T��j($�/��j5O�U�6���d�����g��<�4>+�/���Hc�H��d�4|6�Q`B�`��2
6dJR����� M��������GH�2�L�t%����J8^����a�%H��- e�N�R�(����8:�G:�J��!e��8�~X��$"�Z�ph�LMq�J
Op��i��B�t�F�-�����^�� eD�!��$�P�U2�<,�s;E���lZ�U�����p�8�WO2�$YO_m���I�!m�,�9�d�6�Kf��3y�/�f Y4���E�O6i)��YE�g��s���c�����|���_u��'���R9���g~@G������^���O����i�1l�>�;Yn]��*x.|�W.��Z�L}�:�Q�e�[��!@S���0M�r�j��T�2)����*h�Z�����jC�7��\�[���^�VJ- 9��6���%�J6����:�
>����_ �i��R(��^�N>B����M����J����������8a�����I~.����G��x8b��}�<�a������3=]�C���*���m�K��8�E?����g[ 5��/R���d^K$MRv������fl���j�u�g0�"��Qb 3�kuuuUu-��[�P�T��|u�m���8������/�����N���N
tL{E���� ���s�T�����B�M�b���8J�Z��l��K���gr��U����*L�m��'�����C�j=������r��b���n����x����%���">��QyI�`z���'��=��<�I{�6�)���q����Imc�-N���f*����A��K��Yw��z�s�?�}]G�
�f:-�\G'�/�L�G|����A�Q������aLr�jG��yA-�Sp��������%
�_������s���p�+��L��>,�kK����2�����-��L5�W �O���������S�'0���wp+U���u�T���;���U�����v%��@.-�]��0�|r�a�&��7�������H��P�8rj~���l d�a�2��H���E$+����nh�}iW'Z`L ���#FJ�������|�9d2�SZ� p@{yU;�k���~����P2� j�l��mdv�OJ
���WxC���U3�������lM���P�-�rAJ*��X�]�d-e�����\��3
��,�����O����=������ �"8�R������F�n�A FKc
s�����"}��R���8rblXh���`���+.��!K�3�:��d�U���������jp���C����3���b��"������:���DV������Ps!c|�#Q(�(R4���l9���FN0�H��#c�����L�!�1�H�0����^�6���h;��)0H�H��_%m�����@=����R�J�[I& 4��O!�:�F X5 �\�xl���P��!���zg<�}�C�����
�\�?)^[P"
��9^�&�-i��)��Y�&�1�G��ZEKn6� �L=!lv._����
8�1�g\
��6���/dkQb5v"�������8����b�5.����J8�S]P�'l��
@�~��a�*8e�����!���6�6{v�Y��d�H��k�Z��Z���g�nx"/>"�
�(�X,�783w���9=|����������M��
p��6������sC`�S�=>��(U�A�T�S=����WJbF��&����a������]G�Q�B�{ 3�M���?�I�J>7���Olv9����"�f<G������k��.d6#�<�������SOa������z����2��^��� ��
�R.�a5������"oXc�)`Y[�t8M0�"�;1��:}-��[D7�g�:��b��
5Q~Vqj6�Y~j��0sO@0j�+�>����c�}�o*�5���z��8�h�^��H%�7��
}b�d��uGpX�8^��5��)��\��fy�).��4�Un-K%�Y/I5����a���CI�/,Yf��������@�(���J)(Wlw�J^4��}�cq�w1b���(�
�;�wb0H!��|E��i
����x�s��L���EJ! ����cspD(l��S�5{>b�JR����h�$�G��z�4qX�� M�C��gl�1��c�������@���G�R�+0m�B����R��F���~��G�A�CL�*Z!�! R� ����'g�
���rJ@���\��o���s5�W�n��H)-�����t�����b������j@����Y�l�m�������
tzx����,����;��e&�Qj�(q1��i+9,�J5b�d�;����T�#�u��!�w��>T����+�E�8a
R ��
����U���*��W��&��:��B(g�9�C�h�q��z�����Y��F
=�*�M`S�CD��Bc�@g�!�PT�
��|�R����w��@���@�@<������W����� �e���.�]`�1����������T��u�tBv�)�������Xm����
�E@����2QO1�-�s-�!��6���������`d��XY��<���ls���x'9 ����+J���F���-���r��`�<a'�h���tX�DI?�( ����n7����(q��R�?4 �&A*�N�g��T���.�i��X~���S8�������]����_�=�T�~��"�����X(2Z�^�)�U8�k&d�Z��1pz'��E���&O�!EvP�
@�`��Y�T���l�%K.�NAL����`�i���.�:�y��������+��iF����w�k���%�m�9����{�Ao�,�V�=�6��YZke\/����t������_VS���{�"����Dme�.(���%�f)�F�����OZ~ `������r�|*�X ���=I4�,���H�������^�{�A����"_W=/1B����?�"�r
���x��l%]��� �c�ouD1��������Z j40���M������A|@.�UJ�
�z<���0�7a9(`C&�p"�����Q��P��?���dB*���Y=�h���p�V]��\�y�}�}��p^o����Z�
��/B���������
�u�\�nm��d����%{�<W��]����p�I�L �3����d�[�[�>���"���_V�ui��J���.�5�,�]k�w�,�ZPi%h��G|��^���)�����������~zm8��v=C^�
K]���d��p���ND�Q&���L��04�L�"\������F�h�p���"�� ��x������N����O��sm�g�?�&f�v��,����"$���1�i�s"p��9��D�5��sh��
lt��>�����F��=��v���px^)�$�0�s�v���������/�qEz��[.w^,��M(G
���������s������b �����Q�pHJ}9Y�&YK9e��kRb������^5�q9 ���T�4`E���a>+%�}���_j��#�%t��J�u���py8(��jxF<�z�
Kf������X��|����pB���d
����5?B��?�[1�h��F��\l����fL�$�+s�#[��G�W�Bfk�?G��D��h�&q�%z�)�W&�^H�IY��� )�=�Y��e�RF$m��e�;�W*��3���: �I1��j�J.���d�4�G;6�
yp����`��.�/��=��h���@�Gk�Q�������v~2F:W�VZT."]��d#(��F�J�p��0
���N������6���Y����E=��:��c����lw?��$i�������N��7�R���j�A��2T�{�����RI��-Q�Iv��h>�0��]�nJ*�r���8���%�p���M�jOu������j3�Y����$_�V��=Q?r3�^����No��,v2��8����o��"�Uj��R�;LRt��]��7���L��7cs��x���������`��KCOm ���>����x�v"h����K��)"�# A�� VG� *8$�����%KxX���Y���������R
g��J���Y�C���E�"�x�V"����������r_Qg�N�|����2S���q'M.N'�(�/F���:�v9�G��;:b �.�I�&_o��z�a&_o��E�2���Cq���G��d�^��H7���l�G�����!e�K
�P� \|����l�V��"������F'��T�5��%�z cb[jx*�V��`*-��l����V�����=�x
��U�`�
�
�6nmuhU����2E�������Fu�`��3��1�+-�+5�� u^����l���T'd6B3|���U�nl�%v^�'�%���4o����<+6$����C�C�*�V���Y�Xh ��(����r1
�(w� �_��%�a#�����8 �����uD�d���Q���'����� �
�NE�P�nnKV|�����@]e�8'��w�x6� r�y� !&��n�;O�U�n�����o��'����NU���C1����sY'�����tt��3Y{�0� b����)�I�`�Rp��#��� �X���6��U ��e �c9U���)DN�����W��G�6���hj��d�h�j��d���J���T�n�T}���Pn9�J�JTJ����������"f��=%��Af>���b���[R}����^z|���c����&����(�� ��cBf��Q��E�EBN<����x����$�WL 9e:�b0�WX����x�zW���=L�������Cyw���d�<��a��B�������
I!�X`U���c(��J,\���$�:E���Pq��#O7VU_��YH���F.���� 5��K<�������(���S K��b���6�0D��l�����o ���K�2<�<�|R�<gp
���1�V�B`@���y|k)]�����D>*��l��d
�e�dF[{�y2a����b �6��C�� � E�|���b N�|��W�M�;'/�x�41�ea^o��z;��^�F�����7�#�-�����d}������Q�� xM��[�pH,E���L�m��)�P&��W ������'�d0�.�F��������!�XU,K�YN��Phm.H����@����/���[�I� hQM
�,�fv�6v�b���Eh���V$v�t���B�&b�GV%Z�;J����G�����T
e���}�%^F��=M2?�����*���T�o�o����������D�K����f�,2d�����(`Gr���:�
��#��QG����4s.�J����o)�U([�X
����x.���������h+R>����d�r��S�J:b��-��N~>8���Ge��t4�o"�a��f����&�P#:���tb*/�GA�B*�#f����F������Q����=.�^
XY��S�I�,�=.�� >��e;�_�Zvb�J"N{�<���Sa�?���z[�&W-�*�jX��zt[|Pmm��������i���7�m@����q'�Sd8����:�%���#Z�����1��&s�ZPiZ�v)��l#d=
���i��
)*��������?�����fW��eL�x����oh�����Uo���p��[fb��gCQ� �E���"V����?���y�_���F�M3� �X�S�*��(��l��t��EP�w���/���K�h6��mi��T���>|�T��qr%�:G���:�?���?�q��`���]a_8��V4�2�t����� �M)3*����d��t)c'
9�$lUNH��s���>`�;�b�!nl���`�����yo�T�?���`a�n�#�
�� #�G'�T�8���0�BYc��|����y`�t�|O@E�����2�x}��G�c��[����C��14����-��|y���^gC. �c��#����/_��+�����m���/�0{�F��$6�_a�m��8��`����O�X1���o���S�~�^w����;�j��JU���W;����c���W�N��c�M��[�V�@�.��I��U��\e^6_�)���6L�n[�~�Q��x���?�*��&��P.��K���{[�&�]�7X����|@7�5YbT`�a����n����O/\_�S��������������N>�q_3%r�C�)El��Y��8����:���/8V� T�9�k�����K��U�P��{+�� v=8�9���0�M�5s�(�,J���i�-K�<� �_�g��-� �T8�l�3�r!�)~c�7���LsOd��t��h�"cJ�JA�e�AZq���5�g��hz�(����[��!���M��|.��?A��i������{��Pv�P���XEM����E�L������N1�����B�`��l3T��Y�p�+%.]�OY��(� �U�,h�����#K,����7i��� 8]����O�yH:�7\�P����1:����*���cr>���l���E�%�_��S����f�����Y�D�cT�"��x����
������������@����������&�*F����p��0��H����7O�����������7���Uf�Yi�*����������u�O��c&i�����V���6���5h��)W�-r���]�
�dd��+X��d0���a��X���_8�d,�6�������/Y�s
K��*�RH{x��l�Dp��� !�Q�����k,"��%�q^��
�P�R �3�c`�X=k��5f(�&hP<Q��j'��sz8
�b���=e#�����kXs��V*����"��!���< ���(
+|���o�C�3}���6�&�|�:W����mH�3�(��� ]�9�j�?���kFN�M��8!x���L
�$�O�Gd��1C��c=���X�7�h����_�U��J�������4�A�eYcUZ�����"����u�������)��wg�\0��`0��n��H�b��|�83�bPu4��.("��h�w�����`#K�����v��6JA�
�,z��^��V�%��x���i���e8�k#��3��I&��x��ef�t��� [���������e(J��%]��?���> �(�Va���=��M�1��� �j�k�RP�c��*��V�\�(���BA��H��eM<���,�,OZ,�(���_�8��tx����&?��ptx��%��S����OrtO�[�Zg$��"�%Ri��L��u=��j����s������7��z�j�n���(�Q:�,[ Id���ZM�?�r�c���j9�U�>�{3�G�n��WWX��\����2���x;4(������W�K�0�z�g�)'/�:�����<�j�<��H���q��v��R���km�� $����������5Z�_����<�}q�=���o�'G����9�Y������"�xd
�B���N��c���c�g2�y���������=c��0B���`�!�'�"�,I������-5����nq� ?�7aU�`�
��8������!���C��ed�G�N� WP���y�=�����&!������|z�}@s�oE����s+�V�b��T�-��t2�3�ipd�� ���KS��E������[��Nh��������N�A�TN�Ewo )�yr�E�Pj����P�,��6�������7�4-+��5v��|��� &Z���*78l��B��f��7�e�k�K6�V�������-7�/u��q�nnY&�w�$*�SyH���u�ST�5����r ��`=A�J{������6���i�x������]�R ��y�fW�p��(�I�����*�� �fx�T��l^���rz'L@�E�8K/���H����_�o��H���qQ}e��B$�5�_��q�t�r��a:
����[RD����V����GCj4������P��h���M5�&���{��]w�{��9���������Q����3��u��BX$��K��S�
d�������{��8�����}�Y��!���(*�.�o����"��N$�_�d�E��B�����2:��Gl�B�����^5|v�C�:�L�P��Z Y��j�T����?�k4h�.���NemWj8�����`p���5 ���*���[��X��\�5�L����O�M�Q-�F�~�-bK��A����7�r�E���e;��
�*"���fC�L�N�?
���O#+V"��5;��U�a�����p'?!�I�����pgCB��w��H��������������B�AR ����&��7�{d��}��a_!E;�}���y�f$��6��=`�R,Jo�v6��x�%QhV��f�v�*��f;-s�E����2S*G����WN�[c�8��L��|�P���a������W��hK �d��N&SOJ�����1�i'7Sy&Aw��k��U���Z����q��>9��T�tO�d5K5�]$�PGt8H
�F����� ,�G�'F�+V��Z����2��* r:^��H����ci�D1ek�����������n��JL��/d��X[��RB]�x������������8�]��D�zJ@��A\X��A\�I����%�T��@<��v@�6b���t51�����;��O�����g����*)xi5C���YQ��#��G�Gf
3��Of�����<[�h��+QE���TJ�$p��ls���Z
��j��b�ZAp�����{�3�i�;��<[Q-�PG��8N��#�bf���m"i�9vm/�W�r���:�M��Z�\e)�d3�)@�L���0cy4�$=i��j1�?�<�"A�2D��Yb����82����Q�����&s�"�@��H;��`?�W�w>�������={{c$4����H����F�\�/����6�R��Sk2�H�Q�dP�6C[>�hZ�@l���<�#"